@jshookmcp/jshook 0.3.1 → 0.3.2
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/LICENSE +661 -661
- package/README.md +11 -3
- package/README.zh.md +11 -3
- package/dist/{AntiCheatDetector-CGVGNfy5.mjs → AntiCheatDetector-B6d4Qe9D.mjs} +1 -1
- package/dist/BrowserSessionCoordinator-BJ-HOxo0.mjs +1 -0
- package/dist/{CodeInjector-BlgyqTOk.mjs → CodeInjector-Cll_7bLJ.mjs} +1 -1
- package/dist/ConsoleMonitor-CxDJV15E.mjs +306 -0
- package/dist/DOMInspector-C19J4zeq.mjs +95 -0
- package/dist/DetailedDataManager-DmQ1LT-W.mjs +1 -0
- package/dist/ExtensionManager-BD724zkO.mjs +1 -0
- package/dist/ExtensionManager.tools-oVMJgPcN.mjs +1 -0
- package/dist/{HardwareBreakpoint-OcJqNFVc.mjs → HardwareBreakpoint-BUfPdp0f.mjs} +1 -1
- package/dist/{HeapAnalyzer-CqAxZzeS.mjs → HeapAnalyzer-B_aqY8oj.mjs} +1 -1
- package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +1 -0
- package/dist/MemoryController-X1XNSn1n.mjs +2 -0
- package/dist/{MemoryScanSession-CaxAjZJf.mjs → MemoryScanSession-DG_F-PjE.mjs} +1 -1
- package/dist/{MemoryScanner-BLYnMJy6.mjs → MemoryScanner-g1_L1ub5.mjs} +1 -1
- package/dist/{NativeMemoryManager.impl-CI554XbY.mjs → NativeMemoryManager.impl-DniBe2wf.mjs} +1 -1
- package/dist/{NativeMemoryManager.utils-DM4NC3FE.mjs → NativeMemoryManager.utils-BHy1P_jM.mjs} +1 -1
- package/dist/NetworkMonitor-B_-au6aV.mjs +185 -0
- package/dist/{PEAnalyzer-DJyaJTQJ.mjs → PEAnalyzer-yWQaGrcx.mjs} +1 -1
- package/dist/PageController-Dfsm1_o7.mjs +1 -0
- package/dist/{PointerChainEngine-5nF9eNlu.mjs → PointerChainEngine-BhCUkmxY.mjs} +1 -1
- package/dist/ProcessRegistry-C-bN48oR.mjs +1 -0
- package/dist/{ResponseBuilder-B2lu4KEl.mjs → ResponseBuilder-BfWP-uaT.mjs} +1 -1
- package/dist/RingBuffer-Dm54ELKT.mjs +1 -0
- package/dist/{ScriptManager-fgqiALgj.mjs → ScriptManager-LWGPTdvD.mjs} +1 -1
- package/dist/ServerRuntimeState-D2bWHqEE.mjs +1 -0
- package/dist/{Speedhack-l6s8L2Qw.mjs → Speedhack-yseDPSZ9.mjs} +1 -1
- package/dist/{StructureAnalyzer-A-WamfYE.mjs → StructureAnalyzer-C5lpuZkg.mjs} +1 -1
- package/dist/ToolCatalog-CYdD9F5f.mjs +1 -0
- package/dist/ToolProbe-C7ZU2x7M.mjs +1 -0
- package/dist/ToolRegistry-C5oB8KP8.mjs +1 -0
- package/dist/{ToolRouter.policy-CFHoN_Lw.mjs → ToolRouter.policy-CfhJczkt.mjs} +2 -2
- package/dist/{TraceRecorder-Dd8jLXpi.mjs → TraceRecorder-BiJWBXHX.mjs} +1 -1
- package/dist/{Win32Debug-CQteFL4F.mjs → Win32Debug-CYrIQBvr.mjs} +1 -1
- package/dist/{WorkflowEngine-CxEp2WXH.mjs → WorkflowEngine-D876meOO.mjs} +1 -1
- package/dist/analysis-D4swdMvq.mjs +6 -0
- package/dist/{antidebug-BOTZH6-0.mjs → antidebug-7L3ygj_9.mjs} +4 -4
- package/dist/apk-packer-BqXcInnX.mjs +1 -0
- package/dist/{artifactRetention-NBdncOEW.mjs → artifactRetention-BCPQASm7.mjs} +1 -1
- package/dist/{artifacts-B5xQuEa_.mjs → artifacts-CkodUM4j.mjs} +1 -1
- package/dist/betterSqlite3-Brtq-SIQ.mjs +1 -0
- package/dist/{binary-instrument-Cf9qqLlM.mjs → binary-instrument-DU7V6TUM.mjs} +1 -1
- package/dist/binary-secrets-PdMVoyt0.mjs +1 -0
- package/dist/{boringssl-inspector-BST5vtKx.mjs → boringssl-inspector-BBaJwwkU.mjs} +1 -1
- package/dist/browser-Qqco2rOT.mjs +11 -0
- package/dist/collector-Bpl6qy2L.mjs +1 -0
- package/dist/constants-BYj8Xek8.mjs +1 -0
- package/dist/{coordination-BbijHEHH.mjs → coordination-CWXW1o8K.mjs} +1 -1
- package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
- package/dist/{debugger-CRJq_krh.mjs → debugger-DyALjYMk.mjs} +1 -1
- package/dist/{definitions-DZ8uKusP.mjs → definitions-BWxBke3r.mjs} +1 -1
- package/dist/{definitions-CYFbewnd.mjs → definitions-BYwATKc-.mjs} +1 -1
- package/dist/{definitions-DJklW2sS.mjs → definitions-B_83XfNQ.mjs} +1 -1
- package/dist/definitions-Bf3H1EwV.mjs +1 -0
- package/dist/{definitions-BGobEDQa.mjs → definitions-BftdXgXI.mjs} +1 -1
- package/dist/definitions-Bio5XJYy.mjs +1 -0
- package/dist/definitions-C3qNgSn1.mjs +1 -0
- package/dist/{definitions-NoVp_9Pm.mjs → definitions-CB6vmOer.mjs} +1 -1
- package/dist/{definitions-CoQFbggH.mjs → definitions-CMZRSy3k.mjs} +1 -1
- package/dist/{definitions-DI9YXsJk.mjs → definitions-CQd7yCQH.mjs} +1 -1
- package/dist/{definitions-CIO9O-Sw.mjs → definitions-CT8ln6GQ.mjs} +1 -1
- package/dist/{definitions-BGwNSkVm.mjs → definitions-Cenu6mxo.mjs} +1 -1
- package/dist/definitions-D4g-MS10.mjs +1 -0
- package/dist/{definitions-CuJRsJ6N.mjs → definitions-D5wl_8HN.mjs} +1 -1
- package/dist/{definitions-jXPaVy4P.mjs → definitions-DAQm1Xar.mjs} +1 -1
- package/dist/definitions-DP1vgxEY.mjs +1 -0
- package/dist/{definitions-Dds_zrWx.mjs → definitions-DxFNRQNK2.mjs} +1 -1
- package/dist/{definitions-DtE0XLrT.mjs → definitions-Ibci7e_L.mjs} +1 -1
- package/dist/{definitions-CCP9gphV.mjs → definitions-OeLvmlQy.mjs} +1 -1
- package/dist/{definitions-BbxOUiP-.mjs → definitions-RZYGD_Ey.mjs} +1 -1
- package/dist/definitions-Tls8c0A0.mjs +1 -0
- package/dist/{definitions-LaYTuwQd.mjs → definitions-bybDvnG0.mjs} +1 -1
- package/dist/{definitions-Dgrg7f3D.mjs → definitions-l7TjdE6V.mjs} +1 -1
- package/dist/{encoding-DGcr6Aj_.mjs → encoding-ycOaz8Vr.mjs} +1 -1
- package/dist/{ensure-browser-core-Buls24LQ.mjs → ensure-browser-core-DxWC-NTp.mjs} +1 -1
- package/dist/{factory-Cx_1LorX.mjs → factory-CKr4fAE1.mjs} +1 -1
- package/dist/{graphql-HLf3MS8H.mjs → graphql-B2TiPEow.mjs} +4 -4
- package/dist/{handlers-D49r1-1P.mjs → handlers-8zN_vBIz.mjs} +1 -1
- package/dist/handlers-B62K4FTc.mjs +1 -0
- package/dist/{handlers-BZoPla6E.mjs → handlers-BpDlVVVU.mjs} +1 -1
- package/dist/{handlers-DmQzIc44.mjs → handlers-CMJK7m1c.mjs} +1 -1
- package/dist/{handlers-BLMa4X7l.mjs → handlers-D2ZOul9p.mjs} +2 -2
- package/dist/{handlers-DW5AbYs5.mjs → handlers-D5E40ssn.mjs} +3 -3
- package/dist/{handlers-BP12ZsWc.mjs → handlers-DGbdQAgD.mjs} +2 -2
- package/dist/handlers-DHO3rjsW.mjs +1 -0
- package/dist/{handlers-DCE45Ww8.mjs → handlers-FJ80VzUI.mjs} +1 -1
- package/dist/handlers-VHWrxbM_.mjs +1 -0
- package/dist/{handlers-BggKiVx9.mjs → handlers-l8QIKqBj.mjs} +1 -1
- package/dist/{handlers-DnJRGp7t.mjs → handlers-mPFiNPe8.mjs} +1 -1
- package/dist/{handlers-pVNpaw4A.mjs → handlers-yo_xYzT8.mjs} +1 -1
- package/dist/handlers.impl-D9Hh8Bgl.mjs +1 -0
- package/dist/{hooks-DDKppogd.mjs → hooks-D4XLfgtV.mjs} +1 -1
- package/dist/index.mjs +11 -15
- package/dist/jadx-search-B_Yse0Zh.mjs +5 -0
- package/dist/maintenance-BUpIukhg.mjs +1 -0
- package/dist/{manifest-yu2xiQqe.mjs → manifest-0Jpt_AQa.mjs} +1 -1
- package/dist/{manifest-DMJlcsTR.mjs → manifest-B3fZbSWR.mjs} +1 -1
- package/dist/{manifest-De-6Wf2R.mjs → manifest-B7NB2rh2.mjs} +1 -1
- package/dist/manifest-BDi4nbH1.mjs +1 -0
- package/dist/{manifest-ais9Afrw.mjs → manifest-BLDfkE7n.mjs} +1 -1
- package/dist/manifest-BcXbB4gf.mjs +1 -0
- package/dist/{manifest-DsVh7Y4U.mjs → manifest-Bdnc_vrc.mjs} +1 -1
- package/dist/manifest-BuYKgCnp.mjs +1 -0
- package/dist/{manifest-Cx2IVMUY.mjs → manifest-CBfNnGPV.mjs} +1 -1
- package/dist/{manifest-DC-SMF6b.mjs → manifest-CPS1Xv69.mjs} +1 -1
- package/dist/{manifest-CGq4NpqH2.mjs → manifest-CQH9FhwI.mjs} +1 -1
- package/dist/{manifest-CRIJq4Hs.mjs → manifest-CRryuZF4.mjs} +1 -1
- package/dist/manifest-CctIumog.mjs +1 -0
- package/dist/manifest-CvTe5ZGV2.mjs +1 -0
- package/dist/{manifest-H-EpAyZQ.mjs → manifest-D-5GH0DV.mjs} +1 -1
- package/dist/{manifest-CtPmHAdn.mjs → manifest-D3Ssf3IC.mjs} +1 -1
- package/dist/{manifest-BeP_zJGb2.mjs → manifest-D5ck3NvC.mjs} +1 -1
- package/dist/{manifest-CeQmtQOY.mjs → manifest-D9jUUJAu.mjs} +1 -1
- package/dist/{manifest-C7qV1z7F.mjs → manifest-DCx6w2XV.mjs} +1 -1
- package/dist/{manifest-CFn0359q2.mjs → manifest-DG19q-Ld.mjs} +1 -1
- package/dist/{manifest-CJMGt7Qy.mjs → manifest-DLMlD0Zc.mjs} +1 -1
- package/dist/{manifest-CDeUZGUZ.mjs → manifest-DYpn8w_h.mjs} +1 -1
- package/dist/manifest-DYzWI8Xs.mjs +1 -0
- package/dist/{manifest-DKUorv5M.mjs → manifest-D_obs5F4.mjs} +1 -1
- package/dist/{manifest-D610kxZr.mjs → manifest-DujQqEQR.mjs} +2 -2
- package/dist/manifest-DwL2ik8P.mjs +1 -0
- package/dist/manifest-ItF5P8A12.mjs +1 -0
- package/dist/{manifest-tmb54wmA.mjs → manifest-KZphqIyX.mjs} +1 -1
- package/dist/{manifest-BPuE6oH2.mjs → manifest-LG42zPLY2.mjs} +1 -1
- package/dist/{manifest-D44TaRJU.mjs → manifest-LLdI5m4T.mjs} +1 -1
- package/dist/{manifest-Dgh0uDW-.mjs → manifest-QYbQXJn0.mjs} +1 -1
- package/dist/{manifest-BFGxlDRh.mjs → manifest-RcpX_MyZ.mjs} +2 -2
- package/dist/{manifest-CDiCtaQT.mjs → manifest-YgVd8Sgz.mjs} +1 -1
- package/dist/{manifest-D16xPXro.mjs → manifest-Zy7Odg5J.mjs} +1 -1
- package/dist/manifest-ff1H7Pdp.mjs +1 -0
- package/dist/{manifest-C_hEIjSx.mjs → manifest-iuhF6pTL2.mjs} +1 -1
- package/dist/{manifest-DWUUWBz0.mjs → manifest-nXHmtMSp2.mjs} +1 -1
- package/dist/{manifest-C1nZkTkO.mjs → manifest-xWfu6iLo.mjs} +1 -1
- package/dist/{manifest-C0g67k6U.mjs → manifest-yC16OhL2.mjs} +1 -1
- package/dist/manifest-ztWJoXy4.mjs +1 -0
- package/dist/modules-BPBcSaM-.mjs +333 -0
- package/dist/{mojo-ipc-VGlv3Qyp.mjs → mojo-ipc-BhwsdVUW.mjs} +1 -1
- package/dist/native/scripts/linux/enum-windows.sh +12 -12
- package/dist/native/scripts/macos/enum-windows.applescript +22 -22
- package/dist/native-j8l473zn.mjs +961 -0
- package/dist/network-T0VRwNPd.mjs +7 -0
- package/dist/{outputPaths-BonGThuc.mjs → outputPaths-B4Ic4RZh.mjs} +2 -2
- package/dist/platform-CzaQtISh.mjs +93 -0
- package/dist/process-CWhsCWrf.mjs +2 -0
- package/dist/proxy-DZFlDsG3.mjs +2 -0
- package/dist/{registry-DUHIPE-v.mjs → registry-DH4sc1dt.mjs} +1 -1
- package/dist/renderer-pid-9tJnZ_9N.mjs +1 -0
- package/dist/{search-defaults-D2bY-rzH.mjs → search-defaults-lYBVn_3L.mjs} +1 -1
- package/dist/server/plugin-api.d.mts +19 -36
- package/dist/server/plugin-api.mjs +1 -1
- package/dist/{shared-state-board-Cyg-xh_k.mjs → shared-state-board-BSjXLUV1.mjs} +1 -1
- package/dist/{sourcemap-D6Q1UuAp.mjs → sourcemap-Dh3Ai_ur.mjs} +1 -1
- package/dist/streaming-BcJ0B6ao.mjs +1 -0
- package/dist/transform-DOxzeWPB.mjs +103 -0
- package/dist/wasm-CZ_HTfKR.mjs +174 -0
- package/dist/{webcrack-CsLLJIs9.mjs → webcrack-C1iYG_EX.mjs} +3 -3
- package/dist/{workflow-CYIXtrWD.mjs → workflow-BdwQmARn.mjs} +4 -4
- package/package.json +16 -15
- package/src/native/scripts/linux/enum-windows.sh +12 -12
- package/src/native/scripts/macos/enum-windows.applescript +22 -22
- package/dist/ConsoleMonitor-Dkqc0HNi.mjs +0 -490
- package/dist/DOMInspector-BYY_EJ0C.mjs +0 -95
- package/dist/DetailedDataManager-BniBJlVv.mjs +0 -1
- package/dist/ExtensionManager-erMpqcLk.mjs +0 -1
- package/dist/MCPServer.search.handlers.domain-DVbWL1bT.mjs +0 -1
- package/dist/MemoryController-BaqstM5w.mjs +0 -2
- package/dist/PageController-D9jVkH0i.mjs +0 -1
- package/dist/ProcessRegistry-Hf12LlR9.mjs +0 -1
- package/dist/ToolCatalog-D_IKl1Hu.mjs +0 -1
- package/dist/ToolProbe-xsfALmN3.mjs +0 -1
- package/dist/ToolRegistry-B0Zs-phN.mjs +0 -1
- package/dist/analysis-BuR-NgX8.mjs +0 -5
- package/dist/betterSqlite3-CGaxz4AX.mjs +0 -1
- package/dist/browser-C4Le3xqA.mjs +0 -11
- package/dist/collector-CKO8RPK8.mjs +0 -1
- package/dist/constants-Cp6hBrrx.mjs +0 -1
- package/dist/definitions-CdWEuIkI.mjs +0 -1
- package/dist/definitions-OvGsfxdt.mjs +0 -1
- package/dist/handlers-D3iev8g1.mjs +0 -1
- package/dist/handlers-De5u62Ga2.mjs +0 -1
- package/dist/handlers-S9Ws0IGy.mjs +0 -2
- package/dist/handlers.impl-CD2_kOcC.mjs +0 -1
- package/dist/maintenance-CutEO84j.mjs +0 -1
- package/dist/manifest-BXry5N09.mjs +0 -1
- package/dist/manifest-Cq0j7GZt.mjs +0 -1
- package/dist/manifest-DD3rtxvV.mjs +0 -1
- package/dist/manifest-Dm0o3i2U.mjs +0 -1
- package/dist/manifest-DtEFSRaq.mjs +0 -1
- package/dist/manifest-zrbrpKCC.mjs +0 -1
- package/dist/modules-p-PUNv9r.mjs +0 -332
- package/dist/network-BjZ1Y-GB.mjs +0 -7
- package/dist/platform-C446Lf97.mjs +0 -93
- package/dist/process-C9f2A5zk.mjs +0 -962
- package/dist/proxy-CvRepxgV.mjs +0 -1
- package/dist/streaming-CTX58tbb.mjs +0 -1
- package/dist/transform-Cv9P2vVD.mjs +0 -103
- package/dist/wasm-DaJa8J0V.mjs +0 -174
- /package/dist/{CacheAdapters-CdAxBmVW.mjs → CacheAdapters-CsNtQIR8.mjs} +0 -0
- /package/dist/{DarwinAPI-DC4HGGLl.mjs → DarwinAPI-ZfQdpLNI.mjs} +0 -0
- /package/dist/{EventBus-DgciURGg.mjs → EventBus-DL8iLA09.mjs} +0 -0
- /package/dist/{EvidenceGraphBridge-BIfgB7HP.mjs → EvidenceGraphBridge-BtbwXsLC.mjs} +0 -0
- /package/dist/{FingerprintManager-N7BZqjxP.mjs → FingerprintManager-DT0EAUEo.mjs} +0 -0
- /package/dist/{HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs → HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs} +0 -0
- /package/dist/{InstrumentationSession-DxXs0sCp.mjs → InstrumentationSession-D_G1ZPyd.mjs} +0 -0
- /package/dist/{PrerequisiteError-Bl3dK8XA.mjs → PrerequisiteError-BjCQA-gK.mjs} +0 -0
- /package/dist/{ReverseEvidenceGraph-B931HeoW.mjs → ReverseEvidenceGraph-BhSYYdiI.mjs} +0 -0
- /package/dist/{StealthVerifier-Dhbj4B4P.mjs → StealthVerifier-BmcxfwSF.mjs} +0 -0
- /package/dist/{VersionDetector-DMoUWyNm.mjs → VersionDetector-CHT36Az0.mjs} +0 -0
- /package/dist/{Win32API-Bhi5xFBe.mjs → Win32API-eUCF57l_.mjs} +0 -0
- /package/dist/{authorization-schema-B40obG1A.mjs → authorization-schema-BOFwSXUN.mjs} +0 -0
- /package/dist/{bind-helpers-BlAOQrFQ.mjs → bind-helpers-m2U8glkF.mjs} +0 -0
- /package/dist/{capabilities-DbYCv-HF.mjs → capabilities-CyXuKUl1.mjs} +0 -0
- /package/dist/{concurrency-CcK46d0h.mjs → concurrency-DCr8WQ2M.mjs} +0 -0
- /package/dist/{evidence-graph-bridge-B0yhGPcs.mjs → evidence-graph-bridge-CV_UdYqj.mjs} +0 -0
- /package/dist/{flat-target-session-CO5g78k3.mjs → flat-target-session-DvcQX7J5.mjs} +0 -0
- /package/dist/{formatAddress-C7j2fDlM.mjs → formatAddress-vLA_hOJt.mjs} +0 -0
- /package/dist/{handlers-Dv_runVv.mjs → handlers-0yKLRIfo.mjs} +0 -0
- /package/dist/{matchesWildcardPattern-BGqLSmEs.mjs → matchesWildcardPattern-BAG6LvX5.mjs} +0 -0
- /package/dist/{parse-args-Cuk7-xUt.mjs → parse-args-Bw413PlW.mjs} +0 -0
- /package/dist/{playwright-cdp-fallback-BwVR-_T3.mjs → playwright-cdp-fallback-DqFdx9-s.mjs} +0 -0
- /package/dist/{ssrf-policy-T96MR3r6.mjs → ssrf-policy-CsIJGkpd.mjs} +0 -0
- /package/dist/{tool-builder-CI9914Tf.mjs → tool-builder-qif8M9-K.mjs} +0 -0
- /package/dist/{types-DtThH00r.mjs → types-D9EiE5o9.mjs} +0 -0
- /package/dist/{types-CuyefmGT.mjs → types-Fz69RzbZ.mjs} +0 -0
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{B as t,V as n}from"./constants-Cp6hBrrx.mjs";import{t as r}from"./outputPaths-BonGThuc.mjs";import{t as i}from"./PrerequisiteError-Bl3dK8XA.mjs";import{l as a}from"./PageController-D9jVkH0i.mjs";import{n as o,t as s}from"./flat-target-session-CO5g78k3.mjs";import{t as c}from"./matchesWildcardPattern-BGqLSmEs.mjs";import{t as l}from"./playwright-cdp-fallback-BwVR-_T3.mjs";import{existsSync as u}from"fs";import d,{join as f}from"path";import p,{createHash as m}from"crypto";import{promisify as h}from"util";import g,{readFile as ee}from"fs/promises";import{gunzip as _,gzip as v}from"zlib";import{homedir as te}from"os";var ne=class t{cacheDir;maxAge;maxSize;memoryCache=new Map;MAX_MEMORY_CACHE_SIZE=100;writesSinceCleanup=0;static CLEANUP_INTERVAL=20;constructor(e={}){this.cacheDir=e.cacheDir||r(),this.maxAge=e.maxAge||1440*60*1e3,this.maxSize=e.maxSize||100*1024*1024}async init(){try{await g.mkdir(this.cacheDir,{recursive:!0}),e.debug(`Cache directory initialized: ${this.cacheDir}`)}catch(t){e.error(`Failed to initialize cache directory:`,t)}}generateKey(e,t){let n=JSON.stringify({url:e,options:t});return p.createHash(`md5`).update(n).digest(`hex`)}getCachePath(e){return d.join(this.cacheDir,`${e}.json`)}getDependenciesOrEmpty(e){return e??{nodes:[],edges:[]}}isExpired(e){return Date.now()-e.timestamp>this.maxAge}async get(t,n){let r=this.generateKey(t,n);if(this.memoryCache.has(r)){let n=this.memoryCache.get(r);if(this.isExpired(n))this.memoryCache.delete(r);else return e.debug(`Cache hit (memory): ${t}`),{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 g.readFile(n,`utf-8`),a=JSON.parse(i);return this.isExpired(a)?(e.debug(`Cache expired: ${t}`),await g.unlink(n),null):(this.memoryCache.set(r,a),e.debug(`Cache hit (disk): ${t}`),{files:a.files,dependencies:this.getDependenciesOrEmpty(a.dependencies),totalSize:a.totalSize,collectTime:a.collectTime,summaries:a.summaries})}catch(n){return e.warn(`Cache read failed for ${t}: ${n instanceof Error?n.message:String(n)}`),null}}async set(n,r,i){let a=this.generateKey(n,i),o=p.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 t=this.memoryCache.keys().next().value;t&&(this.memoryCache.delete(t),e.debug(`Memory cache evicted: ${t}`))}try{let t=this.getCachePath(a);await g.mkdir(this.cacheDir,{recursive:!0}),await g.writeFile(t,JSON.stringify(s,null,2),`utf-8`),e.debug(`Cache saved: ${n} (${(r.totalSize/1024).toFixed(2)} KB)`)}catch(t){e.error(`Failed to save cache:`,t)}++this.writesSinceCleanup>=t.CLEANUP_INTERVAL&&(this.writesSinceCleanup=0,this.cleanup())}async cleanup(){try{let t=await g.readdir(this.cacheDir),n=0,r=[];for(let e of t){if(!e.endsWith(`.json`))continue;let t=d.join(this.cacheDir,e),i=await g.stat(t);n+=i.size,r.push({file:t,mtime:i.mtime,size:i.size})}if(n>this.maxSize){r.sort((e,t)=>e.mtime.getTime()-t.mtime.getTime());let t=0;for(let i of r){if(n-t<=this.maxSize*.8)break;await g.unlink(i.file),t+=i.size,e.debug(`Removed old cache: ${i.file}`)}e.info(`Cache cleanup: removed ${t} bytes`)}}catch(t){e.error(`Failed to cleanup cache:`,t)}}async clear(){try{this.memoryCache.clear();let t=await g.readdir(this.cacheDir);for(let e of t)e.endsWith(`.json`)&&await g.unlink(d.join(this.cacheDir,e));e.info(`All cache cleared`)}catch(t){if(t.code===`ENOENT`)return;e.error(`Failed to clear cache:`,t)}}async getStats(){try{let e=await g.readdir(this.cacheDir),t=0,n=0;for(let r of e){if(!r.endsWith(`.json`))continue;let e=d.join(this.cacheDir,r),i=await g.stat(e);t+=i.size,n++}return{memoryEntries:this.memoryCache.size,diskEntries:n,totalSize:t}}catch(t){return e.error(`Failed to get cache stats:`,t),{memoryEntries:this.memoryCache.size,diskEntries:0,totalSize:0}}}async warmup(t){e.info(`Warming up cache for ${t.length} URLs...`);for(let e of t)await this.get(e);e.info(`Cache warmup completed`)}},re=class{DEFAULT_MAX_TOTAL_SIZE=512*1024;DEFAULT_MAX_FILE_SIZE=100*1024;PREVIEW_LINES=50;async smartCollect(t,n,r){switch(e.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(t){return e.info(`Generating code summaries...`),t.map(e=>{let t=e.content.split(`
|
|
2
|
-
`).slice(0,this.PREVIEW_LINES).join(`
|
|
3
|
-
`);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(t,n){let r=n.maxTotalSize||this.DEFAULT_MAX_TOTAL_SIZE,i=n.maxFileSize||this.DEFAULT_MAX_FILE_SIZE,a=t.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:t}of a){let a=t.content,c=!1;if(t.size>i&&(a=a.substring(0,i),c=!0),s+a.length>r){e.warn(`Reached max total size limit (${r} bytes), stopping collection`);break}o.push({...t,content:a,size:a.length,metadata:{...t.metadata,truncated:c,originalSize:t.size,priorityScore:this.calculatePriority(t,n.priorities||[])}}),s+=a.length}return e.info(`Collected ${o.length}/${t.length} files by priority (${(s/1024).toFixed(2)} KB)`),o}collectIncremental(t,n){let r=n.includePatterns||[],i=n.excludePatterns||[],a=t.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 e.info(`Incremental collection: ${a.length}/${t.length} files matched`),this.collectWithLimit(a,n)}collectWithLimit(t,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 t){let s=n.content,c=!1;if(n.size>i&&(s=s.substring(0,i),c=!0),o+s.length>r){e.warn(`Reached max total size limit, collected ${a.length}/${t.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(`
|
|
4
|
-
`);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 ie=h(v),ae=h(_);var oe=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(t,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(t,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++,e.debug(`Cache hit for compression (${t.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(t,`utf-8`),o=await ie(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()}),e.debug(`Compressed code: ${l} -> ${u} bytes (${d.toFixed(1)}% reduction, level ${i}, ${f}ms)`),p}catch(t){c=t,e.warn(`Compression attempt ${n+1}/${o} failed:`,t),n<o-1&&await new Promise(e=>setTimeout(e,100*(n+1)))}throw e.error(`Failed to compress code after retries:`,c),c||Error(`Compression failed`)}async decompress(t,n=3){let r=null;for(let i=0;i<n;i++)try{return(await ae(Buffer.from(t,`base64`))).toString(`utf-8`)}catch(t){r=t,e.warn(`Decompression attempt ${i+1}/${n} failed:`,t),i<n-1&&await new Promise(e=>setTimeout(e,100*(i+1)))}throw e.error(`Failed to decompress code after retries:`,r),r||Error(`Decompression failed`)}async compressBatch(t,n={}){let r=n.concurrency??this.DEFAULT_CONCURRENCY,i=[];for(let a=0;a<t.length;a+=r){let o=t.slice(a,a+r),s=await Promise.all(o.map(async t=>{try{let e=await this.compress(t.content,n);return n.onFileProgress&&n.onFileProgress(t.url,100),{url:t.url,compressed:e.compressed,originalSize:e.originalSize,compressedSize:e.compressedSize,compressionRatio:e.compressionRatio}}catch(n){return e.error(`Failed to compress ${t.url}:`,n),{url:t.url,compressed:Buffer.from(t.content).toString(`base64`),originalSize:t.content.length,compressedSize:t.content.length,compressionRatio:0}}}));i.push(...s),n.onProgress&&n.onProgress(i.length/t.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 e.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(t,n={}){let r=n.chunkSize??this.DEFAULT_CHUNK_SIZE;if(t.length<=r)return this.compress(t,n);let i=Date.now(),a=[];for(let e=0;e<t.length;e+=r){let i=t.substring(e,e+r),o=await this.compress(i,{...n,useCache:!1});a.push(o.compressed),n.onProgress&&n.onProgress(e/t.length*100)}let o=JSON.stringify(a),s=Buffer.from(o).toString(`base64`),c=t.length,l=s.length,u=(1-l/c)*100,d=Date.now()-i;return e.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(t,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(),e.info(`Compression cache cleared`)}getCacheSize(){return this.cache.size}generateCacheKey(e,t){return`${m(`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)}},se=class{getBrowser;browserSession=null;attachedTargetSession=null;attachedTargetInfo=null;autoAttachEnabled=!1;constructor(e){this.getBrowser=e}async listTargets(e={}){let t=await this.ensureBrowserSession();if(e.discoverOOPIF!==!1&&!this.autoAttachEnabled)try{await t.send(`Target.setAutoAttach`,{autoAttach:!0,waitForDebuggerOnStart:!1,flatten:!0}),await t.send(`Target.setDiscoverTargets`,{discover:!0}),this.autoAttachEnabled=!0}catch{}let n=await t.send(`Target.getTargets`);return(Array.isArray(n.targetInfos)?n.targetInfos.map(e=>this.normalizeTargetInfo(e)).filter(e=>e!==null):[]).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=await this.ensureBrowserSession();return this.attachedTargetSession=await s(r,e),this.attachedTargetInfo=n,n}async detach(){if(!this.attachedTargetSession)return this.attachedTargetInfo=null,!1;if(!this.browserSession)throw Error(`Browser CDP session unavailable for target detach`);let e=this.attachedTargetSession;return await o(this.browserSession,e),this.attachedTargetSession=null,this.attachedTargetInfo=null,!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 await this.requireAttachedTargetSession().send(`Page.addScriptToEvaluateOnNewDocument`,{source:e})}async dispose(){if(await this.detach(),this.autoAttachEnabled=!1,this.browserSession)try{await this.browserSession.detach()}catch{}finally{this.browserSession=null}}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}matchesFilters(e,t){return!(t.type&&e.type!==t.type||t.types&&t.types.length>0&&!t.types.includes(e.type)||t.targetId&&e.targetId!==t.targetId||t.urlPattern&&!e.url.includes(t.urlPattern)||t.titlePattern&&!e.title.includes(t.titlePattern)||t.attachedOnly&&!e.attached)}normalizeTargetInfo(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:``,a=typeof e.attached==`boolean`?e.attached:!1;return!t||!n?null:{targetId:t,type:n,title:r,url:i,attached:a,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}}};const ce=[`CHROME_PATH`,`PUPPETEER_EXECUTABLE_PATH`,`BROWSER_EXECUTABLE_PATH`];let y=null;function b(){for(let e of ce){let t=process.env[e]?.trim();if(t&&u(t))return t}}let x=null;async function S(){try{x||=(await import(`rebrowser-puppeteer-core`)).executablePath;let e=x(`chrome`);if(e&&u(e))return e}catch{}}function C(){if(y!==null){if(!y||u(y))return y;y=null}return y=b(),y??void 0}async function w(){return C()||(y=await S()??void 0,y||=void 0,y)}async function T(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 E(t,n,r){let i=await t.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&&e.warn(`Found ${i.length} inline scripts, limiting to ${r}`);let o=a.filter(e=>e.metadata?.truncated).length;return o>0&&e.warn(`${o} inline scripts were truncated due to size limits`),e.debug(`Collected ${a.length} inline scripts`),a}async function D(t,n=()=>!0){try{let r=await t.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 t.evaluate(async e=>await(await fetch(e)).text(),a.url);n&&(i.push({url:a.url,content:n,size:n.length,type:`service-worker`}),e.debug(`Collected Service Worker: ${a.url}`))}catch(t){e.warn(`Failed to collect Service Worker: ${a.url}`,t)}return i}catch(t){return e.warn(`Service Worker collection failed`,t),[]}}async function O(t,n=()=>!0){try{let r=await t.evaluate(()=>{let e=window;return Array.isArray(e.__workerUrls)?e.__workerUrls:[]}),i=[];for(let a of r)try{let r=new URL(a,t.url()).href;if(!n(r))continue;let o=await t.evaluate(async e=>await(await fetch(e)).text(),r);o&&(i.push({url:r,content:o,size:o.length,type:`web-worker`}),e.debug(`Collected Web Worker: ${r}`))}catch(t){e.warn(`Failed to collect Web Worker: ${a}`,t)}return i}catch(t){return e.warn(`Web Worker collection failed`,t),[]}}function k(t){let n=[],r=[];return t.forEach(e=>{n.push({id:e.url,url:e.url,type:e.type})}),t.forEach(e=>{A(e.content).forEach(n=>{let i=t.find(e=>e.url.includes(n)||e.url.endsWith(n)||e.url.endsWith(`${n}.js`));i&&r.push({from:e.url,to:i.url,type:`import`})})}),e.debug(`Dependency graph: ${n.length} nodes, ${r.length} edges`),{nodes:n,edges:r}}function A(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 j(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 M(e){return typeof e==`object`&&!!e}function N(e){return M(e)?e:void 0}function P(e){return!M(e)||!M(e.response)?!1:typeof e.response.url==`string`&&typeof e.requestId==`string`}function F(e){return M(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 I(e){return M(e)?typeof e.url==`string`&&typeof e.content==`string`&&typeof e.size==`number`&&typeof e.type==`string`:!1}function L(e){if(!M(e)||typeof e.init!=`function`||typeof e.applyAntiDetection!=`function`||typeof e.shouldCollectUrl!=`function`)throw Error(`Invalid collector context`)}async function R(t,n){L(t);let r=Date.now();e.info(`Collecting code from: ${n.url}`);let i=N(n);if(t.cacheEnabled){let r=await t.cache.get(n.url,i);if(r)return e.info(` Cache hit for: ${n.url}`),r}if(await t.init(),!t.browser)throw Error(`Browser not initialized`);let o=null,s=(typeof t.listPages==`function`?await t.listPages().catch(()=>[]):[]).length>0&&typeof t.getActivePage==`function`?await t.getActivePage().then(e=>e.browserContext()).catch(t=>(e.debug(`Failed to resolve active browser context before code collection:`,t),null)):null,c=s===null&&typeof t.browser.createBrowserContext==`function`?await t.browser.createBrowserContext():null;if((s!==null||!c)&&typeof t.getActivePageIndex==`function`)try{o=await t.getActivePageIndex()}catch(t){e.debug(`Failed to capture active page index before code collection:`,t)}let l=s===null?c?await c.newPage():await t.browser.newPage():await s.newPage();try{let o=n.timeout??t.config.timeout??3e4;l.setDefaultTimeout(o),await l.setUserAgent(t.userAgent),await t.applyAntiDetection(l),n.includeWebWorker!==!1&&await T(l);let s=[],c=(n,r)=>{let i=t.MAX_FILES_PER_COLLECT-s.length;if(i<=0){e.warn(`Reached max files limit (${t.MAX_FILES_PER_COLLECT}), skipping ${r}`);return}n.length>i&&e.warn(`Collected ${n.length} ${r}, limiting to remaining ${i} files`),s.push(...n.slice(0,i))};t.cdpSession=await l.createCDPSession(),await t.cdpSession.send(`Network.enable`),await t.cdpSession.send(`Runtime.enable`),t.cdpListeners.responseReceived=async r=>{if(!P(r))return;let{response:i,requestId:a,type:o}=r,l=i.url;if(s.length>=t.MAX_FILES_PER_COLLECT){s.length===t.MAX_FILES_PER_COLLECT&&e.warn(`Reached max files limit (${t.MAX_FILES_PER_COLLECT}), will skip remaining files`);return}if(t.cleanupCollectedUrls(),o===`Script`||i.mimeType?.includes(`javascript`)||l.endsWith(`.js`)){if(n.includeExternal===!1||!t.shouldCollectUrl(l,n.filterRules))return;try{let n=await t.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,o=r,u=!1;if(i>t.MAX_SINGLE_FILE_SIZE&&(o=r.substring(0,t.MAX_SINGLE_FILE_SIZE),u=!0,e.warn(`[CDP] Large file truncated: ${l} (${(i/1024).toFixed(2)} KB -> ${(t.MAX_SINGLE_FILE_SIZE/1024).toFixed(2)} KB)`)),!t.collectedUrls.has(l)){t.collectedUrls.add(l);let n={url:l,content:o,size:o.length,type:`external`,metadata:u?{truncated:!0,originalSize:i,truncatedSize:o.length}:void 0},r=s.length;c([n],`external scripts`),s.length>r&&(t.collectedFilesCache.set(l,n),e.debug(`[CDP] Collected (${s.length}/${t.MAX_FILES_PER_COLLECT}): ${l} (${(o.length/1024).toFixed(2)} KB)${u?` [TRUNCATED]`:``}`))}}catch(t){e.warn(`[CDP] Failed to get response body for: ${l}`,t)}}},t.cdpSession.on(`Network.responseReceived`,t.cdpListeners.responseReceived),e.info(`Navigating to: ${n.url}`),await l.goto(n.url,{waitUntil:a(),timeout:n.timeout||t.config.timeout}),n.includeInline!==!1&&(e.info(`Collecting inline scripts...`),c(await E(l,t.MAX_SINGLE_FILE_SIZE,t.MAX_FILES_PER_COLLECT),`inline scripts`)),n.includeServiceWorker!==!1&&(e.info(`Collecting Service Workers...`),c(await D(l,e=>t.shouldCollectUrl(e,n.filterRules)),`service workers`)),n.includeWebWorker!==!1&&(e.info(`Collecting Web Workers...`),c(await O(l,e=>t.shouldCollectUrl(e,n.filterRules)),`web workers`)),n.includeDynamic&&(e.info(`Waiting for dynamic scripts...`),await new Promise(e=>setTimeout(e,3e3))),t.cdpSession&&(t.cdpListeners.responseReceived&&t.cdpSession.off(`Network.responseReceived`,t.cdpListeners.responseReceived),await t.cdpSession.detach(),t.cdpSession=null,t.cdpListeners={});let u=Date.now()-r,d=s.filter(e=>e.metadata?.truncated);d.length>0&&(e.warn(`${d.length} files were truncated due to size limits`),d.forEach(t=>{let n=typeof t.metadata?.originalSize==`number`?t.metadata.originalSize:t.size;e.warn(` - ${t.url}: ${(n/1024).toFixed(2)} KB -> ${(t.size/1024).toFixed(2)} KB`)}));let f=s;if(n.smartMode&&n.smartMode!==`full`)try{e.info(` Applying smart collection mode: ${n.smartMode}`);let i={mode:n.smartMode,maxTotalSize:n.maxTotalSize,maxFileSize:n.maxFileSize,priorities:n.priorities},a=await t.smartCollector.smartCollect(l,s,i);if(n.smartMode===`summary`&&(e.info(` Returning ${a.length} code summaries`),Array.isArray(a)&&a.every(e=>F(e))))return{files:[],summaries:a,dependencies:{nodes:[],edges:[]},totalSize:0,collectTime:Date.now()-r};Array.isArray(a)&&a.every(e=>I(e))?f=a:(e.warn(`Smart collection returned unexpected type, using original files`),f=s)}catch(t){e.error(`Smart collection failed, using original files:`,t),f=s}if(n.compress)try{e.info(`Compressing ${f.length} files with enhanced compressor...`);let n=f.filter(e=>t.compressor.shouldCompress(e.content)).map(e=>({url:e.url,content:e.content}));if(n.length===0)e.info(`No files need compression (all below threshold)`);else{let r=await t.compressor.compressBatch(n,{level:void 0,useCache:!0,maxRetries:3,concurrency:5,onProgress:t=>{t%25==0&&e.debug(`Compression progress: ${t.toFixed(0)}%`)}}),i=new Map(r.map(e=>[e.url,e]));for(let e of f){let t=i.get(e.url);t&&(e.metadata={...e.metadata,compressed:!0,originalSize:t.originalSize,compressedSize:t.compressedSize,compressionRatio:t.compressionRatio})}let a=t.compressor.getStats();e.info(` Compressed ${r.length}/${f.length} files`),e.info(` Compression stats: ${(a.totalOriginalSize/1024).toFixed(2)} KB -> ${(a.totalCompressedSize/1024).toFixed(2)} KB (${a.averageRatio.toFixed(1)}% reduction)`),e.info(` Cache: ${a.cacheHits} hits, ${a.cacheMisses} misses (${a.cacheHits>0?(a.cacheHits/(a.cacheHits+a.cacheMisses)*100).toFixed(1):0}% hit rate)`)}}catch(t){e.error(`Compression failed:`,t)}let p=k(f),m=f.reduce((e,t)=>e+t.size,0);e.success(`Collected ${f.length} files (${(m/1024).toFixed(2)} KB) in ${u}ms`);let h={files:f,dependencies:p,totalSize:m,collectTime:u};return t.cacheEnabled&&(await t.cache.set(n.url,h,i),e.debug(` Saved to cache: ${n.url}`)),h}catch(t){throw e.error(`Code collection failed`,t),t}finally{if(t.cdpSession){try{t.cdpListeners.responseReceived&&t.cdpSession.off(`Network.responseReceived`,t.cdpListeners.responseReceived),await t.cdpSession.detach()}catch{}t.cdpSession=null,t.cdpListeners={}}if(c)try{await c.close()}catch(t){e.debug(`Failed to close temporary browser context after code collection:`,t)}else if(await l.close(),o!==null&&typeof t.selectPage==`function`)try{await t.selectPage(o)}catch(t){e.debug(`Failed to restore active page after code collection:`,t)}}}function z(e,t){if(!t||t.length===0)return!0;for(let n of t)if(c(e,n))return!0;return!1}async function B(t,n,r,i=3){let a=null;for(let o=0;o<i;o++)try{await t.goto(n,r);return}catch(t){a=t,e.warn(`Navigation attempt ${o+1}/${i} failed: ${t}`),o<i-1&&await new Promise(e=>setTimeout(e,1e3*(o+1)))}throw a||Error(`Navigation failed after retries`)}async function V(t){try{return await t.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(t){return e.warn(`Failed to get performance metrics`,t),{}}}async function H(t){try{return await t.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(t){return e.warn(`Failed to collect page metadata`,t),{}}}function U(e=`stable`){let t=te();if(process.platform===`win32`){let n=process.env.LOCALAPPDATA??f(t,`AppData`,`Local`);switch(e){case`beta`:return f(n,`Google`,`Chrome Beta`,`User Data`);case`dev`:return f(n,`Google`,`Chrome Dev`,`User Data`);case`canary`:return f(n,`Google`,`Chrome SxS`,`User Data`);default:return f(n,`Google`,`Chrome`,`User Data`)}}if(process.platform===`darwin`){let n=f(t,`Library`,`Application Support`);switch(e){case`beta`:return f(n,`Google`,`Chrome Beta`);case`dev`:return f(n,`Google`,`Chrome Dev`);case`canary`:return f(n,`Google`,`Chrome Canary`);default:return f(n,`Google`,`Chrome`)}}let n=process.env.XDG_CONFIG_HOME??f(t,`.config`);switch(e){case`beta`:return f(n,`google-chrome-beta`);case`dev`:return f(n,`google-chrome-unstable`);case`canary`:return f(n,`google-chrome-canary`);default:return f(n,`google-chrome`)}}async function W(e){let t=e.channel??`stable`,n=f(e.userDataDir??U(t),`DevToolsActivePort`),r;try{r=await ee(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 G(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 W(e)};throw Error(`browserURL, wsEndpoint, autoConnect, userDataDir, or channel is required to connect to an existing browser.`)}function K(e){return typeof e!=`string`&&!!(e.autoConnect||e.userDataDir||e.channel)}function q(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 le(e,t,n){let r=q(e);return K(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 ue(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 K(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 de(e){let t=q(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 fe(t,n,r){let i=t.browserWSEndpoint??t.browserURL;if(!i)throw n instanceof Error?n:Error(String(n));e.warn(`[connect-fallback] Rebrowser connect failed. Falling back to Playwright CDP compatibility mode for ${i}.`);try{return await l(i,r)}catch(e){let t=q(n),r=q(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 pe(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(ue(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(le(e,t,n)))})})}catch(t){if(!de(t))throw t;return await fe(e,t,r)}}function me(t){let n=Array.from(t.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 e.info(`Returning summary of ${n.length} collected files`),n}function he(t,n){let r=t.get(n);return r?(e.info(`Returning file: ${n} (${(r.size/1024).toFixed(2)} KB)`),r):(e.warn(`File not found: ${n}`),null)}function ge(t,n,r,i){let a=new RegExp(n),o=[];for(let e of t.values())a.test(e.url)&&o.push(e);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)&&e.warn(`Pattern "${n}" matched ${o.length} files, returning ${s.length} (limited by size/count)`),e.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 _e(t,n,r){let i=Array.from(t.values()),a=i.map(e=>({file:e,score:j(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 e.info(`Returning top ${o.length}/${i.length} priority files (${(s/1024).toFixed(2)} KB)`),{files:o,totalSize:s,totalFiles:i.length}}const ve=[`--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 J(e){return Array.isArray(e)?e.map(e=>e.trim()).filter(e=>e.length>0):[]}function Y(e){return e.split(/\s+/u).map(e=>e.trim()).filter(e=>e.length>0)}function X(e){let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n}function ye(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(...Y(n)),t+=1;continue}}if(i.startsWith(`--js-flags=`)){r.push(...Y(i.slice(11)));continue}n.push(i)}}let i=X(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?[...X(n),`--js-flags=${o.join(` `)}`]:X(n),v8NativeSyntaxEnabled:o.includes(a)}}function be(e,t,n,r){let i=ye([...J(e.args),...J(t?.args),...ve,`--window-size=${r.width},${r.height}`],t?.enableV8NativesSyntax);return{headless:t?.headless??e.headless,args:i.args,executablePath:n,v8NativeSyntaxEnabled:i.v8NativeSyntaxEnabled}}function xe(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 Se=class t{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(t){this.config=t,this.MAX_COLLECTED_URLS=t.maxCollectedUrls??1e4,this.MAX_FILES_PER_COLLECT=t.maxFilesPerCollect??200,this.MAX_RESPONSE_SIZE=t.maxTotalContentSize??512*1024,this.MAX_SINGLE_FILE_SIZE=t.maxSingleFileSize??200*1024,this.CONNECT_TIMEOUT_MS=Number(process.env.JSHOOK_CONNECT_TIMEOUT_MS)||6e4,this.viewport=t.viewport??{width:1920,height:1080},this.userAgent=t.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 ne,this.smartCollector=new re,this.compressor=new oe,e.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`),e.info(` Strategy: Collect ALL files -> Cache -> Return summary/partial data to fit MCP limits`)}setCacheEnabled(t){this.cacheEnabled=t,e.info(`Code cache ${t?`enabled`:`disabled`}`)}async clearFileCache(){await this.cache.clear()}async getFileCacheStats(){return await this.cache.getStats()}async clearAllData(){e.info(`Clearing all collected data...`),await this.cache.clear(),this.compressor.clearCache(),this.compressor.resetStats(),this.collectedUrls.clear(),this.collectedFilesCache.clear(),e.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){e.warn(`Collected URLs exceeded ${this.MAX_COLLECTED_URLS}, clearing...`);let t=Array.from(this.collectedUrls);this.collectedUrls.clear(),t.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=be(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&&xe(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(t){this.browser&&await this.disposeCurrentBrowser(!1);let n={headless:t.headless,args:t.args,defaultViewport:this.viewport,protocolTimeout:6e4};t.executablePath&&(n.executablePath=t.executablePath),e.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&&e.debug(`Chrome child process PID: ${this.chromePid}`),this.currentHeadless=t.headless,this.currentLaunchOptions=t,this.browser.on(`disconnected`,()=>{this.handleBrowserDisconnected()}),e.success(`Browser initialized with enhanced anti-detection`)}async resolveExecutablePath(){let t=this.config.executablePath?.trim();if(t){if(u(t))return t;throw Error(`Configured browser executable was not found: ${t}. Set a valid executablePath or configure CHROME_PATH / PUPPETEER_EXECUTABLE_PATH / BROWSER_EXECUTABLE_PATH.`)}let n=await w();if(n)return n;e.info(`No explicit browser executable configured. Falling back to Puppeteer-managed browser resolution.`)}handleBrowserDisconnected(){e.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),e.info(`Browser closed and all data cleared`)}async closeBrowserWithForceKill(n,r){try{await Promise.race([n.close(),new Promise((e,n)=>setTimeout(()=>n(Error(`browser.close() timed out`)),t.BROWSER_CLOSE_TIMEOUT_MS))])}catch(n){e.warn(`browser.close() failed or timed out, attempting force-kill:`,n),t.forceKillPid(r)}}static forceKillPid(t){if(t)try{process.kill(t,`SIGKILL`),e.info(`Force-killed Chrome process PID ${t}`)}catch(n){n.code!==`ESRCH`&&e.warn(`Failed to force-kill Chrome PID ${t}:`,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 i(`Timed out after ${t}ms while resolving a Puppeteer Page handle from the attached Chrome target.`))},t)})]);if(!n)throw new i(`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 i(`Browser was explicitly closed. Call browser_launch or browser_attach first.`);try{await this.init()}catch(e){throw new i(`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(t){if(!this.browser)throw Error(`Browser not connected`);let n=await this.listPages();if(t<0||t>=n.length)throw Error(`Page index ${t} out of range (0-${n.length-1})`);this.activePageIndex=t;try{let r=this.getPageTargets();this.cachedActivePage=await this.resolvePageTargetHandle(r[t],8e3),e.info(`Active page index set to ${t}: ${n[t].url} (cached)`)}catch(n){this.cachedActivePage=null,e.warn(`Failed to cache page handle for index ${t}: ${n instanceof Error?n.message:String(n)}. Falling back to lazy resolve on next use.`)}}async createPage(t){this.browser||await this.init();let n=await this.browser.newPage();return await n.setUserAgent(this.userAgent),await this.applyAntiDetection(n),t&&await n.goto(t,{waitUntil:a(),timeout:this.config.timeout}),e.info(`New page created${t?`: ${t}`:``}`),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(t){return e.debug(`Browser not running or disconnected:`,t),{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 R(this,e)}shouldCollectUrl(e,t){return z(e,t)}async navigateWithRetry(e,t,n,r=3){return B(e,t,n,r)}async getPerformanceMetrics(e){return V(e)}async collectPageMetadata(e){return H(e)}async resolveConnectOptions(e){return G(e)}async connectWithTimeout(e,t,n){return pe(e,t,n,this.CONNECT_TIMEOUT_MS,this.connectAttemptRef)}async connect(t){this.explicitlyClosed=!1,(this.browser||this.browserTargetSessionManager||this.cdpSession)&&await this.disposeCurrentBrowser(!1);let n=await this.resolveConnectOptions(t),r=n.browserWSEndpoint??n.browserURL??`auto-detected Chrome debugging endpoint`;e.info(`Connecting to existing browser: ${r}`),this.browser=await this.connectWithTimeout(n,r,t),this.connectedToExistingBrowser=!0,this.currentLaunchOptions=null,this.browser.on(`disconnected`,()=>{this.handleBrowserDisconnected()}),e.success(`Connected to existing browser successfully`)}getBrowser(){return this.browser}getBrowserTargetSessionManager(){return this.browserTargetSessionManager||=new se(()=>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(),e.info(`Collection cache cleared`)}getCollectedFilesSummary(){return me(this.collectedFilesCache)}getFileByUrl(e){return he(this.collectedFilesCache,e)}getFilesByPattern(e,t=20,n=this.MAX_RESPONSE_SIZE){return ge(this.collectedFilesCache,e,t,n)}getTopPriorityFiles(e=10,t=this.MAX_RESPONSE_SIZE){return _e(this.collectedFilesCache,e,t)}clearCollectedFilesCache(){let t=this.collectedFilesCache.size;this.collectedFilesCache.clear(),e.info(`Cleared collected files cache (${t} files)`)}};const Z=e=>e===void 0?`undefined`:JSON.stringify(e),Q=`const walkShadowRoots = () => {
|
|
5
|
-
const roots = [document];
|
|
6
|
-
const queue = [document];
|
|
7
|
-
let shadowRootCount = 0;
|
|
8
|
-
while (queue.length > 0) {
|
|
9
|
-
const root = queue.shift();
|
|
10
|
-
if (!root) continue;
|
|
11
|
-
for (const element of Array.from(root.querySelectorAll('*'))) {
|
|
12
|
-
const shadowRoot = element.shadowRoot;
|
|
13
|
-
if (shadowRoot) {
|
|
14
|
-
roots.push(shadowRoot);
|
|
15
|
-
queue.push(shadowRoot);
|
|
16
|
-
shadowRootCount += 1;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return { roots, shadowRootCount };
|
|
21
|
-
};`;function Ce(e,t){return`
|
|
22
|
-
${Q}
|
|
23
|
-
const selector = ${Z(e)};
|
|
24
|
-
const maxLimit = ${Z(t)};
|
|
25
|
-
const { roots, shadowRootCount } = walkShadowRoots();
|
|
26
|
-
const seen = new Set();
|
|
27
|
-
const results = [];
|
|
28
|
-
let totalMatches = 0;
|
|
29
|
-
for (const root of roots) {
|
|
30
|
-
const nodeList = Array.from(root.querySelectorAll(selector));
|
|
31
|
-
totalMatches += nodeList.length;
|
|
32
|
-
for (const element of nodeList) {
|
|
33
|
-
if (seen.has(element)) continue;
|
|
34
|
-
seen.add(element);
|
|
35
|
-
const attributes = {};
|
|
36
|
-
for (const attr of Array.from(element.attributes)) {
|
|
37
|
-
attributes[attr.name] = attr.value;
|
|
38
|
-
}
|
|
39
|
-
const rect = element.getBoundingClientRect();
|
|
40
|
-
const style = window.getComputedStyle(element);
|
|
41
|
-
const textContent = element.textContent?.trim() || '';
|
|
42
|
-
results.push({
|
|
43
|
-
found: true,
|
|
44
|
-
nodeName: element.nodeName,
|
|
45
|
-
attributes,
|
|
46
|
-
textContent: textContent.length > 500 ? textContent.substring(0, 500) + '...[truncated]' : textContent,
|
|
47
|
-
boundingBox: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },
|
|
48
|
-
visible: style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0',
|
|
49
|
-
});
|
|
50
|
-
if (results.length >= maxLimit) break;
|
|
51
|
-
}
|
|
52
|
-
if (results.length >= maxLimit) break;
|
|
53
|
-
}
|
|
54
|
-
if (totalMatches > maxLimit) {
|
|
55
|
-
console.warn('[DOMInspector] Found ' + totalMatches + ' elements for "' + selector + '", limiting to ' + maxLimit);
|
|
56
|
-
}
|
|
57
|
-
return { elements: results, diagnostics: { readyState: document.readyState, shadowRootCount } };
|
|
58
|
-
`.trim()}function $(e){return`
|
|
59
|
-
${Q}
|
|
60
|
-
const filter = ${Z(e)};
|
|
61
|
-
const normalizedFilter = filter?.toLowerCase();
|
|
62
|
-
const { roots, shadowRootCount } = walkShadowRoots();
|
|
63
|
-
const results = [];
|
|
64
|
-
const seen = new Set();
|
|
65
|
-
const appendClickable = (element, type, fallbackSelector) => {
|
|
66
|
-
if (seen.has(element)) return;
|
|
67
|
-
seen.add(element);
|
|
68
|
-
const text = element.textContent?.trim() || (element.value ?? '').trim() || '';
|
|
69
|
-
if (normalizedFilter && !text.toLowerCase().includes(normalizedFilter)) return;
|
|
70
|
-
const rect = element.getBoundingClientRect();
|
|
71
|
-
const style = window.getComputedStyle(element);
|
|
72
|
-
let selector = fallbackSelector;
|
|
73
|
-
if (element.id) selector = '#' + element.id;
|
|
74
|
-
else if (element.className) selector = fallbackSelector + '.' + element.className.split(' ')[0];
|
|
75
|
-
results.push({
|
|
76
|
-
selector,
|
|
77
|
-
text,
|
|
78
|
-
type,
|
|
79
|
-
visible:
|
|
80
|
-
style.display !== 'none' &&
|
|
81
|
-
style.visibility !== 'hidden' &&
|
|
82
|
-
style.opacity !== '0' &&
|
|
83
|
-
rect.width > 0 &&
|
|
84
|
-
rect.height > 0,
|
|
85
|
-
boundingBox: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },
|
|
86
|
-
});
|
|
87
|
-
};
|
|
88
|
-
for (const root of roots) {
|
|
89
|
-
root
|
|
90
|
-
.querySelectorAll('button, input[type="button"], input[type="submit"], input[type="reset"]')
|
|
91
|
-
.forEach((button) => appendClickable(button, 'button', button.tagName.toLowerCase()));
|
|
92
|
-
root.querySelectorAll('a[href]').forEach((link) => appendClickable(link, 'link', 'a'));
|
|
93
|
-
}
|
|
94
|
-
return { elements: results, diagnostics: { readyState: document.readyState, shadowRootCount } };
|
|
95
|
-
`.trim()}function we(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 Te(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 Ee(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 De(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 Oe(){let e=window;e.__domObserver&&(e.__domObserver.disconnect(),delete e.__domObserver)}function ke(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 Ae(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 je(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 Me=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(t,n=!0){try{let n=await(await this.collector.getActivePage()).evaluate(we,t);return e.info(`querySelector: ${t} - ${n.found?`found`:`not found`}`),n}catch(n){return e.error(`querySelector failed for ${t}:`,n),{found:!1}}}async querySelectorAll(n,r=t){try{let t=await this.collector.getActivePage(),i=await this.waitForReadyState(t),a=async()=>t.evaluate(Function(Ce(n,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 e.info(`querySelectorAll: ${n} - found ${o.elements.length} elements (limit: ${r}, readyState: ${c.readyState}, shadowRoots: ${c.shadowRootCount}, retried: ${s})`),{elements:o.elements,diagnostics:c}}catch(t){return e.error(`querySelectorAll failed for ${n}:`,t),{elements:[],diagnostics:{readyState:`error`,frameCount:0,shadowRootCount:0,retried:!1,waitedForReadyState:!1}}}}async getStructure(t=3,n=!0){try{let r=await(await this.collector.getActivePage()).evaluate(Te,t,n);return e.info(`DOM structure retrieved`),r}catch(t){return e.error(`getStructure failed:`,t),null}}async findClickable(t){try{let n=await this.collector.getActivePage(),r=await this.waitForReadyState(n),i=async()=>n.evaluate(Function($(t))),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 e.info(`findClickable: found ${a.elements.length} elements${t?` (filtered by: ${t})`:``} (readyState: ${s.readyState}, shadowRoots: ${s.shadowRootCount}, retried: ${o})`),{elements:a.elements,diagnostics:s}}catch(t){return e.error(`findClickable failed:`,t),{elements:[],diagnostics:{readyState:`error`,frameCount:0,shadowRootCount:0,retried:!1,waitedForReadyState:!1}}}}async getComputedStyle(t){try{let n=await(await this.collector.getActivePage()).evaluate(Ee,t);return e.info(`getComputedStyle: ${t} - ${n?`found`:`not found`}`),n}catch(n){return e.error(`getComputedStyle failed for ${t}:`,n),null}}async waitForElement(t,r=n){try{return await(await this.collector.getActivePage()).waitForSelector(t,{timeout:r}),await this.querySelector(t)}catch(n){return e.error(`waitForElement timeout for ${t}:`,n),null}}async observeDOMChanges(t={}){await(await this.collector.getActivePage()).evaluate(De,t),e.info(`DOM change observer started`)}async stopObservingDOM(){await(await this.collector.getActivePage()).evaluate(Oe),e.info(`DOM change observer stopped`)}async findByText(t,n){try{let r=await(await this.collector.getActivePage()).evaluate(ke,t,n);return e.info(`findByText: "${t}" - found ${r.length} elements`),r}catch(n){return e.error(`findByText failed for "${t}":`,n),[]}}async getXPath(t){try{let n=await(await this.collector.getActivePage()).evaluate(Ae,t);return e.info(`getXPath: ${t} -> ${n}`),n}catch(n){return e.error(`getXPath failed for ${t}:`,n),null}}async isInViewport(t){try{let n=await(await this.collector.getActivePage()).evaluate(je,t);return e.info(`isInViewport: ${t} - ${n}`),n}catch(n){return e.error(`isInViewport failed for ${t}:`,n),!1}}async close(){this.cdpSession&&(await this.cdpSession.detach(),this.cdpSession=null,e.info(`DOM Inspector CDP session closed`))}};export{Se as n,Me as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{L as t,R as n,z as r}from"./constants-Cp6hBrrx.mjs";var i=class i{static instance;cache=new Map;cleanupInterval=null;DEFAULT_TTL=t;MAX_TTL=n;MAX_CACHE_SIZE=100;AUTO_EXTEND_ON_ACCESS=!0;EXTEND_DURATION=900*1e3;serializationMemo=new WeakMap;constructor(){this.cleanupInterval=setInterval(()=>this.cleanup(),300*1e3),typeof this.cleanupInterval==`object`&&`unref`in this.cleanupInterval&&this.cleanupInterval.unref()}static getInstance(){return this.instance||=new i,this.instance}shutdown(){this.cleanupInterval&&=(clearInterval(this.cleanupInterval),null),this.cache.clear(),i.instance=void 0,e.info(`DetailedDataManager shut down`)}serializeWithMemo(e){if(typeof e==`object`&&e){let t=this.serializationMemo.get(e);if(t)return t}let t=JSON.stringify(e),n={json:t,size:t.length};return typeof e==`object`&&e&&this.serializationMemo.set(e,n),n}isRecord(e){return typeof e==`object`&&!!e}readPathSegment(e,t){return Object(e)[t]}smartHandle(t,n=r){if(t==null||typeof t!=`object`&&typeof t!=`string`||typeof t==`string`&&t.length<=n)return t;let{json:i,size:a}=this.serializeWithMemo(t);return a<=n?t:(e.info(`Data too large (${(a/1024).toFixed(1)}KB), returning summary with detailId`),this.createDetailedResponseWithSize(t,i,a))}createDetailedResponseWithSize(e,t,n){let r=this.storeWithSize(e,n);return{summary:this.generateSummaryFromJson(e,t,n),detailId:r,hint:`Data too large. Use get_detailed_data("${r}") to retrieve full data, or get_detailed_data("${r}", path="key.subkey") for specific part.`,expiresAt:Date.now()+this.DEFAULT_TTL}}store(e,t){let{size:n}=this.serializeWithMemo(e);return this.storeWithSize(e,n,t)}storeWithSize(t,n,r){this.cache.size>=this.MAX_CACHE_SIZE&&this.evictLRU();let i=`detail_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,a=Date.now(),o=r||this.DEFAULT_TTL,s={data:t,expiresAt:a+o,createdAt:a,lastAccessedAt:a,accessCount:0,size:n};return this.cache.set(i,s),e.debug(`Stored detailed data: ${i}, size: ${(n/1024).toFixed(1)}KB, expires in ${o/1e3}s`),i}retrieve(t,n){let r=this.cache.get(t);if(!r)throw Error(`DetailId not found or expired: ${t}`);let i=Date.now();if(i>r.expiresAt)throw this.cache.delete(t),Error(`DetailId expired: ${t}`);return r.lastAccessedAt=i,r.accessCount++,this.AUTO_EXTEND_ON_ACCESS&&r.expiresAt-i<300*1e3&&(r.expiresAt=Math.min(i+this.EXTEND_DURATION,i+this.MAX_TTL),e.debug(`Auto-extended detailId ${t}, new expiry: ${new Date(r.expiresAt).toISOString()}`)),n?this.getByPath(r.data,n):r.data}getByPath(e,t){let n=t.split(`.`),r=e;for(let e of n){if(r==null)throw Error(`Path not found: ${t} (stopped at ${e})`);r=this.readPathSegment(r,e)}return r}generateSummaryFromJson(e,t,n){let r={type:Array.isArray(e)?`array`:typeof e,size:n,sizeKB:(n/1024).toFixed(1)+`KB`,preview:t.substring(0,200)+(n>200?`...`:``)};if(this.isRecord(e)){let t=Object.keys(e);if(r.structure={keys:t.slice(0,50)},Array.isArray(e))r.structure.length=e.length;else{let n=t.filter(t=>typeof e[t]==`function`),i=t.filter(t=>typeof e[t]!=`function`);r.structure.methods=n.slice(0,30),r.structure.properties=i.slice(0,50)}}return r}cleanup(){let t=Date.now(),n=0;for(let[e,r]of this.cache.entries())t>r.expiresAt&&(this.cache.delete(e),n++);n>0&&e.debug(`Cleaned ${n} expired detailed data entries`)}evictLRU(){if(this.cache.size===0)return;let t=null,n=1/0;for(let[e,r]of this.cache.entries())r.lastAccessedAt<n&&(n=r.lastAccessedAt,t=e);if(t){let n=this.cache.get(t);this.cache.delete(t),e.info(`Evicted LRU entry: ${t}, last accessed: ${new Date(n.lastAccessedAt).toISOString()}, access count: ${n.accessCount}`)}}extend(t,n){let r=this.cache.get(t);if(!r)throw Error(`DetailId not found: ${t}`);let i=Date.now();if(i>r.expiresAt)throw Error(`DetailId already expired: ${t}`);let a=n||this.EXTEND_DURATION,o=Math.min(r.expiresAt+a,i+this.MAX_TTL);r.expiresAt=o,e.info(`Extended detailId ${t} by ${a/1e3}s, new expiry: ${new Date(o).toISOString()}`)}getStats(){let e=0,t=0,n=Array.from(this.cache.values());for(let r of n)e+=r.size,t+=r.accessCount;return{cacheSize:this.cache.size,maxCacheSize:this.MAX_CACHE_SIZE,defaultTTLSeconds:this.DEFAULT_TTL/1e3,maxTTLSeconds:this.MAX_TTL/1e3,totalSizeKB:(e/1024).toFixed(1),avgAccessCount:n.length>0?(t/n.length).toFixed(1):`0`,autoExtendEnabled:this.AUTO_EXTEND_ON_ACCESS,extendDurationSeconds:this.EXTEND_DURATION/1e3}}getDetailedStats(){let e=Date.now(),t=Array.from(this.cache.entries()).map(([t,n])=>({detailId:t,sizeKB:(n.size/1024).toFixed(1),createdAt:new Date(n.createdAt).toISOString(),lastAccessedAt:new Date(n.lastAccessedAt).toISOString(),expiresAt:new Date(n.expiresAt).toISOString(),remainingSeconds:Math.max(0,Math.floor((n.expiresAt-e)/1e3)),accessCount:n.accessCount,isExpired:e>n.expiresAt}));return t.sort((e,t)=>new Date(t.lastAccessedAt).getTime()-new Date(e.lastAccessedAt).getTime()),t}clear(){this.cache.clear(),e.info(`Cleared all detailed data cache`)}};export{i as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./chunk-C_pMuVsO.mjs";import{t}from"./logger-sBC6IdRT.mjs";import{t as n}from"./ToolCatalog-D_IKl1Hu.mjs";import{t as r}from"./types-CuyefmGT.mjs";import{createHash as i}from"node:crypto";import{existsSync as a,readFileSync as o}from"node:fs";import{basename as s,dirname as c,isAbsolute as l,join as u,relative as d,resolve as f}from"node:path";import{fileURLToPath as p,pathToFileURL as m}from"node:url";import{readFile as h}from"node:fs/promises";import{glob as ee}from"tinyglobby";function g(e){let t=e;for(;;){if(a(u(t,`package.json`)))return t;let e=c(t);if(e===t)break;t=e}return f(e,`..`,`..`,`..`,`..`)}const _=g(p(new URL(`.`,import.meta.url))),v=[u(_,`plugins`)],y=[u(_,`workflows`)];function b(e,t){let n=e?.trim();if(!n)return t;let r=n.split(`,`).map(e=>e.trim()).filter(Boolean);return r.length>0?[...new Set(r)]:t}function x(e,t=_){let n=e.map(e=>l(e)?e:f(t,e));return[...new Set(n)].toSorted((e,t)=>e.localeCompare(t))}function S(e){let t=e.trim().match(/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function C(e,t){let n=S(e),r=S(t);if(!n||!r)return null;let[i,a,o]=n,[s,c,l]=r;return i>s?1:i<s?-1:a>c?1:a<c?-1:o>l?1:o<l?-1:0}function te(e,t){let n=e.trim();if(!n||n===`*`)return!0;if(n.startsWith(`>=`)){let e=C(t,n.slice(2).trim());return e!==null&&e>=0}if(n.startsWith(`^`)){let e=n.slice(1).trim(),r=S(t),i=S(e);if(!r||!i)return!1;let a=C(t,e);return a!==null&&a>=0&&r[0]===i[0]}if(n.startsWith(`~`)){let e=n.slice(1).trim(),r=S(t),i=S(e);if(!r||!i)return!1;let a=C(t,e);return a!==null&&a>=0&&r[0]===i[0]&&r[1]===i[1]}let r=C(t,n);return r!==null&&r===0}async function ne(e){let t=await h(e);return i(`sha256`).update(t).digest(`hex`)}function w(e){return e.trim().toLowerCase().replace(/^0x/,``)}function T(e){return[`1`,`true`].includes(e.toLowerCase())}function E(){let e=process.env.MCP_PLUGIN_SIGNATURE_REQUIRED;return e===void 0||e.trim()===``?process.env.NODE_ENV===`production`:T(e)}function D(){let e=process.env.MCP_PLUGIN_STRICT_LOAD;return e===void 0||e.trim()===``?E():T(e)||E()}function O(e){let t=e?.trim();return t?new Set(t.split(`,`).map(e=>w(e)).filter(e=>e.length>0)):new Set}async function k(e,t){let n=[];return te(e.compatibleCoreRange,t)||n.push(`Plugin ${e.id} incompatible with core ${t}; requires ${e.compatibleCoreRange}`),{ok:n.length===0,errors:n,warnings:[]}}function A(e){if(!e||typeof e!=`object`)return!1;let t=e;return!!(typeof t.id==`string`&&typeof t.version==`string`&&Array.isArray(t.tools)&&(t.workflows===void 0||Array.isArray(t.workflows)))}function j(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.kind===`workflow-contract`&&t.version===1&&typeof t.id==`string`&&typeof t.displayName==`string`&&typeof t.build==`function`}function M(e){return e.endsWith(`.js`)||e.endsWith(`.mjs`)||e.endsWith(`.cjs`)}function N(e){return e.endsWith(`.ts`)||e.endsWith(`.mts`)||e.endsWith(`.cts`)}async function P(e,t){let n=new Set;for(let r of e){let e;try{e=await ee(`**/*`,{cwd:r,absolute:!0,onlyFiles:!0,dot:!0,ignore:[`**/node_modules/**`,`**/.git/**`,`**/.pnpm/**`]})}catch{continue}for(let r of e)t(s(r))&&n.add(r)}return[...n].toSorted((e,t)=>e.localeCompare(t))}function F(e,t){let n=e.replace(/\\/g,`/`).replace(/\/+/g,`/`).replace(/^\/+|\/+$/g,``).toLowerCase(),r=d(e,c(t)).replace(/^[/\\]+/,``).replace(/\\/g,`/`).replace(/\/+/g,`/`).replace(/^\/+|\/+$/g,``).toLowerCase();return!r||r===`dist`?`${n}::`:`${n}::${r.endsWith(`/dist`)?r.slice(0,-5):r}`}function I(e){return e.isJs?0:e.isTs?1:2}function re(e,t){if(!e||typeof e!=`object`)return!1;let n=e;if(n.version!==1||n.kind!==t||typeof n.slug!=`string`||typeof n.id!=`string`||!n.source||typeof n.source!=`object`)return!1;let r=n.source;return typeof r.type==`string`&&typeof r.repo==`string`&&typeof r.ref==`string`&&typeof r.commit==`string`&&typeof r.subpath==`string`&&typeof r.entry==`string`}async function L(e,t){let n=[];for(let[i,o]of e.entries()){let e=await P([o],e=>e===r);for(let r of e){let e;try{e=JSON.parse(await h(r,`utf8`))}catch{continue}if(!re(e,t))continue;let s=e.source.entry.trim();if(!s)continue;let l=f(c(r),s);a(l)&&n.push({file:l,key:F(o,l),isJs:M(l),isTs:N(l),rootIndex:i,priority:0})}}return n}function R(e){let t=new Map;for(let n of e.toSorted((e,t)=>e.file.localeCompare(t.file))){let e=t.get(n.key);if(!e){t.set(n.key,n);continue}let r=e.rootIndex,i=n.rootIndex,a=e.priority,o=n.priority,s=I(e),c=I(n);(i<r||i===r&&o<a||i===r&&o===a&&c<s||i===r&&o===a&&c===s&&n.file.localeCompare(e.file)<0)&&t.set(n.key,n)}return[...t.values()].map(e=>e.file).toSorted((e,t)=>e.localeCompare(t))}async function z(e){let t=await L(e,`plugin`);for(let[n,r]of e.entries()){let e=await P([r],e=>e===`manifest.js`||e===`manifest.ts`);for(let i of e)t.push({file:i,key:F(r,i),isJs:M(i),isTs:N(i),rootIndex:n,priority:1})}return R(t)}async function B(e){let t=await L(e,`workflow`);for(let[n,r]of e.entries()){let e=await P([r],e=>e.endsWith(`.workflow.js`)||e.endsWith(`.workflow.mjs`)||e.endsWith(`.workflow.cjs`)||e.endsWith(`.workflow.ts`)||e.endsWith(`.workflow.mts`)||e.endsWith(`.workflow.cts`)||e===`workflow.js`||e===`workflow.mjs`||e===`workflow.cjs`||e===`workflow.ts`||e===`workflow.mts`||e===`workflow.cts`);for(let i of e)t.push({file:i,key:F(r,i),isJs:M(i),isTs:N(i),rootIndex:n,priority:1})}return R(t)}function ie(e,t,n){let r=t.split(`.`).filter(Boolean),i=e.config;for(let e of r){if(!i||typeof i!=`object`)return n;i=i[e]}return i??n}function V(e,n){let r=new URL(m(e).href);return r.searchParams.set(`reloadTs`,String(Date.now())),t.debug(`[extensions] Loading fresh ${n} module: ${e}`),r.href}async function ae(e){let n=0;for(let[n,r]of e.extensionPluginRuntimeById.entries()){try{r.plugin.onDeactivateHandler&&r.state===`activated`&&(await r.plugin.onDeactivateHandler(r.lifecycleContext),r.state=`deactivated`)}catch(e){t.warn(`Plugin onDeactivate failed for "${n}":`,e)}try{r.plugin.onDeactivateHandler&&(r.state=`unloaded`)}catch(e){t.warn(`Plugin onUnload failed for "${n}":`,e)}}for(let r of e.extensionToolsByName.values()){try{r.registeredTool?.remove()}catch(e){t.warn(`Failed to remove extension tool "${r.name}":`,e)}e.router.removeHandler(r.name),e.activatedToolNames.delete(r.name),e.activatedRegisteredTools.delete(r.name),n++}return e.extensionToolsByName.clear(),e.extensionPluginsById.clear(),e.extensionPluginRuntimeById.clear(),e.extensionWorkflowsById.clear(),e.extensionWorkflowRuntimeById.clear(),n}function H(e,t,n){return{pluginRoots:t,workflowRoots:n,pluginCount:e.extensionPluginsById.size,workflowCount:e.extensionWorkflowsById.size,toolCount:e.extensionToolsByName.size,lastReloadAt:e.lastExtensionReloadAt,plugins:[...e.extensionPluginsById.values()],workflows:[...e.extensionWorkflowsById.values()],tools:[...e.extensionToolsByName.values()].map(e=>({name:e.name,domain:e.domain,source:e.source}))}}var oe=e({ensureWorkflowsLoaded:()=>le,listExtensions:()=>U,reloadExtensions:()=>ce});function U(e){return H(e,x(b(process.env.MCP_PLUGIN_ROOTS,v)),x(b(process.env.MCP_WORKFLOW_ROOTS,y)))}function W(e){try{let t=o(e,`utf-8`),n={};for(let e of t.split(/\r?\n/)){let t=e.trim();if(!t||t.startsWith(`#`))continue;let r=t.indexOf(`:`);if(r<1)continue;let i=t.slice(0,r).trim(),a=t.slice(r+1).trim();i&&(n[i]=a)}return n}catch{return{}}}function se(e){let t=e;for(;;){if(a(u(t,`.jshook-install.json`)))return t;let e=c(t);if(e===t)return null;t=e}}function G(e){let t=c(e);return se(t)||(s(t).toLowerCase()===`dist`?c(t):t)}let K=Promise.resolve();const q=new WeakSet,J=`MCP_PLUGIN_ALLOWED_DIGESTS is required when MCP_PLUGIN_SIGNATURE_REQUIRED=true or MCP_PLUGIN_STRICT_LOAD=true. The digest allowlist is the only pre-import trust boundary — without it, plugin code executes before integrity verification. No plugins will be loaded.`,Y=`[extensions] Loading plugins WITHOUT MCP_PLUGIN_ALLOWED_DIGESTS allowlist. Plugin code will execute on import() before post-load integrity checks. Set MCP_PLUGIN_STRICT_LOAD=true to enforce allowlist requirement.`;async function X(e){let t=K,n;K=new Promise(e=>{n=e}),await t;try{return await e()}finally{n()}}async function ce(e){return X(()=>de(e))}async function le(e){e.extensionWorkflowRuntimeById.size>0||q.has(e)||await X(async()=>{if(e.extensionWorkflowRuntimeById.size>0||q.has(e))return;q.add(e);let n=[],r=[],i=x(b(process.env.MCP_PLUGIN_ROOTS,v)),a=x(b(process.env.MCP_WORKFLOW_ROOTS,y));await ue(e,i,n,r),await Z(e,await B(a),n,r);for(let e of n)t.warn(`[extensions] ${e}`);for(let e of r)t.error(`[extensions] ${e}`)})}async function Z(e,t,n,r){for(let i of t)try{let t=await import(V(i,`workflow`)),r=t.default??t;if(!j(r)){n.push(`Skip workflow file without valid WorkflowContract: ${i}`);continue}Q(e,r,i,n)}catch(e){r.push(`Failed to import workflow file ${i}: ${String(e)}`)}}function Q(e,t,n,r){if(e.extensionWorkflowsById.has(t.id))return r.push(`Skip workflow "${t.id}" from ${n}: duplicate id`),!1;let i={id:t.id,displayName:t.displayName,source:n,description:t.description,tags:t.tags,timeoutMs:t.timeoutMs,defaultMaxConcurrency:t.defaultMaxConcurrency,route:t.route};e.extensionWorkflowsById.set(i.id,i);let a={workflow:t,source:n,route:t.route};return e.extensionWorkflowRuntimeById.set(i.id,a),!0}function $(e,t,n,r){return{id:e.id,name:e.pluginName,source:t,author:e.pluginAuthor||void 0,sourceRepo:e.pluginSourceRepo||void 0,domains:[],workflows:r,tools:n}}async function ue(e,n,r,i){let a=O(process.env.MCP_PLUGIN_ALLOWED_DIGESTS);if(D()&&a.size===0){i.push(J),t.error(`[extensions] `+J);return}a.size===0&&t.warn(Y);let o=await z(n),s=e.config?.mcp?.version??`0.0.0`;for(let t of o){let n;try{if(n=w(await ne(t)),a.size>0&&!a.has(n)){r.push(`Skip plugin file not in MCP_PLUGIN_ALLOWED_DIGESTS allowlist: ${t}`);continue}}catch(e){i.push(`Failed to hash plugin file ${t}: ${String(e)}`);continue}let o;try{let e=await import(V(t,`plugin`)),n=e.default??e;if(!A(n)){r.push(`Skip plugin file without valid ExtensionBuilder: ${t}`);continue}o=n}catch(e){i.push(`Failed to import plugin file ${t}: ${String(e)}`);continue}let c=W(u(G(t),`meta.yaml`));if(o.mergeMetadata(c),e.extensionPluginsById.has(o.id)){r.push(`Skip plugin "${o.id}" from ${t}: duplicate plugin id`);continue}try{let e=await k(o,s);if(r.push(...e.warnings),!e.ok){i.push(...e.errors);continue}}catch(e){i.push(`Failed to verify plugin ${o.id}: ${String(e)}`);continue}let l=[],d=Array.isArray(o.workflows)?o.workflows:[];for(let n of d){if(!j(n)){r.push(`Skip invalid workflow contribution from plugin "${o.id}" in ${t}`);continue}Q(e,n,`${t}#workflow:${n.id}`,r)&&l.push(n.id)}l.length!==0&&e.extensionPluginsById.set(o.id,$(o,t,[],l))}}async function de(e){let r=[],i=[],a=await ae(e),o=x(b(process.env.MCP_PLUGIN_ROOTS,v)),s=x(b(process.env.MCP_WORKFLOW_ROOTS,y)),c=O(process.env.MCP_PLUGIN_ALLOWED_DIGESTS);if(D()&&c.size===0){let n=J;return i.push(n),t.error(`[extensions] `+n),await Z(e,await B(s),r,i),e.lastExtensionReloadAt=new Date().toISOString(),{...H(e,o,s),addedTools:0,removedTools:a,warnings:r,errors:i}}c.size===0&&t.warn(Y);let l=new Set(n.map(e=>e.name)),d=await z(o),f=e.config?.mcp?.version??`0.0.0`;for(let n of d){let a;try{if(a=w(await ne(n)),c.size>0&&!c.has(a)){r.push(`Skip plugin file not in MCP_PLUGIN_ALLOWED_DIGESTS allowlist: ${n}`);continue}}catch(e){i.push(`Failed to hash plugin file ${n}: ${String(e)}`);continue}let o;try{let e=await import(V(n,`plugin`)),t=e.default??e;if(!A(t)){r.push(`Skip plugin file without valid ExtensionBuilder: ${n}`);continue}o=t}catch(e){i.push(`Failed to import plugin file ${n}: ${String(e)}`);continue}let s=G(n),d=W(u(s,`meta.yaml`));if(o.mergeMetadata(d),e.extensionPluginsById.has(o.id)){r.push(`Skip plugin "${o.id}" from ${n}: duplicate plugin id`);continue}try{let e=await k(o,f);if(r.push(...e.warnings),!e.ok){i.push(...e.errors);continue}}catch(e){i.push(`Failed to verify plugin ${o.id}: ${String(e)}`);continue}let p=new Map,m=new Set,h=`loaded`,ee=o.allowedTools.includes(`*`),g={pluginId:o.id,pluginRoot:s,config:e.config,get state(){return h},registerMetric(e){m.add(e)},async invokeTool(t,n={}){if(typeof t!=`string`||t.length===0)throw Error(`invokeTool requires a non-empty tool name`);if(!ee&&!o.allowedTools.includes(t))throw Error(`Plugin "${o.id}" is not allowed to invoke "${t}". Declare it in allowTool calls.`);if(!l.has(t))throw Error(`Plugin "${o.id}" can only invoke built-in tools. "${t}" is not built-in.`);if(!e.router.has(t))throw Error(`Tool "${t}" is not available in the current active profile.`);return e.executeToolWithTracking(t,n??{})},hasPermission(e){return!0},getConfig(t,n){return ie(e,t,n)},setRuntimeData(e,t){p.set(e,t)},getRuntimeData(e){return p.get(e)}},_={plugin:o,lifecycleContext:g,state:h,source:n};try{if(o.onLoadHandler&&await o.onLoadHandler(g),h=`loaded`,_.state=h,o.onValidateHandler){let e=await o.onValidateHandler(g);if(!e.valid){r.push(`Plugin ${o.id} validation failed: ${e.errors.join(`; `)}`);continue}h=`validated`,_.state=h}o.onActivateHandler&&(await o.onActivateHandler(g),h=`activated`,_.state=h),e.extensionPluginRuntimeById.set(o.id,_)}catch(e){try{o.onDeactivateHandler&&h===`activated`&&(await o.onDeactivateHandler(g),h=`deactivated`,_.state=h)}catch(e){t.warn(`Plugin onDeactivate failed during rollback for ${o.id}:`,e)}i.push(`Plugin lifecycle failed for ${o.id}: ${String(e)}`);continue}let v=o.tools.map(e=>e.name),y=[],b=Array.isArray(o.workflows)?o.workflows:[];for(let t of b){if(!j(t)){r.push(`Skip invalid workflow contribution from plugin "${o.id}" in ${n}`);continue}Q(e,t,`${n}#workflow:${t.id}`,r)&&y.push(t.id)}let x=$(o,n,v,y);e.extensionPluginsById.set(x.id,x)}if(await Z(e,await B(s),r,i),e.extensionToolsByName.size>0||a>0)try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed after extension reload:`,e)}return e.lastExtensionReloadAt=new Date().toISOString(),{...H(e,o,s),addedTools:e.extensionToolsByName.size,removedTools:a,warnings:r,errors:i}}export{ce as i,le as n,U as r,oe as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./chunk-C_pMuVsO.mjs";import{t}from"./logger-sBC6IdRT.mjs";import{$n as n,Bn as r,Fn as i,Gn as a,Hn as o,In as s,Jn as c,Kn as l,Ln as u,Pn as d,Qn as f,Rn as p,Un as m,Vn as h,Wn as g,Xn as _,Yn as v,Zn as y,a as b,ar as x,cr as S,dr as C,er as ee,fr as te,hr as ne,ir as re,nr as ie,or as ae,pr as w,qn as T,rr as oe,sr as E,tr as D,ur as O,zn as se}from"./constants-Cp6hBrrx.mjs";import{r as k}from"./response-C7rKQst4.mjs";import{c as A,d as ce,f as le,i as ue,l as de,n as j,p as M,r as N,s as P,t as F}from"./ToolCatalog-D_IKl1Hu.mjs";import{t as I}from"./ProcessRegistry-Hf12LlR9.mjs";import{t as L}from"./search-defaults-D2bY-rzH.mjs";import{Worker as R}from"worker_threads";function z(e,t){return P(e,t)}function B(e,n,r,i){if(fe(e,n),r<=0)return;let a=r*60*1e3,o=new Set(i),s=setTimeout(()=>{t.info(`Domain "${n}" TTL expired (${r}min) — auto-deactivating ${o.size} tools`),U(e,n).catch(e=>{t.error(`Failed to deactivate domain "${n}" on TTL expiry:`,e)})},a);e.domainTtlEntries.set(n,{timer:s,ttlMs:a,toolNames:o})}function V(e,n){let r=e.domainTtlEntries.get(n);if(!r)return;clearTimeout(r.timer);let i=r.ttlMs/6e4;r.timer=setTimeout(()=>{t.info(`Domain "${n}" TTL expired (${i}min) — auto-deactivating`),U(e,n).catch(e=>{t.error(`Failed to deactivate domain "${n}" on TTL expiry:`,e)})},r.ttlMs)}function H(e,t){let n=N(t);if(!n){let r=e.extensionToolsByName.get(t);r&&(n=r.domain)}n&&e.domainTtlEntries.has(n)&&V(e,n)}function fe(e,t){let n=e.domainTtlEntries.get(t);n&&(clearTimeout(n.timer),e.domainTtlEntries.delete(t))}async function U(e,n){let r=e.domainTtlEntries.get(n);if(!r)return;let i=r.toolNames;e.domainTtlEntries.delete(n);let a=0;for(let n of i){if(!e.activatedToolNames.has(n))continue;let r=e.activatedRegisteredTools.get(n);if(r)try{r.remove()}catch(e){t.warn(`Failed to remove tool "${n}" on domain TTL expiry:`,e)}e.router.removeHandler(n),e.activatedToolNames.delete(n),e.activatedRegisteredTools.delete(n);let i=e.extensionToolsByName.get(n);i&&(i.registeredTool=void 0),a++}if(a>0){e.enabledDomains.delete(n);for(let t of e.activatedToolNames)if(N(t)===n){e.enabledDomains.add(n);break}for(let t of e.selectedTools)if(N(t.name)===n){e.enabledDomains.add(n);break}try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed after domain TTL expiry:`,e)}t.info(`Domain "${n}" deactivated: removed ${a} tools`)}}const pe=[[`navigate`,`go`,`open`,`visit`,`browse`,`load`],[`intercept`,`capture`,`monitor`,`sniff`,`collect`,`record`,`track`],[`request`,`fetch`,`xhr`,`ajax`,`http`,`api`],[`authenticate`,`auth`,`login`,`credential`,`token`,`jwt`,`session`],[`breakpoint`,`pause`,`halt`,`stop`,`break`],[`step`,`next`,`continue`,`resume`],[`deobfuscate`,`beautify`,`unminify`,`decode`,`transform`,`decompile`],[`screenshot`,`snapshot`,`image`,`picture`,`photo`],[`evaluate`,`execute`,`run`,`eval`,`invoke`,`call`],[`element`,`node`,`selector`,`dom`,`component`],[`click`,`tap`,`press`,`interact`,`trigger`],[`type`,`input`,`enter`,`fill`,`write`],[`cookie`,`localstorage`,`storage`,`cache`,`indexeddb`],[`websocket`,`ws`,`socket`,`realtime`],[`scroll`,`swipe`,`drag`],[`search`,`find`,`query`,`lookup`,`discover`,`locate`],[`hook`,`patch`,`override`,`replace`,`wrap`,`proxy`],[`script`,`code`,`source`,`javascript`,`js`],[`bundle`,`webpack`,`module`,`pack`,`chunk`],[`block`,`filter`,`deny`,`reject`,`prevent`],[`allow`,`permit`,`whitelist`,`accept`,`enable`],[`remove`,`delete`,`clear`,`clean`,`purge`,`erase`],[`list`,`show`,`display`,`enumerate`,`get`],[`set`,`configure`,`config`,`setup`,`assign`],[`stealth`,`antidetect`,`fingerprint`,`evasion`,`undetected`],[`mobile`,`device`,`emulate`,`responsive`,`phone`],[`performance`,`profile`,`benchmark`,`metric`,`vitals`],[`register`,`signup`,`account`,`enroll`,`join`],[`captcha`,`challenge`,`verification`,`verify`,`solve`],[`tab`,`window`,`page`],[`inspect`,`examine`,`analyze`,`analyse`,`debug`,`investigate`],[`wait`,`delay`,`sleep`,`timeout`,`poll`],[`close`,`disconnect`,`quit`,`exit`,`shutdown`,`terminate`],[`traffic`,`network`,`request`,`response`,`connection`],[`heap`,`memory`,`allocation`,`gc`,`garbage`],[`export`,`save`,`dump`,`download`,`extract`],[`replay`,`resend`,`repeat`,`redo`,`retry`],[`variable`,`scope`,`local`,`closure`,`context`],[`watch`,`observe`,`monitor`,`trace`,`track`],[`protobuf`,`proto`,`binary`,`msgpack`,`grpc`],[`wasm`,`webassembly`,`assembly`],[`sse`,`eventsource`,`stream`,`streaming`],[`graphql`,`gql`,`introspect`,`mutation`,`subscription`],[`v8`,`heap`,`snapshot`,`bytecode`,`jit`,`turbofan`,`ignition`,`hiddenclass`],[`tls`,`ssl`,`boringssl`,`cert`,`certificate`,`pinning`,`handshake`,`keylog`],[`skia`,`gpu`,`render`,`scenegraph`,`scene`,`draw`,`paint`,`raster`,`layer`],[`frida`,`ghidra`,`ida`,`unidbg`,`jadx`,`binary`,`disassemble`,`decompile`,`instrument`],[`mojo`,`ipc`,`chromium`,`interface`,`broker`,`message`],[`syscall`,`etw`,`strace`,`dtrace`,`kernel`,`systemcall`,`tracefs`],[`adb`,`android`,`webview`,`apk`,`dalvik`,`art`,`emulator`],[`extension`,`plugin`,`addon`,`webhook`,`c2`,`bluetooth`,`ble`,`hid`,`serial`,`registry`]];var me=class e{reverseMap;constructor(){this.reverseMap=e.buildReverseMap(pe)}expand(e){let t=this.reverseMap.get(e.toLowerCase());return t?[...t]:[]}expandQuery(e){let t=new Set(e.map(e=>e.toLowerCase())),n=[],r=ee;for(let i of e){let e=this.reverseMap.get(i.toLowerCase());if(!e)continue;let a=0;for(let i of e){if(a>=r)break;t.has(i)||(n.push(i),t.add(i),a++)}}return n}static buildReverseMap(e){let t=new Map;for(let n of e)for(let e of n){let r=e.toLowerCase(),i=t.get(r);i||(i=new Set,t.set(r,i));for(let e of n){let t=e.toLowerCase();t!==r&&i.add(t)}}return t}};const he=p,ge=u;var _e=class e{queryCategoryProfiles;cjkQueryAliases;synonymExpander;constructor(t){this.queryCategoryProfiles=t?.queryCategoryProfiles===void 0?e.compileQueryCategoryProfiles(L.queryCategoryProfiles):e.compileQueryCategoryProfiles(t.queryCategoryProfiles),this.cjkQueryAliases=t?.cjkQueryAliases===void 0?e.compileCjkQueryAliasRules(L.cjkQueryAliases):e.compileCjkQueryAliasRules(t.cjkQueryAliases),this.synonymExpander=new me}static compileQueryCategoryProfiles(e){return e.flatMap(e=>{if(!e||typeof e.pattern!=`string`||!Array.isArray(e.domainBoosts))return[];let t;try{t=new RegExp(e.pattern,e.flags)}catch{return[]}let n=new Map(e.domainBoosts.flatMap(e=>!e||typeof e.domain!=`string`||e.domain.length===0||typeof e.weight!=`number`||!Number.isFinite(e.weight)?[]:[[e.domain,e.weight]]));return[{pattern:t,domainBoosts:n}]})}static compileCjkQueryAliasRules(e){return e.flatMap(e=>{if(!e||typeof e.pattern!=`string`||!Array.isArray(e.tokens))return[];let t;try{t=new RegExp(e.pattern,e.flags)}catch{return[]}let n=e.tokens.filter(e=>typeof e==`string`&&e.length>0);return[{pattern:t,tokens:n}]})}detectQueryCategoryBoosts(e){let t=new Map;for(let n of this.queryCategoryProfiles)if(n.pattern.test(e))for(let[e,r]of n.domainBoosts){let n=t.get(e)??1;t.set(e,Math.max(n,r))}return t}expandCjkAliasTokens(e){let t=e.toLowerCase(),n=new Set;for(let e of this.cjkQueryAliases)if(e.pattern.test(t))for(let t of e.tokens)n.add(t);return[...n]}tokenise(e,t){let n=e.replace(/[_-]/g,` `);n=n.replace(/([\u4e00-\u9fff])/g,` $1 `);let r=n.split(/[^a-zA-Z0-9\u4e00-\u9fff]+/).filter(Boolean),i=[];for(let e of r){let t=e.toLowerCase(),n=e.replace(/([a-z])([A-Z])/g,`$1 $2`).split(/\s+/);if(n.length>1){for(let e of n)i.push(e.toLowerCase());i.push(t)}else i.push(t)}return i.push(...this.expandCjkAliasTokens(e)),t?.expandSynonyms&&i.push(...this.synonymExpander.expandQuery(i)),i}getK1(){return he}getB(){return ge}},ve=class{worker=null;ready=!1;nextId=0;pending=new Map;isReady(){return this.ready}async embed(e){this.ensureWorker();let t=this.nextId++;return new Promise((n,r)=>{this.pending.set(t,{resolve:n,reject:r}),this.worker.postMessage({type:`embed`,id:t,text:e})})}async embedBatch(e){if(e.length===0)return[];this.ensureWorker();let t=this.nextId++;return new Promise((n,r)=>{this.pending.set(t,{resolve:n,reject:r}),this.worker.postMessage({type:`embed_batch`,id:t,texts:e})})}async terminate(){if(this.worker){for(let[,e]of this.pending)e.reject(Error(`EmbeddingEngine terminated`));this.pending.clear(),await this.worker.terminate(),this.worker=null,this.ready=!1}}ensureWorker(){if(this.worker)return;let e=new URL(`./EmbeddingWorker.js`,import.meta.url);this.worker=new R(e),typeof this.worker.unref==`function`&&this.worker.unref(),I.register(this.worker),this.worker.on(`message`,e=>{let t=this.pending.get(e.id);t&&(this.pending.delete(e.id),e.type===`result`?(this.ready=!0,t.resolve(e.embedding)):e.type===`error`&&t.reject(Error(e.message??`Unknown worker error`)))}),this.worker.on(`error`,e=>{for(let[,t]of this.pending)t.reject(e);this.pending.clear(),this.worker=null,this.ready=!1}),this.worker.on(`exit`,e=>{if(e!==0){let t=Error(`Embedding worker exited with code ${e}`);for(let[,e]of this.pending)e.reject(t);this.pending.clear()}this.worker=null,this.ready=!1})}},W=class e{compiledRules;constructor(t){this.compiledRules=t===void 0?e.compileIntentToolBoostRules(L.intentToolBoostRules):e.compileIntentToolBoostRules(t)}static compileIntentToolBoostRules(e){let t=[];for(let n of e){if(!n||typeof n.pattern!=`string`||!Array.isArray(n.boosts)||n.boosts.length===0)continue;let e;try{e=new RegExp(n.pattern,n.flags??`i`)}catch{continue}let r=n.boosts.filter(e=>e&&typeof e.tool==`string`&&e.tool.length>0).map(e=>({tool:e.tool,bonus:Number.isFinite(e.bonus)?e.bonus:0})).filter(e=>e.bonus>0);r.length!==0&&t.push({pattern:e,boosts:r})}return t}resolveIntentToolBonuses(e){let t=e.toLowerCase(),n=new Map;for(let e of this.compiledRules)if(e.pattern.test(t))for(let{tool:t,bonus:r}of e.boosts){let e=n.get(t)??0;n.set(t,Math.max(e,r))}return n}getCompiledRules(){return this.compiledRules}},ye=class e{trigramSets;constructor(t){this.trigramSets=t.map(t=>e.extractTrigrams(t))}search(t,n=x){let r=e.extractTrigrams(t);if(r.size===0)return new Map;let i=new Map;for(let t=0;t<this.trigramSets.length;t++){let a=this.trigramSets[t];if(a.size===0)continue;let o=e.jaccardSimilarity(r,a);o>=n&&i.set(t,o)}return i}static extractTrigrams(e){let t=e.toLowerCase().replace(/[_\-\s]+/g,``),n=new Set;for(let e=0;e<=t.length-3;e++)n.add(t.slice(e,e+3));return n}static jaccardSimilarity(e,t){let n=0,[r,i]=e.size<=t.size?[e,t]:[t,e];for(let e of r)i.has(e)&&n++;let a=e.size+t.size-n;return a===0?0:n/a}};const G=.1,K=.8;var be=class{vectorWeight;lastVectorRanking=null;topN;learnUp;learnDown;constructor(e){this.vectorWeight=e?.vectorCosineWeight??S,this.topN=Math.max(1,te),this.learnUp=Math.max(0,w),this.learnDown=Math.max(0,C)}getVectorWeight(){return this.vectorWeight}recordVectorRanking(e){this.lastVectorRanking=e}recordToolCallFeedback(e,t){if(!this.lastVectorRanking||!t)return!1;let n=this.lastVectorRanking.get(e),r=this.vectorWeight;return n===void 0?this.vectorWeight=Math.max(G,this.vectorWeight-this.learnDown):n<this.topN?this.vectorWeight=Math.min(K,this.vectorWeight+this.learnUp):n<this.topN*2?this.vectorWeight=Math.min(K,this.vectorWeight+this.learnUp*.3):this.vectorWeight=Math.max(G,this.vectorWeight-this.learnDown),this.vectorWeight!==r}};const xe=new Set(`the.a.an.is.are.was.were.be.been.to.of.in.for.on.with.at.by.from.or.and.not.this.that.it.its.if.as.will.can.may.must.should.would.could.e.g.default.optional.required.when.set`.split(`.`)),q={extractParamTokens(e){let t=[];if(!e||typeof e!=`object`)return t;let n=e.properties;if(!n||typeof n!=`object`)return t;for(let[e,r]of Object.entries(n)){let n=e.replace(/([a-z])([A-Z])/g,`$1 $2`).split(/[\s_-]+/);for(let e of n){let n=e.toLowerCase();n.length>1&&t.push(n)}if(r&&typeof r==`object`){let e=r.description;if(typeof e==`string`){let n=e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);for(let e of n)e.length>2&&!xe.has(e)&&t.push(e)}}}return t},extractShortDescription(e){if(!e)return``;let t=e.match(/^[^.!?\n]+[.!?]?/);if(t){let e=t[0].trim();return e.length>120?e.slice(0,117)+`...`:e}return e.length>120?e.slice(0,117)+`...`:e},containsCJK(e){return/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/.test(e)},normalizeToolName(e){return e.toLowerCase().replace(/[\s-]+/g,`_`)}};function J(e,t,n){if(!t)return-1;let r=e.indexOf(t);for(;r>=0;){let i=r>0?e[r-1]:null,a=r+t.length<e.length?e[r+t.length]:null,o=i===null||!n.test(i),s=a===null||!n.test(a);if(o&&s)return r;r=e.indexOf(t,r+1)}return-1}function Se(e){let t=new Map,n=new Map;for(let t=0;t<e.length;t++){let r=e[t].name,i=r.indexOf(`_`);if(i<=0)continue;let a=r.slice(0,i),o=n.get(a)??[];o.push(t),n.set(a,o)}for(let[,e]of n){if(e.length<2||e.length>15)continue;let n=d/Math.sqrt(e.length);for(let r of e){let i=t.get(r)??[];for(let t of e)t!==r&&i.push({docIndex:t,weight:n});t.set(r,i)}}return t}function Ce(e){let t=[];for(let n=0;n<e.length;n++)e[n]>0&&t.push({idx:n,score:e[n]});t.sort((e,t)=>t.score-e.score);let n=new Map;for(let e=0;e<t.length;e++)n.set(t[e].idx,e);return n}function Y(e){let t=[...e.entries()].toSorted((e,t)=>t[1]-e[1]),n=new Map;for(let e=0;e<t.length;e++)n.set(t[e][0],e);return n}function we(e,t){for(let n=0;n<e.length;n++){let r=t[n];r<=0||(e[n]=e[n]+r*f*_)}}function Te(e){let{scores:t,docs:n,affinityGraph:r}=e,a=[];for(let e=0;e<t.length;e++)t[e]>0&&a.push({idx:e,score:t[e]});if(a.length!==0){if(a.sort((e,t)=>t.score-e.score),r.size>0){let e=Math.min(s,a.length);for(let n=0;n<e;n++){let{idx:e,score:o}=a[n],s=r.get(e);if(!s)continue;let c=1/(1+n);for(let{docIndex:e,weight:n}of s)t[e]>0&&(t[e]+=o*n*c*i)}}if(o>0&&a.length>=o){let e=a.slice(0,10),r=new Map;for(let{idx:t}of e){let e=n[t].domain;e&&r.set(e,(r.get(e)??0)+1)}for(let[e,i]of r)if(!(i<o))for(let r=0;r<n.length;r++)t[r]>0&&n[r].domain===e&&(t[r]*=h)}}}function Ee(e,t,n,r){return`${`${e}\0${t}`}${!n||n.size===0?``:`\0${[...n].toSorted().join(`|`)}`}${r?`\0${r}`:``}`}var De=class{capacity;map=new Map;constructor(e){this.capacity=Math.max(1,e)}get(e){let t=this.map.get(e);return t!==void 0&&(this.map.delete(e),this.map.set(e,t)),t}set(e,t){if(this.map.delete(e),this.map.set(e,t),this.map.size>this.capacity){let e=this.map.keys().next().value;this.map.delete(e)}}clear(){this.map.clear()}},Oe=class{docs=[];invertedIndex=new Map;sortedKeys;avgDocLength;docCount;domainOverrides;domainScoreMultipliers;toolScoreMultipliers;extensionEtag=``;docNameIndex=new Map;affinityGraph;queryCache;trigramIndex;embeddingEngine;toolEmbeddings=null;feedbackTracker;recencyTracker=new Map;bm25Scorer;intentBoost;constructor(e,t,r,i,a,o){let s=e??F;this.domainOverrides=t,this.domainScoreMultipliers=r,this.toolScoreMultipliers=i,this.docCount=s.length,this.bm25Scorer=new _e(a);let c=a?.vectorEnabled??O;this.embeddingEngine=c?new ve:null,this.feedbackTracker=new be(a),this.intentBoost=new W(a?.intentToolBoostRules);let u=0;for(let e=0;e<s.length;e++){let t=s[e],r=this.domainOverrides?.get(t.name)??N(t.name),i=t.description??``,a=q.extractShortDescription(i),c=this.bm25Scorer.tokenise(t.name),l=new Set(c),d=r?this.bm25Scorer.tokenise(r):[],f=this.bm25Scorer.tokenise(i),p=q.extractParamTokens(t.inputSchema),m=[...c,...d,...f,...p],h={name:t.name,domain:r,description:i,shortDescription:a,tokens:m,length:m.length,nameTokens:c,nameTokenSet:l,nameTokenCount:l.size};this.docs.push(h),this.docNameIndex.set(t.name,e),u+=h.length;let _=new Map;for(let e of c){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,3),_.set(e,t)}for(let e of d){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,2),_.set(e,t)}for(let e of f){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,1),_.set(e,t)}for(let e of p){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,g),_.set(e,t)}let v=o?.get(t.name);if(v)for(let e of v){let t=_.get(e)??{tf:0,weight:0};t.tf++,t.weight=Math.max(t.weight,n),_.set(e,t)}for(let[t,{tf:n,weight:r}]of _){let i=this.invertedIndex.get(t);i||(i=[],this.invertedIndex.set(t,i)),i.push({docIndex:e,tf:n,weight:r})}}this.avgDocLength=this.docCount>0?u/this.docCount:1,this.sortedKeys=[...this.invertedIndex.keys()].toSorted(),this.affinityGraph=Se(this.docs),this.trigramIndex=new ye(this.docs.map(e=>e.name)),this.queryCache=new De(l)}async search(e,t=10,n,i,o){let s=this.bm25Scorer.tokenise(e);if(s.length===0)return[];if(s.length>6){let e=s.filter(e=>this.invertedIndex.has(e));if(e.length>=3){let t=e.map(e=>{let t=this.invertedIndex.get(e).length;return{token:e,idf:Math.log((this.docCount-t+.5)/(t+.5)+1)}});t.sort((e,t)=>t.idf-e.idf);let n=new Set(t.slice(0,6).map(e=>e.token));s=s.filter(e=>n.has(e))}}let c=this.bm25Scorer.tokenise(s.join(` `),{expandSynonyms:!0}).filter(e=>!s.includes(e));s.push(...c);let l=(()=>{let t=e.toLowerCase();if(!/(?:\b(?:call|use|run|invoke|execute)\b|调用|执行|使用|运行)/i.test(t))return null;let n=/[a-z0-9_]/,r=/[a-z0-9]/,i=null,a=1/0;for(let e of this.docNameIndex.keys()){let o=J(t,e,n);o<0&&e.includes(`_`)&&(o=J(t,e.replace(/_/g,`-`),r),o<0&&(o=J(t,e.replace(/_/g,` `),r))),!(o<0)&&(o<a||o===a&&e.length>(i?.length??0))&&(i=e,a=o)}return i})(),u=Ee(e,t,i,this.extensionEtag),d=this.queryCache.get(u);if(d&&this.isCachedEntryFresh(d)){let e=n??new Set;return d.results.map(t=>({...t,isActive:e.has(t.name)}))}let f=this.intentBoost.resolveIntentToolBonuses(e),p=new Float64Array(this.docCount);for(let e of s)if(this.scoreToken(e,p),e.length>=3){let t=this.findPrefixMatches(e);for(let n of t)if(n!==e){let e=this.invertedIndex.get(n);e&&this.scorePostings(e,this.docCount,p,a)}}await this.applyRRFFusion(s,e,p);let h=this.bm25Scorer.detectQueryCategoryBoosts(e),g=e.toLowerCase().replace(/[\s-]+/g,`_`),_=new Set(s);for(let e=0;e<this.docCount;e++){let t=this.docs[e],n=f.get(t.name)??0;if(p[e]<=0&&n<=0)continue;if(t.name===g){p[e]*=m;continue}let i=0;for(let e of s)t.nameTokenSet.has(e)&&i++;if(i>0&&t.nameTokenCount>0&&_.size>0){let n=i/t.nameTokenCount,a=i/_.size;p[e]*=1+r*n*a}let a=t.domain?this.domainScoreMultipliers?.get(t.domain)??1:1;if(a!==1&&(p[e]*=a),t.domain&&h.size>0){let n=h.get(t.domain);n!==void 0&&n>1&&(p[e]*=n)}let o=this.toolScoreMultipliers?.get(t.name)??1;o!==1&&(p[e]*=o)}if(this.applyIntentBonusBand(p,f),this.applyGraphExpansion(p),this.applyRecencyBoost(p),this.applyTierPenalty(p,i,o),l){let e=this.docNameIndex.get(l);if(e!==void 0){let t=0;for(let e=0;e<this.docCount;e++){let n=p[e];n>t&&(t=n)}let n=Math.max(1,t+1);p[e]+=n}}let v=n??new Set,y=[];for(let e=0;e<this.docCount;e++)if(p[e]>0){let t=this.docs[e];y.push({name:t.name,domain:t.domain,shortDescription:t.shortDescription,score:Math.round(p[e]*1e3)/1e3,isActive:v.has(t.name)})}y.sort((e,t)=>t.score-e.score);let b=y.slice(0,t);return this.queryCache.set(u,{results:b,vectorWeightAtCache:this.feedbackTracker.getVectorWeight(),cachedAtMs:Date.now()}),b}isCachedEntryFresh(e){let t=this.feedbackTracker.getVectorWeight();return Math.abs(t-e.vectorWeightAtCache)<=se}applyRecencyBoost(e){if(T<=0||this.recencyTracker.size===0)return;let t=v;if(t<=0)return;let n=Date.now(),r=T;for(let[i,a]of this.recencyTracker){let o=n-a;if(o<0||o>t)continue;let s=this.docNameIndex.get(i);if(s===void 0||e[s]<=0)continue;let c=1+r*(1-o/t);e[s]*=c}}applyTierPenalty(e,t,n){if(!t||t.size===0)return;let r=n?n===`full`?ie:n===`workflow`?re:oe:D;if(!(r>=1||r<=0))for(let n=0;n<this.docCount;n++){if(e[n]<=0)continue;let i=this.docs[n].domain;i&&(t.has(i)||(e[n]*=r))}}getDomainSummary(){let e=new Map;for(let t of this.docs){let n=e.get(t.domain)??[];n.push(t.name),e.set(t.domain,n)}return Array.from(e.entries()).map(([e,t])=>({domain:e,count:t.length,tools:t})).toSorted((e,t)=>t.count-e.count)}scoreToken(e,t){let n=this.invertedIndex.get(e);n&&this.scorePostings(n,this.docCount,t,1)}findPrefixMatches(e){let t=this.sortedKeys,n=0,r=t.length;for(;n<r;){let i=n+r>>>1;t[i]<e?n=i+1:r=i}let i=[];for(;n<t.length&&t[n].startsWith(e);)i.push(t[n]),n++;return i}scorePostings(e,t,n,r){let i=e.length,a=Math.log((this.docCount-i+.5)/(i+.5)+1),o=u,s=p;for(let{docIndex:t,tf:i,weight:c}of e){let e=this.docs[t],l=1-o+o*(e.length/this.avgDocLength),u=i*(s+1)/(i+s*l);n[t]+=a*u*c*r}}async applyRRFFusion(e,t,n){let r=y,i=ae,a=Ce(n),o=Y(this.trigramIndex.search(t,x)),s,c;if(E>0&&a.size>0){let e=[...a.entries()].find(([,e])=>e===0)?.[0];(e===void 0?0:n[e])>=E?(s=new Map,c=new Map):(s=await this.computeVectorCosineScores(t),c=Y(s))}else s=await this.computeVectorCosineScores(t),c=Y(s);let l=new Map;for(let[e,t]of c)l.set(this.docs[e].name,t);this.feedbackTracker.recordVectorRanking(l);let u=new Float64Array(this.docCount);for(let e=0;e<this.docCount;e++){let t=0,n=a.get(e);n!==void 0&&(t+=1/(r+n));let s=o.get(e);s!==void 0&&i>0&&(t+=i*(1/(r+s)));let l=c.get(e);l!==void 0&&this.feedbackTracker.getVectorWeight()>0&&(t+=this.feedbackTracker.getVectorWeight()*(1/(r+l))),u[e]=t}we(n,u)}async ensureToolEmbeddings(){if(this.toolEmbeddings||!this.embeddingEngine)return;let e=this.docs.map(e=>`${e.name.replace(/_/g,` `)}: ${e.description}`);this.toolEmbeddings=await this.embeddingEngine.embedBatch(e)}async computeVectorCosineScores(e){if(!this.embeddingEngine)return new Map;try{await this.ensureToolEmbeddings()}catch{return new Map}if(!this.toolEmbeddings)return new Map;let t;try{t=await this.embeddingEngine.embed(e)}catch{return new Map}let n=new Map;for(let e=0;e<this.toolEmbeddings.length;e++){let r=this.toolEmbeddings[e],i=0;for(let e=0;e<t.length;e++)i+=t[e]*r[e];i>0&&n.set(e,i)}return n}recordToolCallFeedback(e,t){for(this.feedbackTracker.recordToolCallFeedback(e,!!this.embeddingEngine),this.recencyTracker.delete(e),this.recencyTracker.set(e,Date.now());this.recencyTracker.size>c;){let e=this.recencyTracker.keys().next().value;if(e===void 0)break;this.recencyTracker.delete(e)}}applyIntentBonusBand(e,t){if(t.size===0)return;let n=0;for(let t=0;t<this.docCount;t++)n=Math.max(n,e[t]);let r=0;for(let e of t.values())r=Math.max(r,e);if(r<=0)return;let i=Math.max(1,n+1),a=[...new Set([...t.values()].filter(e=>e>0))].toSorted((e,t)=>e-t),o=new Map;for(let e=0;e<a.length;e++)o.set(a[e],e+1);for(let[n,r]of t){if(r<=0)continue;let t=this.docNameIndex.get(n);if(t===void 0)continue;let a=o.get(r);a!==void 0&&(e[t]+=i*a)}}applyGraphExpansion(e){Te({scores:e,docs:this.docs,affinityGraph:this.affinityGraph})}};function X(e){let t=new Set(e.selectedTools.map(e=>e.name));for(let n of e.activatedToolNames)t.add(n);return t}function ke(e){let t=new Set(j(e.baseTier));for(let n of e.enabledDomains)t.add(n);for(let n of e.extensionToolsByName.values())t.add(n.domain);for(let n of X(e)){let r=e.extensionToolsByName.get(n)?.domain;if(r){t.add(r);continue}let i=N(n);i&&t.add(i)}return t}function Ae(e){return e.baseTier}function je(e){let t=new Map;for(let n of e.extensionToolsByName.values())t.set(n.name,n.domain);return t}async function Z(e){await A();let t=new Map(F.map(e=>[e.name,e]));for(let n of e.extensionToolsByName.values())t.set(n.name,n.tool);return[...t.values()]}async function Me(e){return new Map((await Z(e)).map(e=>[e.name,e]))}const Q=new WeakMap;function Ne(){let e=new Map;for(let t of le())if(t.sceneKeywords)for(let[n,r]of Object.entries(t.sceneKeywords))r.length>0&&e.set(n,r);return e}function Pe(e){let t=[];for(let[n,r]of e.extensionToolsByName)t.push(`${n}:${r.domain}`);return t.sort(),[e.extensionWorkflowRuntimeById.size,t.join(`|`)].join(`::`)}async function Fe(e){await A();let t=Pe(e),n=Q.get(e);if(n?.signature===t)return n.engine;let r=await Z(e),i=je(e),a=new Map,o=new Map;for(let t of e.extensionToolsByName.values())o.set(t.name,1.12);e.extensionWorkflowRuntimeById.size>0&&(a.set(`workflow`,ne),o.set(`run_extension_workflow`,1.35),o.set(`list_extension_workflows`,1.25));let s=new Oe(r,i,a,o,e.config.search,Ne());return s.extensionEtag=t,Q.set(e,{signature:t,engine:s}),s}function Ie(e){let t={};for(let e of M())t[e.domain]=(t[e.domain]??0)+1;for(let n of e.extensionToolsByName.values())t[n.domain]=(t[n.domain]??0)+1;let n=M().length,r=e.extensionToolsByName.size;return`Search ${n+r} tools across ${Object.keys(t).length} capability domains. This includes built-in tools plus any loaded plugin/workflow tools (${r} currently loaded). In search-tier sessions, call this before assuming a capability is unavailable. Use activate_tools for exact matches, activate_domain for an entire domain. Domains: ${Object.entries(t).toSorted((e,t)=>t[1]-e[1]).map(([e,t])=>`${e} (${t})`).join(` | `)}. Query tip: before searching, distill your intent into key concepts (action verb + target + domain). Pass distilled keywords, not full sentences — the search engine works on token matching, not semantic understanding.`}var Le=e({handleActivateDomain:()=>$});async function $(e,n){let r=typeof n.domain==`string`?n.domain:``;if(!r)return k(JSON.stringify({success:!1,error:`domain must be a non-empty string`}));let i=new Set(ce());for(let t of e.extensionToolsByName.values())i.add(t.domain);if(!i.has(r))return k(JSON.stringify({success:!1,error:`Unknown domain "${r}". Valid: ${[...i].join(`, `)}`}));await de(r);let a=typeof n.ttlMinutes==`number`?n.ttlMinutes:b,o=[...ue([r]),...[...e.extensionToolsByName.values()].filter(e=>e.domain===r).map(e=>e.tool)],s=X(e),c=[];e.enabledDomains.add(r);for(let t of o){if(s.has(t.name))continue;let n=e.registerSingleTool(t);e.activatedToolNames.add(t.name),e.activatedRegisteredTools.set(t.name,n);let r=e.extensionToolsByName.get(t.name);r&&(r.registeredTool=n),c.push(t.name)}if(c.length>0){let n=new Set(c.filter(t=>!e.extensionToolsByName.has(t)));if(n.size>0){let t=z(e.handlerDeps,n);e.router.addHandlers(t)}for(let t of c){let n=e.extensionToolsByName.get(t);n?.handler&&e.router.addHandlers({[t]:n.handler})}B(e,r,a,c);try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed:`,e)}}return t.info(`activate_domain: domain="${r}", activated ${c.length} tools, ttl=${a}min`),k(JSON.stringify({success:!0,domain:r,activated:c.length,activatedTools:c,totalDomainTools:o.length,ttlMinutes:a>0?a:`no expiry`,hint:c.length>0?`Tools activated. If they do not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke them.`:void 0}))}export{Ae as a,ke as c,X as i,H as l,$ as n,Fe as o,Ie as r,Me as s,Le as t,z as u};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{Z as e,Zr as t}from"./constants-Cp6hBrrx.mjs";import{_ as n,b as r,d as i,m as a,t as o,u as s}from"./Win32API-Bhi5xFBe.mjs";import{i as c}from"./NativeMemoryManager.utils-DM4NC3FE.mjs";import{randomUUID as l}from"node:crypto";var u=class{freezes=new Map;writeHistory=[];undoneStack=[];async writeValue(e,u,d,f){let p=BigInt(u.startsWith(`0x`)?u:`0x${u}`),{patternBytes:m}=c(d,f),h=Buffer.from(m),g=r(e,!0);try{let r=i(g,p,h.length),{oldProtect:o}=a(g,p,h.length,s.READWRITE);n(g,p,h),a(g,p,h.length,o);let c={id:l(),pid:e,address:`0x${p.toString(16).toUpperCase()}`,oldValue:Array.from(r),newValue:Array.from(h),timestamp:Date.now(),undone:!1};return this.writeHistory.push(c),this.undoneStack=[],this.writeHistory.length>t&&(this.writeHistory=this.writeHistory.slice(-t)),c}finally{o(g)}}async undo(){for(let e=this.writeHistory.length-1;e>=0;e--){let t=this.writeHistory[e];if(!t.undone){let e=BigInt(t.address),i=Buffer.from(t.oldValue),c=r(t.pid,!0);try{let{oldProtect:t}=a(c,e,i.length,s.READWRITE);n(c,e,i),a(c,e,i.length,t)}finally{o(c)}return t.undone=!0,this.undoneStack.push(t),t}}return null}async redo(){let e=this.undoneStack.pop();if(!e)return null;let t=BigInt(e.address),i=Buffer.from(e.newValue),c=r(e.pid,!0);try{let{oldProtect:e}=a(c,t,i.length,s.READWRITE);n(c,t,i),a(c,t,i.length,e)}finally{o(c)}return e.undone=!1,e}async freeze(t,i,u,d,f){let p=BigInt(i.startsWith(`0x`)?i:`0x${i}`),{patternBytes:m}=c(u,d),h=Buffer.from(m),g=f??e,_={id:l(),pid:t,address:`0x${p.toString(16).toUpperCase()}`,value:Array.from(h),valueType:d,intervalMs:g,isActive:!0};return _.timer=setInterval(()=>{try{let e=r(t,!0);try{let{oldProtect:t}=a(e,p,h.length,s.READWRITE);n(e,p,h),a(e,p,h.length,t)}finally{o(e)}}catch{_.isActive=!1,_.timer&&clearInterval(_.timer),this.freezes.delete(_.id)}},g),typeof _.timer.unref==`function`&&_.timer.unref(),this.freezes.set(_.id,_),_}async unfreeze(e){let t=this.freezes.get(e);return t?(t.timer&&clearInterval(t.timer),t.isActive=!1,this.freezes.delete(e),!0):!1}async unfreezeAll(){let e=0;for(let[t]of this.freezes)await this.unfreeze(t),e++;return e}listFreezes(){return Array.from(this.freezes.values()).map(({timer:e,...t})=>t)}async dumpMemory(e,t,n){let a=BigInt(t.startsWith(`0x`)?t:`0x${t}`),s=r(e,!1);try{return i(s,a,n)}finally{o(s)}}async dumpMemoryHex(e,t,n){let r=await this.dumpMemory(e,t,n),i=[],a=BigInt(t.startsWith(`0x`)?t:`0x${t}`);for(let e=0;e<r.length;e+=16){let t=a+BigInt(e),n=Array.from(r.subarray(e,Math.min(e+16,r.length))).map(e=>e.toString(16).padStart(2,`0`)).join(` `),o=Array.from(r.subarray(e,Math.min(e+16,r.length))).map(e=>e>=32&&e<=126?String.fromCharCode(e):`.`).join(``);i.push(`${t.toString(16).padStart(12,`0`)} ${n.padEnd(47)} |${o}|`)}return i.join(`
|
|
2
|
-
`)}getWriteHistory(){return[...this.writeHistory]}};const d=new u;export{u as MemoryController,d as memoryController};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{Jt as t,qt as n}from"./constants-Cp6hBrrx.mjs";import{setTimeout as r}from"node:timers/promises";const i=[`load`,`domcontentloaded`,`networkidle`,`commit`];function a(e=`networkidle`){return e===`networkidle`?`networkidle2`:e===`commit`?`load`:e}var o=class{collector;constructor(e){this.collector=e}getChromeNavigationWaitUntil(e=`networkidle`){return a(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 navigate(t,n){let r=await this.collector.getActivePage(),i=Date.now();await r.goto(t,{waitUntil:this.getChromeNavigationWaitUntil(n?.waitUntil),timeout:n?.timeout||3e4});let a=Date.now()-i,o=await r.title(),s=r.url();return e.info(`Navigated to: ${t}`),{url:s,title:o,loadTime:a}}async reload(t){await(await this.collector.getActivePage()).reload({waitUntil:this.getChromeNavigationWaitUntil(t?.waitUntil),timeout:t?.timeout||3e4}),e.info(`Page reloaded`)}async goBack(t=1e4){await(await this.collector.getActivePage()).goBack({waitUntil:`domcontentloaded`,timeout:t}),e.info(`Navigated back`)}async goForward(t=1e4){await(await this.collector.getActivePage()).goForward({waitUntil:`domcontentloaded`,timeout:t}),e.info(`Navigated forward`)}async click(t,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(t,s)}finally{i.setDefaultTimeout(this.collector.config?.timeout??3e4)}}else await a.click(t,s);e.info(`Clicked: ${t}${r?.frameUrl||r?.frameSelector?` (in frame)`:``}`)}async type(t,n,r,i){let a=await this.collector.getActivePage();await(await this.resolveFrame(a,i)).type(t,n,{delay:r?.delay}),e.info(`Typed into ${t}: ${n.substring(0,20)}...`)}async select(t,n,r){let i=await this.collector.getActivePage();await(await this.resolveFrame(i,r)).select(t,...n),e.info(`Selected in ${t}: ${n.join(`, `)}`)}async hover(t,n){let r=await this.collector.getActivePage();await(await this.resolveFrame(r,n)).hover(t),e.info(`Hovered: ${t}`)}async scroll(t){await(await this.collector.getActivePage()).evaluate(e=>{window.scrollTo(e.x||0,e.y||0)},t),e.info(`Scrolled to: x=${t.x||0}, y=${t.y||0}`)}async waitForSelector(t,n){try{let r=await this.collector.getActivePage();await r.waitForSelector(t,{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},t);return e.info(`Selector appeared: ${t}`),{success:!0,element:i,message:`Selector appeared: ${t}`}}catch(n){return e.error(`waitForSelector timeout for ${t}:`,n),{success:!1,message:`Timeout waiting for selector: ${t}`}}}async waitForNavigation(t){await(await this.collector.getActivePage()).waitForNavigation({waitUntil:this.getChromeNavigationWaitUntil(),timeout:t||3e4}),e.info(`Navigation completed`)}async evaluate(t,n){let r=await this.collector.getActivePage();if(n?.frameUrl||n?.frameSelector){let i=await c(r,await this.resolveFrame(r,n),t);return e.info(`JavaScript executed (in frame)`),i}let i=await l(r,t);return e.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:n}).catch(()=>null);let r=await e.$(t.frameSelector);if(!r)throw Error(`No element found for iframe selector: ${t.frameSelector}`);let i=await r.contentFrame();if(!i)throw Error(`Element "${t.frameSelector}" exists but has no content frame (not an iframe or not yet loaded).`);return i}return e.mainFrame()}async listFrames(){let e=await this.collector.getActivePage(),t=e.mainFrame(),n=e.frames(),r=d(t.url());return n.map(e=>{let n=e._id||e.url(),i=e.parentFrame(),a=i?i._id||i.url():null,o=d(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(t){if(this.hasAttachedTargetSession()){let n=this.collector.getBrowserTargetSessionManager();if(n){let r=await n.captureScreenshot({format:t?.type??`png`,quality:t?.quality,clip:t?.clip});return e.info(`Screenshot taken via CDP${t?.path?`: ${t.path}`:``}`),r}}let n=await this.collector.getActivePage(),r={path:t?.path,type:t?.type||`png`,quality:t?.quality,fullPage:t?.fullPage||!1};t?.clip&&(r.clip=t.clip,r.fullPage=!1);let i=await n.screenshot(r);return e.info(`Screenshot taken${t?.path?`: ${t.path}`:``}`),i}async getPerformanceMetrics(){let t=await l(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 e.info(`Performance metrics retrieved`),t}async injectScript(t){await l(await this.collector.getActivePage(),e=>{let t=document.createElement(`script`);t.textContent=e,document.head.appendChild(t)},t),e.info(`Script injected into page`)}async setCookies(t){await(await this.collector.getActivePage()).setCookie(...t),e.info(`Set ${t.length} cookies`)}async getCookies(){let t=await(await this.collector.getActivePage()).cookies();return e.info(`Retrieved ${t.length} cookies`),t}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 t=await this.collector.getActivePage(),n=await t.cookies();await t.deleteCookie(...n),e.info(`All cookies cleared`)}async setViewport(t,n){await(await this.collector.getActivePage()).setViewport({width:t,height:n}),e.info(`Viewport set to ${t}x${n}`)}async emulateDevice(t){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(t||``).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 "${t}". 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),e.info(`Emulating ${a} (input: ${t})`),a}async waitForNetworkIdle(n=t){await(await this.collector.getActivePage()).waitForNetworkIdle({timeout:n}),e.info(`Network is idle`)}async getLocalStorage(){let t=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 e.info(`Retrieved ${Object.keys(t).length} localStorage items`),t}async setLocalStorage(t,n){await(await this.collector.getActivePage()).evaluate((e,t)=>{localStorage.setItem(e,t)},t,n),e.info(`Set localStorage: ${t}`)}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()}),e.info(`LocalStorage cleared`)}async pressKey(t){await(await this.collector.getActivePage()).keyboard.press(t),e.info(`Pressed key: ${t}`)}async uploadFile(t,n,r){let i=await this.collector.getActivePage(),a=await(r?await this.resolveFrame(i,r):i).$(t);if(!a)throw Error(`File input not found: ${t}`);let o=Array.isArray(n)?n:[n];await a.uploadFile(...o),e.info(`File uploaded: ${o.join(`, `)}`)}async getAllLinks(){let t=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 e.info(`Found ${t.length} links`),t}async getPage(){return await this.collector.getActivePage()}};async function s(e,t=500){let n=new AbortController,i=r(t,void 0,{signal:n.signal}).then(()=>{throw Error(`cdp_unreachable`)}),a=null;try{a=await Promise.race([e.createCDPSession(),i]),await Promise.race([a.send(`Runtime.evaluate`,{expression:`1`,returnByValue:!0}),i])}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(),a)try{await a.detach()}catch{}}}async function c(e,t,n,...r){let i=3e4;await s(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 l(e,t,...n){return c(e,e,t,...n)}async function u(e,t,...n){let r=3e4;return await s(e),Promise.race([e.evaluateOnNewDocument(t,...n),new Promise((e,t)=>setTimeout(()=>t(Error(`page.evaluateOnNewDocument timed out after ${r}ms`)),r))])}function d(e){try{return new URL(e).origin}catch{return null}}async function f(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 p(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 m(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 h(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))])}export{m as a,i as c,h as i,a as l,p as n,u as o,f as r,l as s,o as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{G as t}from"./constants-Cp6hBrrx.mjs";const n=new class{processes=new Set;register(e){e&&(this.processes.add(e),`kill`in e?e.once(`close`,()=>this.unregister(e)):`terminate`in e&&(typeof e.once==`function`?e.once(`exit`,()=>this.unregister(e)):typeof e.on==`function`&&e.on(`exit`,()=>this.unregister(e))))}unregister(e){e&&this.processes.delete(e)}async terminateAll(){if(this.processes.size===0)return;e.debug(`[ProcessRegistry] Attempting to terminate ${this.processes.size} active processes/workers...`);let n=[];for(let r of this.processes)`terminate`in r?n.push(r.terminate().then(()=>{this.processes.delete(r)}).catch(t=>{e.warn(`[ProcessRegistry] Error terminating worker: ${t.message}`)})):`kill`in r&&n.push(new Promise(n=>{if(r.killed||r.exitCode!==null||r.signalCode!==null)return this.processes.delete(r),n();r.kill(`SIGTERM`);let i=!1,a=()=>{i||(i=!0,this.processes.delete(r),n())};r.once(`exit`,a),r.once(`close`,a),setTimeout(()=>{if(!i&&!r.killed&&r.exitCode===null){e.debug(`[ProcessRegistry] Force killing child process PID ${r.pid}`);try{r.kill(`SIGKILL`)}catch{}a()}},t).unref()}));await Promise.race([Promise.all(n),new Promise(e=>setTimeout(e,t+1e3).unref())]),this.processes.clear(),e.debug(`[ProcessRegistry] Termination sweep complete.`)}};export{n as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";const t=[{domain:`adb-bridge`,depKey:`adbBridgeHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-BXry5N09.mjs`)},{domain:`core`,depKey:`coreAnalysisHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-D610kxZr.mjs`)},{domain:`antidebug`,depKey:`antidebugHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-D16xPXro.mjs`)},{domain:`binary-instrument`,depKey:`binaryInstrumentHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DD3rtxvV.mjs`)},{domain:`boringssl-inspector`,depKey:`boringsslInspectorHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DMJlcsTR.mjs`)},{domain:`browser`,depKey:`browserHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-zrbrpKCC.mjs`)},{domain:`canvas`,depKey:`canvasHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CtPmHAdn.mjs`)},{domain:`coordination`,depKey:`coordinationHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-ais9Afrw.mjs`)},{domain:`cross-domain`,depKey:`crossDomainHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-yu2xiQqe.mjs`)},{domain:`debugger`,depKey:`debuggerHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-Cx2IVMUY.mjs`)},{domain:`encoding`,depKey:`encodingHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DC-SMF6b.mjs`)},{domain:`evidence`,depKey:`evidenceHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-De-6Wf2R.mjs`)},{domain:`extension-registry`,depKey:`extensionRegistryHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-C1nZkTkO.mjs`)},{domain:`graphql`,depKey:`graphqlHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DWUUWBz0.mjs`)},{domain:`hooks`,depKey:`aiHookHandlers`,profiles:[`full`],secondaryDepKeys:[`hookPresetHandlers`],load:()=>import(`./manifest-BeP_zJGb2.mjs`)},{domain:`instrumentation`,depKey:`instrumentationHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DsVh7Y4U.mjs`)},{domain:`macro`,depKey:`macroHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CJMGt7Qy.mjs`)},{domain:`maintenance`,depKey:`coreMaintenanceHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[`extensionManagementHandlers`],load:()=>import(`./manifest-CFn0359q2.mjs`)},{domain:`memory`,depKey:`memoryScanHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DtEFSRaq.mjs`)},{domain:`mojo-ipc`,depKey:`mojoIpcHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CGq4NpqH2.mjs`)},{domain:`network`,depKey:`advancedHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-C7qV1z7F.mjs`)},{domain:`platform`,depKey:`platformHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-D44TaRJU.mjs`)},{domain:`process`,depKey:`processHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-Cq0j7GZt.mjs`)},{domain:`protocol-analysis`,depKey:`protocolAnalysisHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CeQmtQOY.mjs`)},{domain:`proxy`,depKey:`proxyHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CDeUZGUZ.mjs`)},{domain:`sandbox`,depKey:`sandboxHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CRIJq4Hs.mjs`)},{domain:`shared-state-board`,depKey:`sharedStateBoardHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-C0g67k6U.mjs`)},{domain:`skia-capture`,depKey:`skiaCaptureHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-H-EpAyZQ.mjs`)},{domain:`sourcemap`,depKey:`sourcemapHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-DKUorv5M.mjs`)},{domain:`streaming`,depKey:`streamingHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-tmb54wmA.mjs`)},{domain:`syscall-hook`,depKey:`syscallHookHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-Dgh0uDW-.mjs`)},{domain:`trace`,depKey:`traceHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-BPuE6oH2.mjs`)},{domain:`transform`,depKey:`transformHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-Dm0o3i2U.mjs`)},{domain:`v8-inspector`,depKey:`v8InspectorHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-BFGxlDRh.mjs`)},{domain:`wasm`,depKey:`wasmHandlers`,profiles:[`full`],secondaryDepKeys:[],load:()=>import(`./manifest-CDiCtaQT.mjs`)},{domain:`workflow`,depKey:`workflowHandlers`,profiles:[`workflow`,`full`],secondaryDepKeys:[],load:()=>import(`./manifest-C_hEIjSx.mjs`)}],n={"adb-bridge":[`full`],core:[`workflow`,`full`],antidebug:[`full`],"binary-instrument":[`full`],"boringssl-inspector":[`full`],browser:[`workflow`,`full`],canvas:[`full`],coordination:[`full`],"cross-domain":[`full`],debugger:[`workflow`,`full`],encoding:[`workflow`,`full`],evidence:[`full`],"extension-registry":[`full`],graphql:[`workflow`,`full`],hooks:[`full`],instrumentation:[`full`],macro:[`full`],maintenance:[`workflow`,`full`],memory:[`full`],"mojo-ipc":[`full`],network:[`workflow`,`full`],platform:[`full`],process:[`full`],"protocol-analysis":[`full`],proxy:[`full`],sandbox:[`full`],"shared-state-board":[`workflow`,`full`],"skia-capture":[`full`],sourcemap:[`full`],streaming:[`workflow`,`full`],"syscall-hook":[`full`],trace:[`full`],transform:[`full`],"v8-inspector":[`workflow`,`full`],wasm:[`full`],workflow:[`workflow`,`full`]};function r(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.kind===`domain-manifest`&&t.version===1&&typeof t.domain==`string`&&typeof t.depKey==`string`&&Array.isArray(t.profiles)&&Array.isArray(t.registrations)&&typeof t.ensure==`function`}function i(e){if(!e||typeof e!=`object`)return null;let t=e;for(let e of[`default`,`manifest`,`domainManifest`]){let n=t[e];if(r(n))return n}return null}function a(e){let t=new Set;for(let[r,i]of Object.entries(n))i.includes(e)&&t.add(r);return t}function o(){return new Set(Object.keys(n))}function s(){return t}async function c(n){let r=[],a=new Set,o=new Set;for(let{domain:s,load:c}of t)if(!(n&&!n.has(s)))try{let t=i(await c());if(!t){e.warn(`[discovery] Skipping domain "${s}": no valid DomainManifest export`);continue}if(a.has(t.domain)){e.warn(`[discovery] Duplicate domain "`+t.domain+`" in generated manifests - skipping`);continue}if(o.has(t.depKey)){e.warn(`[discovery] Duplicate depKey "`+t.depKey+`" in generated manifests - skipping`);continue}a.add(t.domain),o.add(t.depKey),r.push(t),e.info(`[discovery] Loaded domain "`+t.domain+`" (`+String(t.registrations.length)+` tools)`)}catch(t){if(e.error(`[discovery] Failed to load domain "${s}"`,t),process.env.DISCOVERY_STRICT===`true`)throw t}let s=r.reduce((e,t)=>e+t.registrations.length,0);return e.info(`[discovery] Discovered `+String(r.length)+` domains, `+String(s)+` tools total`),r}async function l(n){let r=t.find(e=>e.domain===n);if(!r)return null;try{let t=i(await r.load());return t?(e.info(`[discovery] On-demand loaded domain "`+t.domain+`" (`+String(t.registrations.length)+` tools)`),t):(e.warn(`[discovery] Domain "${n}": no valid DomainManifest export`),null)}catch(t){return e.error(`[discovery] Failed to load domain "${n}"`,t),null}}function u(e,t){let n=new Set(t);return e.every(e=>n.has(e))}let d=null,f=null,p=null,m=null,h=null,g=null;async function _(t){if(d===null){if(p){await p;return}p=(async()=>{let n=await c(t?a(t):void 0);d=n,g=new Map;for(let t of n)for(let n of t.registrations){let r=n.domain?n:{...n,domain:t.domain},i=g.get(r.tool.name);i?e.warn(`[registry] Duplicate tool name "${r.tool.name}": domain "${r.domain}" conflicts with "${i.domain}" — keeping first`):g.set(r.tool.name,r)}f=[...g.values()],m=new Set(d.map(e=>e.domain)),h=new Set(f.map(e=>e.tool.name))})(),await p}}async function v(e){await _(e)}async function y(e){if(!d)throw Error(`[registry] Not initialised - call initRegistry() first.`);if(d.some(t=>t.domain===e))return d.find(t=>t.domain===e);let t=await l(e);if(!t)return null;d.push(t),m.add(t.domain);for(let e of t.registrations){let n=e.domain?e:{...e,domain:t.domain};g.has(n.tool.name)||g.set(n.tool.name,n)}f=[...g.values()],L();for(let e of t.registrations)h.add(e.tool.name);return t}async function b(){if(!d)throw Error(`[registry] Not initialised - call initRegistry() first.`);let t=o(),n=new Set(d.map(e=>e.domain)),r=[...t].filter(e=>!n.has(e));r.length!==0&&(e.info(`[registry] Loading ${r.length} remaining domains for full discovery`),await Promise.all(r.map(e=>y(e))))}function x(){if(!d)throw Error(`[registry] Not initialised - call initRegistry() first.`);return d}function S(){if(!f)throw Error(`[registry] Not initialised - call initRegistry() first.`);return f}function C(){return x()}function w(){return S()}function T(){if(!m)throw Error(`[registry] Not initialised - call initRegistry() first.`);return m}function E(){return o()}function D(){let e={};for(let t of S())(e[t.domain]??=[]).push(t.tool);return e}function O(){let e=new Map;for(let t of S())e.has(t.tool.name)||e.set(t.tool.name,t.domain);return e}function k(){return S().map(e=>e.tool)}function A(e,t){let n=t?S().filter(e=>t.has(e.tool.name)):[...S()],r=[];for(let t of n)try{r.push([t.tool.name,t.bind(e)])}catch{}return Object.fromEntries(r)}function j(){let t={search:new Set,workflow:new Set,full:new Set};for(let[e,r]of Object.entries(n))for(let n of r)t[n]?.add(e);let r={};for(let[e,n]of Object.entries(t))r[e]=[...n];return u(r.search,r.workflow)||e.warn(`[registry] Profile hierarchy: search not subset of workflow`),u(r.workflow,r.full)||e.warn(`[registry] Profile hierarchy: workflow not subset of full`),r}let M=null,N=null,P=null,F=null;function I(){return M||=D(),M}function L(){M=null}function R(){return N||=O(),N}function z(){return P||=j(),P}const B=new Proxy([],{get(e,t){F||=k();let n=F,r=n[t];return typeof r==`function`?r.bind(n):r}});function V(e){let t=new Map;for(let n of e)t.set(n.name,n);return Array.from(t.values())}function H(e){if(!e?.trim())return null;let t=T(),n=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(Boolean).filter(e=>t.has(e));return n.length>0?Array.from(new Set(n)):null}function U(e){return V(e.flatMap(e=>I()[e]??[]))}function W(e){let t=z()[e];if(!t)return[];let n=new Set(t);return V([...w()].filter(t=>!(!n.has(t.domain)||t.profiles&&!t.profiles.includes(e))).map(e=>e.tool))}function G(e){return R().get(e)??null}function K(e){return z()[e]??[]}export{W as a,b as c,E as d,C as f,s as h,U as i,y as l,v as m,K as n,H as o,w as p,G as r,A as s,B as t,T as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./logger-sBC6IdRT.mjs";import{Y as e}from"./constants-Cp6hBrrx.mjs";import{execFile as t}from"node:child_process";import{promisify as n}from"node:util";const r=n(t);async function i(t,n=[`--version`],i=e){try{let{stdout:e}=await r(process.platform===`win32`?`where`:`which`,[t],{timeout:i,windowsHide:!0}),a=e.trim().split(/\r?\n/)[0],o;try{let{stdout:e}=await r(t,n,{timeout:i,windowsHide:!0}),a=e.trim().split(/\r?\n/)[0];o=a?a.substring(0,100):void 0}catch{}return{available:!0,path:a,version:o}}catch(e){let n=typeof e==`object`&&e&&`code`in e?e.code:void 0,r=e instanceof Error?e.message:typeof e==`object`&&e&&`message`in e?String(e.message??``):String(e??``);return{available:!1,reason:n===`ENOENT`?`Command '${t}' not found in PATH`:`Probe failed: ${r.substring(0,200)}`}}}export{i as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{J as t}from"./constants-Cp6hBrrx.mjs";import{t as n}from"./ToolProbe-xsfALmN3.mjs";const r=[{name:`wabt.wasm2wat`,command:`wasm2wat`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`wabt.wasm-objdump`,command:`wasm-objdump`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`wabt.wasm-decompile`,command:`wasm-decompile`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`wabt.wasm2c`,command:`wasm2c`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`binaryen.wasm-opt`,command:`wasm-opt`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`runtime.wasmtime`,command:`wasmtime`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`runtime.wasmer`,command:`wasmer`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`miniapp.unpacker`,command:`unveilr`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`platform.jadx`,command:`jadx`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`analysis.ast-grep`,command:`ast-grep`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`analysis.wakaru`,command:`wakaru`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`analysis.restringer`,command:`restringer`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`analysis.z3`,command:`z3`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`syscall.strace`,command:`strace`,versionArgs:[`--version`],required:!1,envAllowlist:[]},{name:`syscall.bpftrace`,command:`bpftrace`,versionArgs:[`--version`],required:!1,envAllowlist:[]}];var i=class{specs=new Map;probeCache=new Map;probeCacheExpiry=0;PROBE_CACHE_TTL=t;constructor(e){for(let e of r)this.specs.set(e.name,e);if(e)for(let t of e)this.specs.set(t.name,t)}getSpec(e){let t=this.specs.get(e);if(!t)throw Error(`Tool '${e}' is not registered in the allowlist`);return t}isRegistered(e){return this.specs.has(e)}getRegisteredTools(){return Array.from(this.specs.keys())}async probeAll(t=!1){let r=Date.now();if(!t&&this.probeCache.size>0&&r<this.probeCacheExpiry)return Object.fromEntries(this.probeCache);let i={},a=[];for(let[e,t]of this.specs)a.push(n(t.command,t.versionArgs).then(t=>{i[e]=t,this.probeCache.set(e,t)}));await Promise.all(a),this.probeCacheExpiry=r+this.PROBE_CACHE_TTL;let o=Object.values(i).filter(e=>e.available).length;return e.info(`[ToolRegistry] Probed ${this.specs.size} tools: ${o} available`),i}getCachedProbe(e){return this.probeCache.get(e)}register(t){this.specs.set(t.name,t),this.probeCache.delete(t.name),e.debug(`[ToolRegistry] Registered tool: ${t.name} -> ${t.command}`)}};export{i as t};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-sBC6IdRT.mjs";import{d as t,f as n,u as r}from"./constants-Cp6hBrrx.mjs";import{a as i,n as a,r as o,t as s}from"./response-C7rKQst4.mjs";import{a as c,i as l,n as u,r as d,s as f,t as p}from"./parse-args-Cuk7-xUt.mjs";import{s as m}from"./PageController-D9jVkH0i.mjs";import"./definitions-CuJRsJ6N.mjs";import{n as h,t as g}from"./webcrack-CsLLJIs9.mjs";import*as _ from"@babel/parser";import v from"@babel/traverse";import*as y from"@babel/types";import b from"@babel/generator";const x=new Set([`=`,`(`,`[`,`,`,`;`,`{`,`!`,`&`,`|`,`?`,`:`,`~`,`^`,`+`,`-`,`*`,`%`,`<`,`>`,`
|
|
2
|
-
`]);function S(e){return new RegExp(e.source,e.flags)}function ee(e){if(e.length===0)return[];let t=[],n=e.toSorted((e,t)=>e.start-t.start||e.end-t.end);for(let e of n){let n=t[t.length-1];if(!n||e.start>n.end){t.push({...e});continue}n.end=Math.max(n.end,e.end)}return t}function C(e){try{let t=_.parse(e,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`],errorRecovery:!0}),n=[],r=(e,t)=>{typeof e==`number`&&typeof t==`number`&&t>e&&n.push({start:e,end:t})},i=Array.isArray(t.comments)?t.comments:[];for(let e of i)r(e.start,e.end);return v(t,{StringLiteral(e){r(e.node.start,e.node.end),e.skip()},TemplateElement(e){r(e.node.start,e.node.end),e.skip()},RegExpLiteral(e){r(e.node.start,e.node.end),e.skip()}}),ee(n)}catch{return null}}function w(e){let t=e[e.length-2];if(typeof t==`number`)return t;let n=e[e.length-3];return typeof n==`number`?n:null}function T(e,t){let n=t-1;for(;n>=0&&(e[n]===` `||e[n]===` `||e[n]===`\r`);)n--;if(n<0)return!0;let r=e[n];if(x.has(r))return!0;if(r!==`)`)return!1;let i=1,a=n-1;for(;a>=0&&i>0;)e[a]===`)`&&i++,e[a]===`(`&&i--,a--;for(a--;a>=0&&(e[a]===` `||e[a]===` `);)a--;let o=``;for(;a>=0&&/[a-z]/.test(e[a]);)o=e[a]+o,a--;return[`if`,`while`,`for`,`switch`,`return`,`typeof`,`void`,`in`,`of`,`case`].includes(o)}function E(e,t){let n=null,r=!1,i=!1,a=!1;for(let o=0;o<t;o++){let s=e[o];if(r){s===`*`&&e[o+1]===`/`&&(r=!1,o++);continue}if(i){s===`
|
|
3
|
-
`&&(i=!1);continue}if(a){if(s===`\\`){o++;continue}if(s===`/`){for(a=!1,o++;o<t&&/[gimsuy]/.test(e[o]);)o++;continue}if(s===`[`){for(o++;o<t&&e[o]!==`]`;)e[o]===`\\`&&o++,o++;continue}continue}if(n){if(s===`\\`){o++;continue}s===n&&(n=null);continue}if(s===`/`&&e[o+1]===`/`){i=!0,o++;continue}if(s===`/`&&e[o+1]===`*`){r=!0,o++;continue}if(s===`/`&&T(e,o)){a=!0;continue}(s===`'`||s===`"`||s==="`")&&(n=s)}return n!==null||r||i||a}function D(e,t,n){let r=e=>e.replace(S(t),n),i=C(e);if(i===null)return e.replace(S(t),(...t)=>{let r=typeof t[0]==`string`?t[0]:``,i=w(t);return i!==null&&E(e,i)?r:typeof n==`string`?n:n(r,...t.slice(1))});if(i.length===0)return r(e);let a=``,o=0;for(let t of i)o<t.start&&(a+=r(e.slice(o,t.start))),a+=e.slice(t.start,t.end),o=t.end;return o<e.length&&(a+=r(e.slice(o))),a}const te=/\b(-?\d+(?:\.\d+)?)\s*([+\-%*/])\s*(-?\d+(?:\.\d+)?)\b/g,ne=/if\s*\(\s*false\s*\)\s*\{[^}]*\}\s*/g,O=/if\s*\(\s*false\s*\)\s*\{[^}]*\}\s*else\s*\{([^}]*)\}/g,k=/if\s*\(\s*true\s*\)\s*\{([^}]*)\}\s*(?:else\s*\{[^}]*\}\s*)?/g,A=/var\s+([A-Za-z_$]\w*)\s*=\s*['"]([^'"]+)['"]\.split\(['"]\|['"]\)\s*;\s*var\s+(\w+)\s*=\s*0\s*;\s*while\s*\(\s*!!\[\]\s*\)\s*\{\s*switch\s*\(\s*\1\[\s*\3\+\+\s*\]\s*\)\s*\{([\s\S]*?)\}\s*break;\s*\}/g,j=/var\s+([A-Za-z_$]\w*)\s*=\s*\[(['"][^'"]*['"]\s*(?:,\s*['"][^'"]*['"]\s*)*)\];\s*var\s+(\w+)\s*=\s*(\d+);\s*while\s*\(\s*!!\[\]\s*\)\s*\{\s*switch\s*\(\s*\1\[\s*\3\+\+\]\s*\)\s*\{([\s\S]*?)\}\s*break;\s*\}/g,M=/['"]([^'"]*)['"]\s*\+\s*['"]([^'"]*)['"]/g;function N(e,t,n){for(let r=t;r>=0&&r<e.length;r+=n){let t=e[r];if(t&&!/\s/.test(t))return t}return``}function P(e,t){let n=t.toSorted((e,t)=>t.start-e.start||t.end-e.end),r=e;for(let e of n)r=`${r.slice(0,e.start)}${e.text}${r.slice(e.end)}`;return r}function F(e,t){let n=t.get(e.node.name);if(!n)return null;let r=e.scope.getBinding(e.node.name);if(!r||!y.isVariableDeclarator(r.path.node)||!y.isIdentifier(r.path.node.id)||!t.has(r.path.node.id.name))return null;let i=r.identifier===e.node,a=e.isReferencedIdentifier(),o=e.key===`left`&&e.parentPath.isAssignmentExpression(),s=e.key===`left`&&(e.parentPath.isForInStatement()||e.parentPath.isForOfStatement()),c=e.key===`argument`&&e.parentPath.isUpdateExpression();return!i&&!a&&!o&&!s&&!c?null:n}function I(e,t){try{let n=_.parse(e,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`],errorRecovery:!0}),r=new Map;return v(n,{ObjectProperty(e){if(!e.node.shorthand||!y.isIdentifier(e.node.key)||!y.isIdentifier(e.node.value))return;let n=e.get(`value`);if(!n.isIdentifier())return;let i=F(n,t),{start:a,end:o}=e.node;!i||a==null||o!=null&&(r.set(`${a}:${o}`,{start:a,end:o,text:`${e.node.key.name}: ${i}`}),e.skip())},Identifier(e){let n=F(e,t),{start:i,end:a}=e.node;!n||i==null||a!=null&&r.set(`${i}:${a}`,{start:i,end:a,text:n})}}),r.size===0?e:P(e,[...r.values()])}catch{return null}}function L(e){let t=e;return t=D(t,te,(e,t,n,r)=>{let i=Number(t),a=Number(r);if(!Number.isFinite(i)||!Number.isFinite(a))return e;let o=null;return n===`+`?o=i+a:n===`-`?o=i-a:n===`*`?o=i*a:n===`/`&&a!==0?o=i/a:n===`%`&&a!==0&&(o=i%a),o===null||!Number.isFinite(o)?e:String(Number.isInteger(o)?o:Number(o.toFixed(12)))}),t=D(t,M,(e,t,n)=>JSON.stringify(`${t}${n}`)),t=D(t,/--(\d)/g,(e,t)=>t),t=D(t,/\+\s*(\d+(?:\.\d+)?)/g,(e,t)=>t),t=D(t,/\b0x([0-9a-fA-F]{2,8})\b/g,(e,t)=>{let n=Number.parseInt(t,16);return Number.isFinite(n)?String(n):e}),t}function R(e){let t=e;return t=D(t,O,(e,t)=>t),t=D(t,ne,``),t=D(t,k,(e,t)=>t),t=D(t,/\btrue\s*\?\s*([^:]+)\s*:\s*([^,;)\]}]+)/g,(e,t)=>t),t=D(t,/\bfalse\s*\?\s*[^:]+\s*:\s*([^,;)}\]]+)/g,(e,t)=>t),t=D(t,/if\s*\([^)]*\)\s*\{\s*\}\s*/g,``),t}function z(e){let t=e;return t=D(t,A,(e,t,n,r,i)=>{let a=/case\s*['"]([^'"]+)['"]\s*:\s*([\s\S]*?)(?=case\s*['"]|default\s*:|$)/g,o=new Map,s;for(;(s=a.exec(i))!==null;){let e=s[1],t=(s[2]??``).replace(/\bcontinue\s*;?/g,``).replace(/\bbreak\s*;?/g,``).trim();e&&t.length>0&&o.set(e,t)}let c=n.split(`|`).map(e=>e.trim()).map(e=>o.get(e)).filter(e=>!!e).join(`
|
|
4
|
-
`);return c.length>0?c:e}),t=D(t,j,(e,t,n,r,i,a)=>{let o=/case\s*['"]([^'"]+)['"]\s*:\s*([\s\S]*?)(?=case\s*['"]|default\s*:|$)/g,s=new Map,c;for(;(c=o.exec(a))!==null;){let e=c[1],t=(c[2]??``).replace(/\bcontinue\s*;?/g,``).replace(/\bbreak\s*;?/g,``).trim();e&&t.length>0&&s.set(e,t)}let l=n.split(/,\s*/).map(e=>e.replace(/^['"]|['"]$/g,``).trim()).map(e=>s.get(e)).filter(e=>!!e).join(`
|
|
5
|
-
`);return l.length>0?l:e}),t}function B(e){let t=new Set,n=/\b(?:var|let|const)\s+([A-Za-z_$]\w{0,3})\b/g,r;for(;(r=n.exec(e))!==null;){let e=r[1];e&&(e.length<=2||e.startsWith(`_0x`)||e.startsWith(`_`))&&t.add(e)}if(t.size===0)return{code:e,count:0};let i=new Map,a=1;for(let e of t)i.set(e,`var_${a}`),a++;let o=I(e,i);if(o!==null)return{code:o,count:o===e?0:i.size};let s=e.replace(RegExp(`\\b(${[...t].map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})\\b`,`g`),(e,t,n,r)=>{let a=i.get(t);if(!a)return e;let o=n>0?r[n-1]:``,s=N(r,n-1,-1),c=N(r,n+e.length,1);return o===`.`||o===`'`||o===`"`||o==="`"||o===`$`||(s===`{`||s===`,`)&&(c===`:`||c===`(`)?e:a});return{code:s,count:s===e?0:i.size}}const V={"<":(e,t)=>e<t,">":(e,t)=>e>t,"<=":(e,t)=>e<=t,"<==":(e,t)=>e<=t,">=":(e,t)=>e>=t,">==":(e,t)=>e>=t,"==":(e,t)=>e===t,"===":(e,t)=>e===t,"!=":(e,t)=>e!==t,"!==":(e,t)=>e!==t},H=[{pattern:`jsfuck`,regex:/\[!\[\]\]\[\(['"]\)constructor['"]\)\]\(!!\[\]\+\[\]\)\(\)/g,replacement:`"function Boolean() { [native code] }"`},{pattern:`jsfuck`,regex:/!!\[\]\+\[\]/g,replacement:`"true"`},{pattern:`jsfuck`,regex:/!\[\]\+\[\]/g,replacement:`"false"`},{pattern:`jsfuck`,regex:/\+!!\[\]/g,replacement:`1`},{pattern:`jsfuck`,regex:/\[\]\+\[\]/g,replacement:`""`},{pattern:`jsfuck`,regex:/\+\[\]/g,replacement:`0`}],U=[{pattern:`boolean-literal`,regex:/!!\[\]/g,replacement:`true`},{pattern:`boolean-literal`,regex:/!\[\]/g,replacement:`false`},{pattern:`undefined-literal`,regex:/void\s+0/g,replacement:`undefined`}],W={pattern:`opaque-truthy`,regex:/!0x0\b|!\b0(?![.\d])/g,replacement:`true`},G=[{pattern:`type-coercion`,regex:/typeof\s+undefined\s*===?\s*["']undefined["']/g,replacement:`true`},{pattern:`type-coercion`,regex:/typeof\s+null\s*===?\s*["']object["']/g,replacement:`true`},{pattern:`type-coercion`,regex:/typeof\s+NaN\s*===?\s*["']number["']/g,replacement:`true`},{pattern:`type-coercion`,regex:/null\s*==\s*undefined/g,replacement:`true`},{pattern:`type-coercion`,regex:/null\s*===\s*undefined/g,replacement:`false`},{pattern:`type-coercion`,regex:/NaN\s*===?\s*NaN/g,replacement:`false`}],K=/if\s*\(\s*(-?\d+(?:\.\d+)?)\s*([<>!=]+)\s*(-?\d+(?:\.\d+)?)\s*\)/g,q=/!\s*(-?\d+(?:\.\d+)?)(?![.\d\s\w])/g,re=/(?:var|let|const)\s+(\w+)\s*=\s*\[(['"][^'"]*['"]\s*(?:,\s*['"][^'"]*['"]\s*)*)\]/g;function J(e,t,n,r){return e.solved.push({pattern:t,original:n,result:r}),r}function Y(e,t){for(let n of t)e.output=D(e.output,n.regex,t=>J(e,n.pattern,t,n.replacement))}function X(e){e.output=D(e.output,K,(t,n,r,i)=>{if(e.iterations>=e.maxIterations)return t;let a=V[r];if(!a)return t;e.iterations+=1;let o=a(Number(n),Number(i));return J(e,`constant-comparison`,t,String(o)),e.replaceInPlace?`/* ${t} => ${o} */ if (${o})`:`if (${o})`})}function ie(e){e.output=D(e.output,q,(t,n)=>{let r=Number(n);return r===0||!Number.isFinite(r)?t:J(e,`opaque-falsy`,t,`false`)})}function ae(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function oe(e){let t=new Map;return D(e,re,(e,n,r)=>{let i=r.split(/,\s*/).map(e=>e.replace(/^['"]|['"]$/g,``));return t.set(n,i),e}),t}function se(e){let t=oe(e.output);if(t.size!==0)for(let[n,r]of t){let t=RegExp(`${ae(n)}\\(['"]?(0x[0-9a-fA-F]+|\\d+)['"]?\\)`,`g`);e.output=D(e.output,t,(t,n)=>{if(e.iterations>=e.maxIterations)return t;let i=n.startsWith(`0x`)?Number.parseInt(n,16):Number(n);return i<0||i>=r.length?t:(e.iterations+=1,J(e,`string-array-access`,t,JSON.stringify(r[i])))})}}function ce(e){let t={output:e.code,solved:[],replaceInPlace:e.replaceInPlace,maxIterations:e.maxIterations,iterations:0};return X(t),Y(t,H),Y(t,U),Y(t,[W]),ie(t),se(t),Y(t,G),{success:!0,solvedCount:t.solved.length,solved:t.solved,transformedCode:e.replaceInPlace?t.output:void 0}}const le=[{type:`for-switch`,test:/for.*switch/s},{type:`while-switch`,test:/while.*switch/s},{type:`if-else-chain`,test:/if\s*\(\s*\w+\s*===?\s*\w+/}];function ue(e){for(let t of le)if(t.test.test(e))return t.type;return`switch`}function de(e){let t=new Map;for(let n of e){let e=n.type||`unknown`;t.set(e,(t.get(e)||0)+1)}return Object.fromEntries(t)}function fe(e){let{code:t,extractBytecode:n,mapOpcodes:r,vmResult:i}=e;if(!i.isJSVMP)return{success:!0,isVM:!1,message:`No VM/JSVMP patterns detected.`};let a={isVM:!0,vmType:i.vmType,dispatchType:ue(t),complexity:i.vmFeatures?.complexity,instructionCount:i.vmFeatures?.instructionCount,interpreterLocation:i.vmFeatures?.interpreterLocation};return n&&i.instructions&&(a.bytecode=i.instructions),r&&i.instructions&&(a.opcodeDistribution=de(i.instructions),a.suggestedStrategy=i.vmFeatures?.complexity===`high`?`Use symbolic execution (js_deobfuscate_jsvmp with aggressive=true) for high-complexity VMs`:`Use standard deobfuscation pipeline (js_deobfuscate_pipeline)`),{success:!0,analysis:a}}async function pe(t,n){let r=c(n,`searchKeyword`,``),i=p(n,`forceRequireAll`,!!r),o=Math.min(d(n,`maxResults`,20),100);try{let n=await m(await t.getActivePage(),async e=>{let t=window,n=null;typeof t.__webpack_require__==`function`&&(n=t.__webpack_require__);let r=Object.keys(t).filter(e=>e.startsWith(`webpackChunk`)||e.startsWith(`webpackJsonp`)),i=new Set;for(let e of r){let n=t[e];if(!Array.isArray(n))continue;let r=n;if(r.m&&typeof r.m==`object`)for(let e of Object.keys(r.m))i.add(e);for(let e of n)if(Array.isArray(e)&&e[1]&&typeof e[1]==`object`)for(let t of Object.keys(e[1]))i.add(t)}if(typeof t.__webpack_modules__==`object`&&t.__webpack_modules__)for(let e of Object.keys(t.__webpack_modules__))i.add(e);if(!n)for(let e of r){let r=t[e];if(r?.m&&typeof r.m==`object`){let e=r.m;n=t=>{try{let n=e[t];return typeof n==`function`?n():n}catch{return}};break}}let a=Array.from(i);if(!e.forceRequireAll||!n)return{total:a.length,requireFound:!!n,chunkKeys:r,moduleIds:a.slice(0,200),matches:[]};let o=n,s=[];for(let t of a){if(s.length>=e.maxResults)break;try{let n=o(t);if(n==null)continue;let r;try{r=JSON.stringify(n)}catch{r=String(n)}(!e.searchKeyword||r.toLowerCase().includes(e.searchKeyword.toLowerCase()))&&s.push({id:t,preview:r.slice(0,600)})}catch{}}return{total:a.length,requireFound:!0,chunkKeys:r,moduleIds:a.slice(0,200),matches:s}},{searchKeyword:r,forceRequireAll:i,maxResults:o});return e.info(`webpack_enumerate: found ${n.total} modules, ${n.matches.length} matches`),a(n)}catch(e){return s(e)}}function me(t){e.info(`Derotating string array...`);try{let n=_.parse(t,{sourceType:`module`,plugins:[`jsx`,`typescript`]}),r=0;return v(n,{CallExpression(t){if(!y.isFunctionExpression(t.node.callee)&&!y.isArrowFunctionExpression(t.node.callee))return;let n=t.node.callee;if(!y.isFunctionExpression(n)||!y.isBlockStatement(n.body))return;let i=n.body.body.some(e=>y.isWhileStatement(e)),a=JSON.stringify(n.body).includes(`push`)&&JSON.stringify(n.body).includes(`shift`);i&&a&&(e.debug(`Found string array rotation IIFE`),t.remove(),r++)}}),r>0?(e.info(`Removed ${r} string array rotation functions`),b(n,{comments:!0,compact:!1}).code):t}catch(n){return e.error(`Failed to derotate string array:`,n),t}}const Z=v.default??v,Q=b.default??b,he=new Set([`summary`,`priority`,`incremental`,`full`]),ge=new Set([`structure`,`business`,`security`,`all`]),$=new Set([`function`,`xhr`,`fetch`,`websocket`,`localstorage`,`cookie`]),_e=new Set([`log`,`block`,`modify`]),ve=new Set([`call`,`apply`]);var ye=class{collector;scriptManager;deobfuscator;advancedDeobfuscator;obfuscationDetector;analyzer;cryptoDetector;hookManager;jsvmpDeobfuscator;constructor(e){this.collector=e.collector,this.scriptManager=e.scriptManager,this.deobfuscator=e.deobfuscator,this.advancedDeobfuscator=e.advancedDeobfuscator,this.obfuscationDetector=e.obfuscationDetector,this.analyzer=e.analyzer,this.cryptoDetector=e.cryptoDetector,this.hookManager=e.hookManager,this.jsvmpDeobfuscator=new h}requireCodeArg(t,n){let r=t.code;return typeof r!=`string`||r.trim().length===0?(e.warn(`${n} called without valid code argument`),null):r}extractWebcrackArgs(e){let t={},n=p(e,`unpack`),r=p(e,`unminify`),i=p(e,`jsx`),a=p(e,`mangle`),o=p(e,`forceOutput`),s=p(e,`includeModuleCode`),l=c(e,`outputDir`),u=d(e,`maxBundleModules`);return n!==void 0&&(t.unpack=n),r!==void 0&&(t.unminify=r),i!==void 0&&(t.jsx=i),a!==void 0&&(t.mangle=a),o!==void 0&&(t.forceOutput=o),s!==void 0&&(t.includeModuleCode=s),l?.trim()&&(t.outputDir=l),u!==void 0&&(t.maxBundleModules=u),Array.isArray(e.mappings)&&(t.mappings=e.mappings.filter(e=>typeof e==`object`&&!!e&&typeof e.path==`string`&&typeof e.pattern==`string`)),t}async handleCollectCode(i){let o=p(i,`returnSummaryOnly`,!1),s=u(i,`smartMode`,he),c=n,l=e=>e.slice(0,c).map(e=>({url:e.url,type:e.type,size:e.size,sizeKB:(e.size/1024).toFixed(2),truncated:e.metadata?.truncated||!1,preview:`${e.content.substring(0,200)}...`})),m=e=>{let t=(Array.isArray(e.summaries)&&e.summaries.length>0?e.summaries:l(e.files)).slice(0,c),n=Array.isArray(e.summaries)?e.summaries.length:e.files.length,r=e.totalSize>0?e.totalSize:Array.isArray(e.summaries)?e.summaries.reduce((e,t)=>e+(typeof t.size==`number`?t.size:0),0):e.files.reduce((e,t)=>e+t.size,0);return{totalSize:r,totalSizeKB:(r/1024).toFixed(2),filesCount:n,summarizedFiles:t.length,omittedFiles:Math.max(0,n-t.length),collectTime:e.collectTime,summary:t}};s||=`summary`;let h=await this.collector.collect({url:f(i,`url`),includeInline:p(i,`includeInline`),includeExternal:p(i,`includeExternal`),includeDynamic:p(i,`includeDynamic`),smartMode:s,compress:p(i,`compress`),maxTotalSize:d(i,`maxTotalSize`),maxFileSize:i.maxFileSize?d(i,`maxFileSize`,0)*1024:void 0,priorities:i.priorities});if(o)return a({mode:`summary`,...m(h),hint:`Use get_script_source for specific files.`});let g=r,_=t,v=Buffer.byteLength(JSON.stringify(h),`utf8`);return h.totalSize>g||v>_?(e.warn(`Collected code is too large (collected=${(h.totalSize/1024).toFixed(2)}KB, response=${(v/1024).toFixed(2)}KB), returning summary mode.`),a({warning:`Code size exceeds safe response threshold; summary returned.`,...m(h),estimatedResponseSize:v,estimatedResponseSizeKB:(v/1024).toFixed(2),recommendations:[`Use get_script_source for targeted files.`,`Use more specific priority filters.`,`Use smartMode=summary for initial reconnaissance.`]})):a(h)}async handleSearchInScripts(e){await this.scriptManager.init();let t=c(e,`keyword`);if(!t)return a({success:!1,error:`keyword is required`});let n=d(e,`maxMatches`,100),r=p(e,`returnSummary`,!1),i=d(e,`maxContextSize`,5e4),o=await this.scriptManager.searchInScripts(t,{isRegex:p(e,`isRegex`),caseSensitive:p(e,`caseSensitive`),contextLines:d(e,`contextLines`),maxMatches:n}),s=JSON.stringify(o).length;if(r||s>i){let t=o.matches??[];return a({success:!0,keyword:e.keyword,totalMatches:t.length,resultSize:s,resultSizeKB:(s/1024).toFixed(2),truncated:s>i,reason:s>i?`Result too large (${(s/1024).toFixed(2)}KB > ${(i/1024).toFixed(2)}KB)`:`Summary mode enabled`,matchesSummary:t.slice(0,10).map(e=>({scriptId:e.scriptId,url:e.url,line:e.line,preview:`${(e.context??``).substring(0,100)}...`})),recommendations:[`Use more specific keywords.`,`Reduce maxMatches (current: ${n}).`,`Use get_script_source for targeted file retrieval.`]})}return a(o)}async handleExtractFunctionTree(e){let t=c(e,`scriptId`),n=c(e,`functionName`);if(!t)return a({success:!1,error:`scriptId is required`,hint:`Use get_all_scripts() to list available scripts and their scriptIds`});if(!n)return a({success:!1,error:`functionName is required`,hint:`Specify the name of the function to extract`});await this.scriptManager.init();let r=await this.scriptManager.getAllScripts();if(!r.some(e=>String(e.scriptId)===String(t))){let e=r.slice(0,10).map(e=>({scriptId:e.scriptId,url:e.url?.substring(0,80)}));return a({success:!1,error:`Script not found: ${t}`,hint:`The specified scriptId does not exist. Use get_all_scripts() to list available scripts.`,availableScripts:e.length>0?e:`No scripts loaded. Navigate to a page first.`,totalScripts:r.length})}try{return a({success:!0,...await this.scriptManager.extractFunctionTree(t,n,{maxDepth:d(e,`maxDepth`),maxSize:d(e,`maxSize`),includeComments:p(e,`includeComments`)})})}catch(e){return a({success:!1,error:e instanceof Error?e.message:String(e),hint:`Make sure the function name exists in the specified script`})}}async handleDeobfuscate(e){let t=this.requireCodeArg(e,`deobfuscate`);if(!t)return a({success:!1,error:`code is required and must be a non-empty string`});if(u(e,`engine`,new Set([`auto`,`webcrack`]),`auto`)===`webcrack`)return a(await this.advancedDeobfuscator.deobfuscate({code:t,...this.extractWebcrackArgs(e),...typeof e.detectOnly==`boolean`?{detectOnly:e.detectOnly}:{}}));let n=await this.deobfuscator.deobfuscate({code:t,...this.extractWebcrackArgs(e)});return n&&typeof n==`object`&&`success`in n&&n.success===!1&&!(`error`in n)?a({...n,error:n.reason||`deobfuscation failed`}):a(n)}async handleUnderstandCode(e){let t=this.requireCodeArg(e,`understand_code`);return a(t?await this.analyzer.understand({code:t,context:l(e,`context`),focus:u(e,`focus`,ge,`all`)}):{success:!1,error:`code is required and must be a non-empty string`})}async handleDetectCrypto(e){let t=this.requireCodeArg(e,`detect_crypto`);return a(t?await this.cryptoDetector.detect({code:t}):{success:!1,error:`code is required and must be a non-empty string`})}async handleManageHooks(e){let t=f(e,`action`);switch(t){case`create`:return a(await this.hookManager.createHook({target:f(e,`target`),type:u(e,`type`,$)??`function`,action:u(e,`hookAction`,_e,`log`),customCode:c(e,`customCode`)}));case`list`:return a({hooks:this.hookManager.getAllHooks()});case`records`:return a({records:this.hookManager.getHookRecords(f(e,`hookId`))});case`clear`:return this.hookManager.clearHookRecords(c(e,`hookId`)),a({success:!0,message:`Hook records cleared`});default:return a({success:!1,message:`Unknown hook action: ${t}. Valid actions: create, list, records, clear`})}}async handleDetectObfuscation(e){let t=this.requireCodeArg(e,`detect_obfuscation`);if(!t)return a({success:!1,error:`code is required and must be a non-empty string`});let n=p(e,`generateReport`,!0),r=this.obfuscationDetector.detect(t);if(!n)return a(r);let i=this.obfuscationDetector.generateReport(r);return o(`${JSON.stringify(r,null,2)}\n\n${i}`)}async handleWebcrackUnpack(e){let t=this.requireCodeArg(e,`webcrack_unpack`);if(!t)return a({success:!1,error:`code is required and must be a non-empty string`});let n=await g(t,{unpack:p(e,`unpack`,!0),unminify:p(e,`unminify`,!0),jsx:p(e,`jsx`,!0),mangle:p(e,`mangle`,!1),...this.extractWebcrackArgs(e)});return n.applied?a({success:!0,code:n.code,bundle:n.bundle,savedTo:n.savedTo,savedArtifacts:n.savedArtifacts,optionsUsed:n.optionsUsed,engine:`webcrack`}):a({success:!1,error:n.reason||`webcrack execution failed`,optionsUsed:n.optionsUsed,engine:`webcrack`})}async handleWebpackEnumerate(e){return pe(this.collector,e)}async handleClearCollectedData(){try{return await this.collector.clearAllData(),this.scriptManager.clear(),a({success:!0,message:`All collected data cleared.`,cleared:{fileCache:!0,compressionCache:!0,collectedUrls:!0,scriptManager:!0}})}catch(t){return e.error(`Failed to clear collected data:`,t),a(i(t))}}async handleGetCollectionStats(){try{let e=await this.collector.getAllStats();return a({success:!0,stats:e,summary:{totalCachedFiles:e.cache.memoryEntries+e.cache.diskEntries,totalCacheSize:`${(e.cache.totalSize/1024).toFixed(2)} KB`,compressionRatio:`${e.compression.averageRatio.toFixed(1)}%`,cacheHitRate:e.compression.cacheHits>0?`${(e.compression.cacheHits/(e.compression.cacheHits+e.compression.cacheMisses)*100).toFixed(1)}%`:`0%`,collectedUrls:e.collector.collectedUrls}})}catch(t){return e.error(`Failed to get collection stats:`,t),a(i(t))}}async handleJsDeobfuscateJsvmp(e){let t=this.requireCodeArg(e,`js_deobfuscate_jsvmp`);if(!t)return a({success:!1,error:`code is required and must be a non-empty string`});let n=p(e,`detectOnly`,!1),r=await this.jsvmpDeobfuscator.deobfuscate({code:t,aggressive:p(e,`aggressive`,!1),extractInstructions:p(e,`extractInstructions`,!0),timeout:d(e,`timeout`,3e4)});return a(n?{success:!0,isJSVMP:r.isJSVMP,vmType:r.vmType,vmFeatures:r.vmFeatures,confidence:r.confidence,instructionCount:r.instructions?.length}:{success:r.isJSVMP,isJSVMP:r.isJSVMP,vmType:r.vmType,vmFeatures:r.vmFeatures,instructions:r.instructions,deobfuscatedCode:r.deobfuscatedCode,confidence:r.confidence,warnings:r.warnings,unresolvedParts:r.unresolvedParts,stats:r.stats})}async handleJsDeobfuscatePipeline(e){let t=this.requireCodeArg(e,`js_deobfuscate_pipeline`);if(!t)return a({success:!1,error:`code is required`});let n=p(e,`useWebcrack`,!0),r=p(e,`aggressive`,!1),i=p(e,`humanize`,!0),o=p(e,`returnStageDetails`,!1),s=Date.now(),c=t,l=[],u=L(c);u!==c&&(c=u,l.push(`constant_fold`));let d=R(c);d!==c&&(c=d,l.push(`dead_code_remove`));let f=c,m=!1,h,_;if(n)try{let e=await g(c,{unminify:!0,unpack:!0});e.applied?(f=e.code,m=!0):h=e.reason?`webcrack stage did not apply: ${e.reason}`:`webcrack stage did not apply any transformation.`}catch(e){_=e instanceof Error?e.message:String(e)}if(r){let e=z(f);e!==f&&(f=e)}let v=f,y=0;if(i){let e=B(v);e.code!==v&&(v=e.code,y=e.count)}let b=Date.now()-s,x=t.length>0?1-v.length/t.length:0,S={success:!h&&!_,deobfuscatedCode:v,...h?{warning:h}:{},..._?{error:`webcrack stage failed: ${_}`}:{},stats:{originalSize:t.length,finalSize:v.length,reductionRate:Math.round(x*1e3)/10,processingTimeMs:b,stages:{preprocessor:{transforms:l,sizeAfter:c.length},deobfuscator:{webcrackApplied:m,sizeAfter:f.length,...h?{warning:h}:{},..._?{error:_}:{}},humanizer:{renameCount:y,sizeAfter:v.length}}}};return o&&(S.stageDetails={preprocessed:c.substring(0,5e3),deobfuscated:f.substring(0,5e3)}),a(S)}async handleJsAnalyzeVm(e){let t=this.requireCodeArg(e,`js_analyze_vm`);if(!t)return a({success:!1,error:`code is required`});let n=p(e,`extractBytecode`,!0);return a(fe({code:t,extractBytecode:n,mapOpcodes:p(e,`mapOpcodes`,!0),vmResult:await this.jsvmpDeobfuscator.deobfuscate({code:t,aggressive:!1,extractInstructions:n,timeout:15e3})}))}async handleJsSolveConstraints(e){let t=this.requireCodeArg(e,`js_solve_constraints`);return a(t?ce({code:t,replaceInPlace:p(e,`replaceInPlace`,!0),maxIterations:d(e,`maxIterations`,100)}):{success:!1,error:`code is required`})}async handleAnalysisAstMatch(e){let t=c(e,`code`);if(!t)return a({success:!1,error:`code is required`});let n=c(e,`nodeType`);if(!n)return a({success:!1,error:`nodeType is required`});let r=d(e,`maxResults`,50),i=c(e,`filter`),o;if(i)try{o=JSON.parse(i)}catch{return a({success:!1,error:`filter must be valid JSON`})}let s;try{s=_.parse(t,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`]})}catch(e){return a({success:!1,error:`Parse error: ${e instanceof Error?e.message:String(e)}`})}let l=[],u=n;function f(e){if(!o)return!0;for(let[t,n]of Object.entries(o)){let r=t.split(`.`),i=e;for(let e of r){if(typeof i!=`object`||!i)return!1;i=i[e]}if(String(i)!==String(n))return!1}return!0}function p(e){let t={};for(let n of Object.keys(e)){if(n===`type`||n===`start`||n===`end`||n===`loc`||n===`range`)continue;let r=e[n];r==null||typeof r==`string`||typeof r==`number`||typeof r==`boolean`?t[n]=r:Array.isArray(r)&&r.length<=5?t[n]=r.map(e=>typeof e==`object`&&e&&`type`in e?{type:e.type}:e):typeof r==`object`&&r&&`type`in r&&(t[n]={type:r.type})}return t}return Z(s,{enter(e){let n=e.node;n.type===u&&f(n)&&(l.push({type:n.type,start:n.start??-1,end:n.end??-1,code:t.slice(n.start??0,n.end??0),properties:p(n)}),l.length>=r&&e.stop())}}),a({success:!0,matches:l,total:l.length,nodeType:n})}async handleAnalysisDeflatControlFlow(e){let t=c(e,`code`);if(!t)return a({success:!1,error:`code is required`});let n;try{n=_.parse(t,{sourceType:`unambiguous`})}catch(e){return a({success:!1,error:`Parse error: ${e instanceof Error?e.message:String(e)}`})}let r=p(e,`removeDispatcher`,!0),i=this.preprocessDeflatCode(t);if(i.code!==t)try{n=_.parse(i.code,{sourceType:`unambiguous`})}catch(e){return a({success:!1,error:`Parse error: ${e instanceof Error?e.message:String(e)}`})}let o=0,s=new Set,l=this.resolveDispatcherArray.bind(this);Z(n,{WhileStatement:e=>{let t=e.node.test;if(t.type!==`BooleanLiteral`||t.value!==!0)return;let n=e.node.body;if(n.type!==`BlockStatement`)return;let r=n.body.find(e=>e.type===`SwitchStatement`);if(!r)return;let i=r.discriminant;if(i.type!==`MemberExpression`||!i.computed)return;let a=i.object;if(a.type!==`Identifier`)return;let c=a.name,u,d=i.property;if(d.type===`Identifier`?u=d.name:d.type===`UpdateExpression`&&d.argument.type===`Identifier`&&(u=d.argument.name),!u)return;let f=r.cases;if(f.length===0)return;let p=new Map;for(let e of f)!e.test||e.test.type!==`StringLiteral`||p.set(e.test.value,e.consequent);let m=e.scope.getBinding(c),h=e.scope.getBinding(u);if(!m||!h)return;let g=l(e,c);if(!g)return;let _=[];if(g.type===`ArrayExpression`)for(let e of g.elements)e&&e.type===`StringLiteral`&&_.push(e.value);else if(g.type===`CallExpression`&&g.callee.type===`MemberExpression`&&g.callee.property.type===`Identifier`&&g.callee.property.name===`split`&&g.arguments[0]?.type===`StringLiteral`){let e=g.arguments[0].value,t=g.callee.object;t.type===`StringLiteral`&&_.push(...t.value.split(e))}if(_.length===0)return;let v=[];for(let e of _){let t=p.get(e);if(t)for(let e of t)e.type!==`BreakStatement`&&e.type!==`ContinueStatement`&&v.push(e)}e.replaceWith(y.blockStatement(v)),s.add(m.identifier),s.add(h.identifier),o++}}),r&&s.size>0&&Z(n,{VariableDeclarator(e){if(e.node.id.type===`Identifier`&&s.has(e.node.id)){let t=e.parent;t.type===`VariableDeclaration`&&t.declarations.length===1?e.parentPath.remove():e.remove()}}});let u=Q(n,{retainLines:!0}).code;return a({success:!0,code:u,flattenedCount:o,dispatchersRemoved:r?s.size:0,helperTransforms:i.transforms})}async handleAnalysisDecodeStringArray(e){let t=c(e,`code`);if(!t)return a({success:!1,error:`code is required`});let n=d(e,`maxReplacements`,200),r=p(e,`removeRotation`,!0),i=r?me(t):t,o=new Map,s;try{s=_.parse(i,{sourceType:`unambiguous`,plugins:[`jsx`,`typescript`]})}catch(e){return a({success:!1,error:`Parse error: ${e instanceof Error?e.message:String(e)}`})}Z(s,{VariableDeclarator(e){if(!y.isIdentifier(e.node.id)||!y.isArrayExpression(e.node.init))return;let t=[];for(let n of e.node.init.elements){if(!y.isStringLiteral(n))return;t.push(n.value)}o.set(e.node.id.name,t)}});let l=[],u=0;return Z(s,{CallExpression(e){if(u>=n){e.stop();return}if(!y.isIdentifier(e.node.callee))return;let t=e.node.callee.name,r=o.get(t);if(!r||e.node.arguments.length!==1)return;let i=e.node.arguments[0];if(!y.isNumericLiteral(i)&&!y.isStringLiteral(i))return;let a=y.isNumericLiteral(i)?i.value:i.value.startsWith(`0x`)?Number.parseInt(i.value,16):Number(i.value);if(!Number.isInteger(a)||a<0||a>=r.length)return;let s=r[a];typeof s==`string`&&(l.push({arrayName:t,index:a,value:s,original:Q(e.node,{compact:!0}).code}),e.replaceWith(y.stringLiteral(s)),u+=1)}}),a({success:!0,code:Q(s,{retainLines:!0}).code,replacedCount:u,arraysFound:o.size,rotationRemoved:r&&i!==t,replacements:l})}preprocessDeflatCode(e){let t=e,n=[];return t=t.replace(/(\b[a-zA-Z_$][\w$]*)\[['"]([a-zA-Z_$][\w$]*)['"]\]\(([^)]*)\)/g,(e,t,r,i)=>ve.has(r)?(n.push(`helper-member-call`),`${t}.${r}(${i})`):e),{code:t,transforms:n}}resolveDispatcherArray(e,t){let n=e.scope.getBinding(t);if(!n?.path.isVariableDeclarator())return null;let r=n.path.node.init;if(r)return r;let i=n.path.parentPath;if(!i.isVariableDeclaration())return null;let a=i.getAllNextSiblings();for(let e of a){if(!e.isExpressionStatement())continue;let n=e.node.expression;if(!(!y.isAssignmentExpression(n)||n.operator!==`=`||!y.isIdentifier(n.left,{name:t})))return n.right}return null}};export{ye as CoreAnalysisHandlers};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{createRequire as e}from"node:module";const t=e(import.meta.url),n=`pnpm add -O better-sqlite3@12.6.2`,r=`npm rebuild better-sqlite3 --foreground-scripts`;function i(e){return e instanceof Error?e.message:String(e)}function a(e){return/better-sqlite3|better_sqlite3\.node|NODE_MODULE_VERSION|compiled against a different Node\.js version/i.test(i(e))}function o(e){let t=i(e);return/Cannot find module 'better-sqlite3'|Cannot find package 'better-sqlite3'|better-sqlite3 is not installed/i.test(t)?`missing`:/better_sqlite3\.node|NODE_MODULE_VERSION|compiled against a different Node\.js version|module was compiled against/i.test(t)?`abi-mismatch`:`load-failed`}function s(e){let t=o(e),a=i(e);return t===`missing`?`GRACEFUL: better-sqlite3 is not installed. Install the optional trace backend with \`${n}\`.`:t===`abi-mismatch`?`GRACEFUL: better-sqlite3 is installed but its native binary is incompatible with the current Node.js runtime (${process.version}, ABI ${process.versions.modules}). Rebuild it with \`${r}\` or reinstall dependencies under the active Node version. Original error: ${a}`:`GRACEFUL: better-sqlite3 failed to initialize. Try \`${r}\` or reinstall dependencies under the active Node version. Original error: ${a}`}function c(){try{return t(t.resolve(`better-sqlite3/package.json`)).version??null}catch{return null}}function l(){let e=c();if(!e)return{status:`missing`,detail:`GRACEFUL: Optional SQLite backend for trace tools is not installed. Install it with: ${n}`,version:null,issue:`missing`};try{let n=new(t(`better-sqlite3`))(`:memory:`);try{n.prepare(`SELECT 1 AS ok`).get()}finally{n.close()}return{status:`ok`,detail:`installed (${e}) — native trace backend healthy`,version:e}}catch(t){let r=o(t);return r===`missing`?{status:`missing`,detail:`GRACEFUL: Optional SQLite backend for trace tools is not installed. Install it with: ${n}`,version:e,issue:r}:{status:`warn`,detail:`installed (${e}) but ${s(t)}`,version:e,issue:r}}}export{a as n,l as r,s as t};
|