@jshookmcp/jshook 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/README.zh.md +3 -3
- package/dist/{AntiCheatDetector-B6d4Qe9D.mjs → AntiCheatDetector-CUpZBh5O.mjs} +1 -1
- package/dist/{BrowserSessionCoordinator-BJ-HOxo0.mjs → BrowserSessionCoordinator-QIt3tetp.mjs} +1 -1
- package/dist/CodeInjector-Btj9upnf.mjs +1 -0
- package/dist/{ConsoleMonitor-CxDJV15E.mjs → ConsoleMonitor-DIjN5Afa.mjs} +5 -5
- package/dist/{DarwinAPI-ZfQdpLNI.mjs → DarwinAPI-BuMPGzHm.mjs} +1 -1
- package/dist/DetailedDataManager-Z77fDl9Z.mjs +5 -0
- package/dist/ExtensionManager.tools-CIGOWViz.mjs +1 -0
- package/dist/{FingerprintManager-DT0EAUEo.mjs → FingerprintManager-BkDSsjjP.mjs} +1 -1
- package/dist/{HardwareBreakpoint-BUfPdp0f.mjs → HardwareBreakpoint-DMAMcPyB.mjs} +1 -1
- package/dist/{HeapAnalyzer-B_aqY8oj.mjs → HeapAnalyzer-Yj348FYt.mjs} +1 -1
- package/dist/{ExtensionManager.tools-oVMJgPcN.mjs → MCPServer.activation.ttl-CEGNBycZ.mjs} +1 -1
- package/dist/MCPServer.search.helpers-Cs1JpKbu.mjs +1 -0
- package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
- package/dist/{MemoryController-X1XNSn1n.mjs → MemoryController-DjtgiING.mjs} +1 -1
- package/dist/{MemoryScanSession-DG_F-PjE.mjs → MemoryScanSession-zfoVZJB0.mjs} +1 -1
- package/dist/MemoryScanner-Dxd657li.mjs +1 -0
- package/dist/{NativeMemoryManager.utils-BHy1P_jM.mjs → NativeMemoryManager.utils-Bu8srMEF.mjs} +1 -1
- package/dist/{PEAnalyzer-yWQaGrcx.mjs → PEAnalyzer-CMu9Ua9T.mjs} +1 -1
- package/dist/PointerChainEngine-CaSC1Mry.mjs +1 -0
- package/dist/{ProcessRegistry-C-bN48oR.mjs → ProcessRegistry-D5y1yuP2.mjs} +1 -1
- package/dist/{ReverseEvidenceGraph-BhSYYdiI.mjs → ReverseEvidenceGraph-BksOpsPs.mjs} +1 -1
- package/dist/ServerRuntimeState-CgqBBwfd.mjs +1 -0
- package/dist/{Speedhack-yseDPSZ9.mjs → Speedhack-pwXTHxOY.mjs} +1 -1
- package/dist/{StructureAnalyzer-C5lpuZkg.mjs → StructureAnalyzer-BseGzsSl.mjs} +2 -2
- package/dist/ToolCatalog-DgmQXdsm.mjs +1 -0
- package/dist/ToolHandlerMap-7HWoIgQO.mjs +1 -0
- package/dist/{ToolProbe-C7ZU2x7M.mjs → ToolProbe-DQiREmNp.mjs} +1 -1
- package/dist/{ToolRegistry-C5oB8KP8.mjs → ToolRegistry-eMZEBiR1.mjs} +1 -1
- package/dist/ToolRouter.policy-UKBlFlbh.mjs +4 -0
- package/dist/{TraceRecorder-BiJWBXHX.mjs → TraceRecorder-B5ktv3nP.mjs} +2 -2
- package/dist/VersionDetector-CmPJmaJg.mjs +1 -0
- package/dist/{Win32API-eUCF57l_.mjs → Win32API-DoP3MMHS.mjs} +1 -1
- package/dist/{Win32Debug-CYrIQBvr.mjs → Win32Debug-DwF8mQGm.mjs} +1 -1
- package/dist/{WorkflowEngine-D876meOO.mjs → WorkflowEngine-CldHG5b4.mjs} +1 -1
- package/dist/{analysis-D4swdMvq.mjs → analysis-C-ln0Brh.mjs} +3 -3
- package/dist/antidebug-CsnpOR9z.mjs +1 -0
- package/dist/{artifactRetention-BCPQASm7.mjs → artifactRetention-DkYKLOvi.mjs} +1 -1
- package/dist/{artifacts-CkodUM4j.mjs → artifacts-D-4pSS_N.mjs} +1 -1
- package/dist/{betterSqlite3-Brtq-SIQ.mjs → betterSqlite3-Bdo_ifuJ.mjs} +1 -1
- package/dist/binary-instrument-BeZ224mZ.mjs +9 -0
- package/dist/{boringssl-inspector-BBaJwwkU.mjs → boringssl-inspector-ZOCkaipa.mjs} +2 -2
- package/dist/browser-BUaB25bk.mjs +11 -0
- package/dist/{handlers-yo_xYzT8.mjs → canvas-396ieNv5.mjs} +22 -22
- package/dist/collector-CB2syQEg.mjs +1 -0
- package/dist/constants-DMv3svps.mjs +2 -0
- package/dist/coordination-Dbohmj6D.mjs +1 -0
- package/dist/dart-inspector-LhEqRITQ.mjs +0 -0
- package/dist/debugger-CLzkObIO.mjs +1 -0
- package/dist/{definitions-OeLvmlQy.mjs → definitions-0hxnrDU72.mjs} +1 -1
- package/dist/definitions-B3a9QC2t.mjs +1 -0
- package/dist/{definitions-Ibci7e_L.mjs → definitions-BOvju5t2.mjs} +1 -1
- package/dist/{definitions-D4g-MS10.mjs → definitions-CXj_cEVt.mjs} +1 -1
- package/dist/{definitions-C3qNgSn1.mjs → definitions-Co6AvTjH.mjs} +1 -1
- package/dist/{definitions-DxFNRQNK2.mjs → definitions-Cv5r8xwq.mjs} +1 -1
- package/dist/definitions-DBYSxChX.mjs +1 -0
- package/dist/{definitions-CQd7yCQH.mjs → definitions-D_dTDX9B.mjs} +1 -1
- package/dist/{definitions-l7TjdE6V.mjs → definitions-Db9t2ddh.mjs} +1 -1
- package/dist/{definitions-BWxBke3r.mjs → definitions-DbN2CjI2.mjs} +1 -1
- package/dist/{definitions-DAQm1Xar.mjs → definitions-DlmmHmZc.mjs} +1 -1
- package/dist/{definitions-Bf3H1EwV.mjs → definitions-DnYpoGig.mjs} +1 -1
- package/dist/{definitions-BYwATKc-.mjs → definitions-DtZ6Ktx2.mjs} +1 -1
- package/dist/{definitions-D5wl_8HN.mjs → definitions-DuIPS8gq.mjs} +1 -1
- package/dist/{definitions-RZYGD_Ey.mjs → definitions-DywfwPMb.mjs} +1 -1
- package/dist/definitions-EGmqr85H.mjs +1 -0
- package/dist/{definitions-bybDvnG0.mjs → definitions-Fetw_Cge.mjs} +3 -3
- package/dist/{definitions-CB6vmOer.mjs → definitions-LdkeuOeA.mjs} +1 -1
- package/dist/{definitions-B_83XfNQ.mjs → definitions-Ym8niHDb.mjs} +1 -1
- package/dist/{definitions-Cenu6mxo.mjs → definitions-aeRd5DAR.mjs} +1 -1
- package/dist/{definitions-CT8ln6GQ.mjs → definitions-cnG6tj17.mjs} +1 -1
- package/dist/{encoding-ycOaz8Vr.mjs → encoding-B4xZWErf.mjs} +2 -2
- package/dist/ensure-browser-core-JHwDo5ql.mjs +285 -0
- package/dist/{factory-CKr4fAE1.mjs → factory-BxNdBiZa.mjs} +1 -1
- package/dist/{graphql-B2TiPEow.mjs → graphql-GBWsZ9xC.mjs} +4 -4
- package/dist/{handlers-D5E40ssn.mjs → handlers-5nzR8B0a.mjs} +2 -2
- package/dist/handlers-6iNsXOVT.mjs +7 -0
- package/dist/{handlers-BpDlVVVU.mjs → handlers-BZ8n6Hvf.mjs} +1 -1
- package/dist/{handlers-0yKLRIfo.mjs → handlers-BbLxNbbT.mjs} +1 -1
- package/dist/{handlers-DGbdQAgD.mjs → handlers-BbS4hssc.mjs} +2 -2
- package/dist/{handlers-l8QIKqBj.mjs → handlers-CIKOP4aI.mjs} +2 -2
- package/dist/handlers-CWKBBjai.mjs +1 -0
- package/dist/{handlers-B62K4FTc.mjs → handlers-Cmb6SoRC.mjs} +1 -1
- package/dist/handlers-CrJsKnEI.mjs +1 -0
- package/dist/{antidebug-7L3ygj_9.mjs → handlers-DB6xVVWq.mjs} +2 -2
- package/dist/{handlers-CMJK7m1c.mjs → handlers-DOOCWUNR.mjs} +3 -3
- package/dist/{handlers-D2ZOul9p.mjs → handlers-Z_B5aVaU.mjs} +2 -2
- package/dist/handlers-gVscChvl.mjs +1 -0
- package/dist/handlers-xFvI9P_y.mjs +1 -0
- package/dist/{handlers.impl-D9Hh8Bgl.mjs → handlers.impl-BsFTW6SD.mjs} +1 -1
- package/dist/{hooks-D4XLfgtV.mjs → hooks-DPouiS7I.mjs} +9 -9
- package/dist/index.mjs +11 -11
- package/dist/macro-p8kuJVcm.mjs +2 -0
- package/dist/maintenance-DAqADb6Z.mjs +302 -0
- package/dist/manifest-4lmM6MZR.mjs +1 -0
- package/dist/{manifest-DujQqEQR.mjs → manifest-AxaxRSt6.mjs} +2 -2
- package/dist/{manifest-DYpn8w_h.mjs → manifest-BIqRE1Qz.mjs} +1 -1
- package/dist/manifest-Box-jWfr.mjs +1 -0
- package/dist/manifest-Bp33di0Q.mjs +1 -0
- package/dist/{manifest-CQH9FhwI.mjs → manifest-BvRX4nRP.mjs} +1 -1
- package/dist/{manifest-0Jpt_AQa.mjs → manifest-C6KoB1XE.mjs} +1 -1
- package/dist/manifest-C7TdXCWY.mjs +1 -0
- package/dist/manifest-CM-n64K0.mjs +1 -0
- package/dist/{manifest-nXHmtMSp2.mjs → manifest-CUokxCUN.mjs} +1 -1
- package/dist/manifest-CWJS45iO.mjs +1 -0
- package/dist/{manifest-LLdI5m4T.mjs → manifest-Cdxdgo-D.mjs} +1 -1
- package/dist/{manifest-D_obs5F4.mjs → manifest-Cf6SmamD.mjs} +1 -1
- package/dist/manifest-Cgxu2qdv.mjs +1 -0
- package/dist/{manifest-ztWJoXy4.mjs → manifest-CowGSURa2.mjs} +1 -1
- package/dist/{manifest-DYzWI8Xs.mjs → manifest-CsGIrh34.mjs} +1 -1
- package/dist/manifest-CvDpVToN.mjs +1 -0
- package/dist/manifest-D8TL9RLE.mjs +1 -0
- package/dist/{manifest-DCx6w2XV.mjs → manifest-DIhtCBe6.mjs} +1 -1
- package/dist/{manifest-D9jUUJAu.mjs → manifest-DJbruNOg.mjs} +1 -1
- package/dist/manifest-DLGtZH-0.mjs +1 -0
- package/dist/manifest-DXHdPt2T.mjs +1 -0
- package/dist/{manifest-B3fZbSWR.mjs → manifest-Dg5ScOyW.mjs} +1 -1
- package/dist/{manifest-xWfu6iLo.mjs → manifest-DzGoTS0R.mjs} +1 -1
- package/dist/manifest-G2H52LKz.mjs +131 -0
- package/dist/{manifest-CctIumog.mjs → manifest-P0Futrgb.mjs} +1 -1
- package/dist/{manifest-YgVd8Sgz.mjs → manifest-Qw7xgvjv.mjs} +1 -1
- package/dist/{manifest-QYbQXJn0.mjs → manifest-W3qvVrP2.mjs} +1 -1
- package/dist/manifest-dG6MuR1U.mjs +1 -0
- package/dist/manifest-nWXtgq5Y2.mjs +1 -0
- package/dist/{manifest-LG42zPLY2.mjs → manifest-vp1upSSq.mjs} +1 -1
- package/dist/{modules-BPBcSaM-.mjs → modules-DO3jXCgj.mjs} +10 -10
- package/dist/{mojo-ipc-BhwsdVUW.mjs → mojo-ipc-Be-ccWrc.mjs} +1 -1
- package/dist/native-g095qhpK.mjs +961 -0
- package/dist/network-Dvxm7eEI.mjs +7 -0
- package/dist/outputPaths-D2ddHrOJ.mjs +2 -0
- package/dist/{parse-args-Bw413PlW.mjs → parse-args-ngRrvF9e.mjs} +1 -1
- package/dist/platform-DjWbuiF8.mjs +93 -0
- package/dist/process-Dq5I-KZW.mjs +2 -0
- package/dist/proxy-DPNgM7TE.mjs +2 -0
- package/dist/{registry-DH4sc1dt.mjs → registry-xB8Wgmyj.mjs} +1 -1
- package/dist/{renderer-pid-9tJnZ_9N.mjs → renderer-pid-7jbTR8f5.mjs} +1 -1
- package/dist/search-defaults-CJik67or.mjs +1 -0
- package/dist/server/plugin-api.mjs +1 -1
- package/dist/sourcemap-DqEW15Ao.mjs +1 -0
- package/dist/streaming-Dbk4eStJ.mjs +1 -0
- package/dist/{transform-DOxzeWPB.mjs → transform-D-peM3aO.mjs} +2 -2
- package/dist/{wasm-CZ_HTfKR.mjs → wasm-CZajRaad.mjs} +6 -6
- package/dist/{webcrack-C1iYG_EX.mjs → webcrack-phEfVt5y.mjs} +3 -3
- package/dist/{workflow-BdwQmARn.mjs → workflow-wkXb3x-U.mjs} +3 -3
- package/package.json +2 -2
- package/dist/CodeInjector-Cll_7bLJ.mjs +0 -1
- package/dist/DOMInspector-C19J4zeq.mjs +0 -95
- package/dist/DetailedDataManager-DmQ1LT-W.mjs +0 -1
- package/dist/ExtensionManager-BD724zkO.mjs +0 -1
- package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +0 -1
- package/dist/MemoryScanner-g1_L1ub5.mjs +0 -1
- package/dist/NativeMemoryManager.impl-DniBe2wf.mjs +0 -1
- package/dist/NetworkMonitor-B_-au6aV.mjs +0 -185
- package/dist/PageController-Dfsm1_o7.mjs +0 -1
- package/dist/PointerChainEngine-BhCUkmxY.mjs +0 -1
- package/dist/PrerequisiteError-BjCQA-gK.mjs +0 -1
- package/dist/ScriptManager-LWGPTdvD.mjs +0 -7
- package/dist/ServerRuntimeState-D2bWHqEE.mjs +0 -1
- package/dist/ToolCatalog-CYdD9F5f.mjs +0 -1
- package/dist/ToolRouter.policy-CfhJczkt.mjs +0 -4
- package/dist/VersionDetector-CHT36Az0.mjs +0 -9
- package/dist/apk-packer-BqXcInnX.mjs +0 -1
- package/dist/binary-instrument-DU7V6TUM.mjs +0 -7
- package/dist/binary-secrets-PdMVoyt0.mjs +0 -1
- package/dist/browser-Qqco2rOT.mjs +0 -11
- package/dist/collector-Bpl6qy2L.mjs +0 -1
- package/dist/constants-BYj8Xek8.mjs +0 -1
- package/dist/coordination-CWXW1o8K.mjs +0 -1
- package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
- package/dist/debugger-DyALjYMk.mjs +0 -1
- package/dist/definitions-BftdXgXI.mjs +0 -1
- package/dist/definitions-Bio5XJYy.mjs +0 -1
- package/dist/definitions-CMZRSy3k.mjs +0 -1
- package/dist/definitions-DP1vgxEY.mjs +0 -1
- package/dist/definitions-Tls8c0A0.mjs +0 -1
- package/dist/ensure-browser-core-DxWC-NTp.mjs +0 -1
- package/dist/flat-target-session-DvcQX7J5.mjs +0 -1
- package/dist/handlers-8zN_vBIz.mjs +0 -1
- package/dist/handlers-DHO3rjsW.mjs +0 -1
- package/dist/handlers-FJ80VzUI.mjs +0 -2
- package/dist/handlers-VHWrxbM_.mjs +0 -1
- package/dist/handlers-mPFiNPe8.mjs +0 -302
- package/dist/jadx-search-B_Yse0Zh.mjs +0 -5
- package/dist/maintenance-BUpIukhg.mjs +0 -1
- package/dist/manifest-B7NB2rh2.mjs +0 -1
- package/dist/manifest-BDi4nbH1.mjs +0 -1
- package/dist/manifest-BLDfkE7n.mjs +0 -1
- package/dist/manifest-BcXbB4gf.mjs +0 -1
- package/dist/manifest-Bdnc_vrc.mjs +0 -1
- package/dist/manifest-BuYKgCnp.mjs +0 -1
- package/dist/manifest-CBfNnGPV.mjs +0 -1
- package/dist/manifest-CPS1Xv69.mjs +0 -1
- package/dist/manifest-CRryuZF4.mjs +0 -1
- package/dist/manifest-CvTe5ZGV2.mjs +0 -1
- package/dist/manifest-D-5GH0DV.mjs +0 -1
- package/dist/manifest-D3Ssf3IC.mjs +0 -1
- package/dist/manifest-D5ck3NvC.mjs +0 -1
- package/dist/manifest-DG19q-Ld.mjs +0 -1
- package/dist/manifest-DLMlD0Zc.mjs +0 -1
- package/dist/manifest-DwL2ik8P.mjs +0 -1
- package/dist/manifest-ItF5P8A12.mjs +0 -1
- package/dist/manifest-KZphqIyX.mjs +0 -1
- package/dist/manifest-RcpX_MyZ.mjs +0 -123
- package/dist/manifest-Zy7Odg5J.mjs +0 -1
- package/dist/manifest-ff1H7Pdp.mjs +0 -1
- package/dist/manifest-iuhF6pTL2.mjs +0 -1
- package/dist/manifest-yC16OhL2.mjs +0 -1
- package/dist/matchesWildcardPattern-BAG6LvX5.mjs +0 -1
- package/dist/native-j8l473zn.mjs +0 -961
- package/dist/network-T0VRwNPd.mjs +0 -7
- package/dist/outputPaths-B4Ic4RZh.mjs +0 -2
- package/dist/platform-CzaQtISh.mjs +0 -93
- package/dist/playwright-cdp-fallback-DqFdx9-s.mjs +0 -1
- package/dist/process-CWhsCWrf.mjs +0 -2
- package/dist/proxy-DZFlDsG3.mjs +0 -2
- package/dist/search-defaults-lYBVn_3L.mjs +0 -1
- package/dist/shared-state-board-BSjXLUV1.mjs +0 -1
- package/dist/sourcemap-Dh3Ai_ur.mjs +0 -1
- package/dist/streaming-BcJ0B6ao.mjs +0 -1
- package/dist/types-D9EiE5o9.mjs +0 -1
- /package/dist/{CacheAdapters-CsNtQIR8.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
- /package/dist/{EventBus-DL8iLA09.mjs → EventBus-Cm-t-B65.mjs} +0 -0
- /package/dist/{EvidenceGraphBridge-BtbwXsLC.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
- /package/dist/{HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
- /package/dist/{InstrumentationSession-D_G1ZPyd.mjs → InstrumentationSession-c5qZyp7d.mjs} +0 -0
- /package/dist/{ResponseBuilder-BfWP-uaT.mjs → ResponseBuilder-nPXl_khE.mjs} +0 -0
- /package/dist/{RingBuffer-Dm54ELKT.mjs → RingBuffer-B6RTHmij.mjs} +0 -0
- /package/dist/{StealthVerifier-BmcxfwSF.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
- /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
- /package/dist/{authorization-schema-BOFwSXUN.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
- /package/dist/{bind-helpers-m2U8glkF.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
- /package/dist/{capabilities-CyXuKUl1.mjs → capabilities-L1ax5EHS.mjs} +0 -0
- /package/dist/{chunk-C_pMuVsO.mjs → chunk-88NL7fhV.mjs} +0 -0
- /package/dist/{concurrency-DCr8WQ2M.mjs → concurrency-Dehnw4JC.mjs} +0 -0
- /package/dist/{evidence-graph-bridge-CV_UdYqj.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
- /package/dist/{formatAddress-vLA_hOJt.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
- /package/dist/{logger-sBC6IdRT.mjs → logger-CCikqqvj.mjs} +0 -0
- /package/dist/{response-C7rKQst4.mjs → response-B1RuVVfD.mjs} +0 -0
- /package/dist/{ssrf-policy-CsIJGkpd.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
- /package/dist/{tool-builder-qif8M9-K.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
- /package/dist/{types-Fz69RzbZ.mjs → types-BzPBzmVB.mjs} +0 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import{t as e}from"./logger-CCikqqvj.mjs";import{$t as t,Bt as n,Fr as r,Ir as i,Pr as a,Vt as o,hn as s}from"./constants-DMv3svps.mjs";import{n as c,t as l}from"./artifactRetention-DkYKLOvi.mjs";import{i as u,l as d}from"./outputPaths-D2ddHrOJ.mjs";import{a as f,n as p}from"./response-B1RuVVfD.mjs";import{t as m}from"./types-BzPBzmVB.mjs";import{r as h}from"./betterSqlite3-Bdo_ifuJ.mjs";import{r as g}from"./concurrency-Dehnw4JC.mjs";import{n as _}from"./ResponseBuilder-nPXl_khE.mjs";import{t as v}from"./ToolRegistry-eMZEBiR1.mjs";import"./definitions-DnYpoGig.mjs";import{createRequire as y}from"node:module";import{existsSync as b}from"node:fs";import{dirname as x,isAbsolute as S,join as C,relative as ee,resolve as w}from"node:path";import{mkdir as T,readFile as E,writeFile as te}from"node:fs/promises";import{fileURLToPath as ne}from"node:url";import{promisify as D}from"node:util";import{randomUUID as re}from"node:crypto";import{execFile as O}from"node:child_process";const k=D(O),A=y(import.meta.url);let j=null,M=0;function ie(){let e=Date.now();return(!j||e-M>12e4)&&(j=new v,M=e),j}function ae(e){let t=x(A.resolve(e));for(;;){let n=C(t,`package.json`);if(b(n))return n;let r=x(t);if(r===t)throw Error(`Could not locate package.json for ${e}`);t=r}}function N(e){return A(ae(e))}async function oe(e){let n=e?.includeBridgeHealth??!0,r=ie().probeAll(!0),i=g(()=>I(`git`,[`--version`])),a=g(()=>I(`python`,[`--version`])),o=g(()=>ce()),l=g(()=>I(`corepack`,[`--version`])),d=n?Promise.all([g(()=>L(`ghidra-bridge`,`${t.replace(/\/$/,``)}/health`)),g(()=>L(`ida-bridge`,`${s.replace(/\/$/,``)}/health`)),g(()=>L(`burp-mcp-sse`,process.env.BURP_MCP_SSE_URL?.trim()||`http://127.0.0.1:9876`))]):Promise.resolve([]),[f,p,m,h,_,v]=await Promise.all([r,i,a,o,l,d]),y=le(_,h),b=[P(`@modelcontextprotocol/sdk`),P(`rebrowser-puppeteer-core`),se(),P(`camoufox-js`,`Optional Firefox anti-detect driver`),P(`playwright-core`,`Optional browser automation dependency`),ue()],x=[p,m,h,y,...Object.entries(f).map(([e,t])=>({name:e,status:t.available?`ok`:`missing`,detail:t.available?`${t.path??`PATH`}${t.version?` (${t.version})`:``}`:t.reason??`Unavailable`}))],S=fe(),C=pe(b,x,v,S);return{success:[...b,...x,...v].every(e=>e.status!==`error`),generatedAt:new Date().toISOString(),runtime:{platform:process.platform,arch:process.arch,node:process.version,cwd:process.cwd(),projectRoot:u()},packages:b,commands:x,bridges:v,config:{transport:(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),toolProfile:(process.env.MCP_TOOL_PROFILE??`search`).toLowerCase(),pluginRoots:process.env.MCP_PLUGIN_ROOTS??`<jshook-install>/plugins`,workflowRoots:process.env.MCP_WORKFLOW_ROOTS??`<jshook-install>/workflows`,pluginSignatureRequired:process.env.MCP_PLUGIN_SIGNATURE_REQUIRED??(process.env.NODE_ENV===`production`?`true (production default)`:`false`),pluginStrictLoad:process.env.MCP_PLUGIN_STRICT_LOAD??(process.env.NODE_ENV===`production`?`true (production default)`:`false`),artifactRetention:c()},limitations:S,recommendations:C}}function P(e,t){try{let t=N(e);return{name:e,status:`ok`,detail:t.version?`installed (${t.version})`:`installed`}}catch{return{name:e,status:`missing`,detail:t??`Not installed`}}}function se(){let e=h();return{name:`better-sqlite3`,status:e.status,detail:e.detail}}function F(e){return e.status===`ok`||e.detail.includes(`npx fallback works`)}async function ce(){let e=await I(`pnpm`,[`--version`]);if(e.status===`ok`)return e;let t=await I(`npx`,[`pnpm`,`--version`],1e4);return t.status===`ok`?{name:`pnpm`,status:`warn`,detail:`direct pnpm command unavailable; npx fallback works (${t.detail})`}:e}function le(e,t){return e.status!==`missing`||!F(t)?e:{name:e.name,status:`warn`,detail:process.platform===`win32`?t.detail.includes(`npx fallback works`)?"corepack not found; use `npx pnpm` directly (common with nvm4w-managed Node on Windows)":`corepack not found; standalone pnpm is available (common with nvm4w-managed Node on Windows)`:t.detail.includes(`npx fallback works`)?"corepack not found; use `npx pnpm` directly":`corepack not found; standalone pnpm is available`}}function ue(){try{let e=N(`koffi`).version??`unknown`;if(process.platform===`win32`)return{name:`native-memory`,status:`ok`,detail:`koffi ${e} — Win32 kernel32.dll available`};if(process.platform===`darwin`)try{return A("koffi").load(`/usr/lib/libSystem.B.dylib`).unload(),delete A.cache[A.resolve(`koffi`)],{name:`native-memory`,status:`ok`,detail:`koffi ${e} — macOS libSystem.B.dylib available (Mach APIs need root + SIP config)`}}catch{return{name:`native-memory`,status:`warn`,detail:`koffi ${e} installed but cannot load libSystem.B.dylib`}}return{name:`native-memory`,status:`warn`,detail:`koffi ${e} — no native FFI memory provider for ${process.platform} (proc-based ops available on Linux)`}}catch{return{name:`native-memory`,status:`missing`,detail:`koffi not installed — native memory tools unavailable. Install with: pnpm add koffi`}}}async function I(e,t,n=4e3){try{let{stdout:r,stderr:i}=await k(e,t,{timeout:n,windowsHide:!0});return{name:e,status:`ok`,detail:`${r||i}`.trim().split(/\r?\n/)[0]||`available`}}catch(r){if(process.platform===`win32`)try{let{stdout:r,stderr:i}=await k(`cmd`,[`/c`,e,...t],{timeout:n,windowsHide:!0});return{name:e,status:`ok`,detail:`${`${r||i}`.trim().split(/\r?\n/)[0]||`available`} (via cmd)`}}catch(t){return de(e,t)}return de(e,r)}}function de(e,t){let n=t instanceof Error?t.message:String(t);return{name:e,status:/ENOENT|not recognized|not found/i.test(n)?`missing`:`warn`,detail:n}}async function L(e,t){try{let n=await fetch(t,{method:`GET`,signal:AbortSignal.timeout(3e3)});return{name:e,status:n.ok?`ok`:`warn`,detail:`${t} -> HTTP ${n.status}`}}catch(n){return{name:e,status:`warn`,detail:`${t} -> ${n instanceof Error?n.message:String(n)}`}}}function fe(){let e=[];return process.platform===`darwin`?(e.push(`26 cross-platform memory tools available (scan, pointer-chain, structure-analysis, heap). 15 Windows-only tools unavailable (PE analysis, anti-cheat, code injection, speedhack, hardware breakpoints).`),e.push(`Native memory operations (mach_vm_read/write) require root privileges and may require SIP configuration on ARM64.`)):process.platform===`linux`?(e.push(`Process management available via /proc. Native FFI memory provider not implemented — memory read/write uses /proc/pid/mem (requires root or CAP_SYS_PTRACE).`),e.push(`Camoufox runs on Linux, but some Chrome/CDP-heavy workflows are better served by the Chrome driver.`)):process.platform!==`win32`&&e.push(`Platform ${process.platform} is not supported for native memory operations. Use Windows or macOS.`),e}function pe(e,t,n,r){let i=[],a=t.find(e=>e.name===`pnpm`),o=t.find(e=>e.name===`corepack`);return e.some(e=>e.name===`better-sqlite3`&&e.status!==`ok`)&&i.push("Install or rebuild the optional SQLite trace backend with `pnpm add -O better-sqlite3@12.10.0` or `npm rebuild better-sqlite3 --foreground-scripts` under the active Node version if you need trace tooling."),e.some(e=>e.name===`camoufox-js`&&e.status!==`ok`)&&i.push("Install optional browser dependencies with `pnpm run install:full` if you need Camoufox support."),t.some(e=>e.name.startsWith(`wabt.`)&&e.status!==`ok`)&&i.push(`Install wabt if you need full WASM disassembly/decompilation; otherwise the server will stay in basic mode.`),a&&!F(a)?i.push("Install pnpm or enable Corepack (`corepack enable`) before running package-management workflows."):a?.detail.includes(`npx fallback works`)?i.push("Use `npx pnpm` directly on this machine or repair the local pnpm/Corepack shim if scripts expect bare `pnpm`."):o?.status===`warn`&&o.detail.includes(`standalone pnpm`)&&i.push("Use `pnpm` or `npx pnpm` directly on this machine; `corepack` is optional and may be absent on nvm4w-managed Windows installs."),n.some(e=>e.status!==`ok`)&&i.push(`Check local bridge endpoints (Ghidra / IDA / Burp) before relying on native-bridge workflows.`),r.length>0&&i.push(`Review platform limitations before using process/memory tooling on non-Windows hosts.`),i}var me=class{tokenBudget;unifiedCache;artifactCleanup;environmentDoctor;constructor(e){this.tokenBudget=e.tokenBudget,this.unifiedCache=e.unifiedCache,this.artifactCleanup=e.artifactCleanup??l,this.environmentDoctor=e.environmentDoctor??oe}async handleGetTokenBudgetStats(){return _(async()=>{let e=this.tokenBudget.getStats();return{...e,sessionDuration:`${Math.round((Date.now()-e.sessionStartTime)/1e3)}s`}})}async handleManualTokenCleanup(){return _(async()=>{let e=this.tokenBudget.getStats();this.tokenBudget.manualCleanup();let t=this.tokenBudget.getStats(),n=e.currentUsage-t.currentUsage;return{message:`Manual cleanup completed`,before:{usage:e.currentUsage,percentage:e.usagePercentage},after:{usage:t.currentUsage,percentage:t.usagePercentage},freed:{tokens:n,percentage:Math.round(n/e.maxTokens*100)}}})}async handleResetTokenBudget(){return _(async()=>(this.tokenBudget.reset(),{message:`Token budget reset successfully`,currentUsage:0,maxTokens:2e5,usagePercentage:0}))}async handleGetCacheStats(){return _(async()=>this.unifiedCache.getGlobalStats())}async handleSmartCacheCleanup(e){return _(async()=>this.unifiedCache.smartCleanup(e))}async handleClearAllCaches(){return _(async()=>(await this.unifiedCache.clearAll(),{message:`All caches cleared`}))}async handleCleanupArtifacts(e){return _(async()=>this.artifactCleanup({retentionDays:e.retentionDays,maxTotalBytes:e.maxTotalBytes,dryRun:e.dryRun}))}async handleEnvironmentDoctor(e){return _(async()=>this.environmentDoctor({includeBridgeHealth:e.includeBridgeHealth}))}};const R=D(O);function he(){return ne(new URL(`../../../../`,import.meta.url))}function ge(e){let t=e?.trim();if(t)return t.split(`,`).map(e=>e.trim()).find(e=>e.length>0)}function _e(e){let t=e===`workflow`?`MCP_WORKFLOW_ROOTS`:`MCP_PLUGIN_ROOTS`,n=ge(process.env[t]);return n?w(n):w(he(),e===`workflow`?`workflows`:`plugins`)}function z(){let e=(process.env.EXTENSION_REGISTRY_BASE_URL??``).trim().replace(/\/+$/,``);if(!e)throw Error(`EXTENSION_REGISTRY_BASE_URL is not configured. Set it in .env or environment before browsing or installing extensions.`);return e}function B(e,t){let n=e?.trim();if(!n){if(t===`subpath`)return`.`;throw Error(`Registry source.${t} must be a non-empty string`)}return n}function V(e,t,n){let r=ee(e,t).replace(/\\/g,`/`);if(r===`..`||r.startsWith(`../`)||S(r))throw Error(`Registry source.${n} must stay within ${e}: ${t}`)}function ve(e,t){let n=w(e,B(t,`subpath`));return V(e,n,`subpath`),n}function H(e,t){let n=w(e,B(t,`entry`));return V(e,n,`entry`),n}function ye(e){let t=B(e,`entry`).replace(/\\/g,`/`),n=[t];if(!t.endsWith(`.ts`))return n;let r=`${t.slice(0,-3)}.js`;return n.unshift(r),t.startsWith(`dist/`)||n.unshift(`dist/${r}`),[...new Set(n)]}function be(e,t){let n=ye(t);for(let t of n)if(b(H(e,t)))return t;return B(t,`entry`)}async function xe(e,t,n,r){let i={version:1,kind:e,slug:t.slug,id:t.id,source:{type:t.source.type,repo:t.source.repo,ref:t.source.ref,commit:t.source.commit,subpath:B(t.source.subpath,`subpath`),entry:B(r,`entry`)}},a=w(n,m);return await te(a,`${JSON.stringify(i,null,2)}\n`,`utf8`),a}const U=`@jshookmcp/extension-sdk`,Se=[`workspace:`,`link:`,`file:`];function Ce(){return d().paths.registryCacheDir}var W=class extends Error{code;url;cachePath;status;constructor(e,t,n,r,i){super(n),this.code=e,this.url=t,this.cachePath=r,this.status=i,this.name=`RegistryFetchError`}};function we(e){return process.platform===`win32`?e.endsWith(`.cmd`)||e.endsWith(`.exe`)?e:`${e}.cmd`:e}function Te(e,t){return{command:we(e),args:t}}async function G(e,t,n){let r=Te(e,t);return R(r.command,r.args,{...n,env:{...process.env,...n?.env,CI:`true`}})}async function Ee(e){let t=w(e,`package.json`),n=w(e,`pnpm-lock.yaml`),r=w(e,`package-lock.json`);if(b(t))try{let e=await E(t,`utf8`),n=JSON.parse(e).packageManager?.trim().toLowerCase().split(`@`)[0];if(n===`pnpm`)return`pnpm`;if(n===`npm`)return`npm`}catch{}return b(n)?`pnpm`:b(r)?`npm`:`pnpm`}function K(e){return w(Ce(),`registry-${e}.json`)}async function De(e){let t=K(e);try{let e=await E(t,`utf8`);return JSON.parse(e)}catch{return null}}async function Oe(e,t){let n=K(e);await T(x(n),{recursive:!0}),await te(n,JSON.stringify(t,null,2),`utf8`)}function ke(e,t,n){if(t instanceof W)return t;if(t instanceof DOMException&&t.name===`AbortError`)return new W(`timeout`,e,`Registry fetch timed out after 10000ms: ${e}`,n);let r=t instanceof Error?t.message:String(t);if(r.includes(`ENOTFOUND`)||r.includes(`getaddrinfo`))return new W(`dns_failure`,e,`DNS resolution failed for registry URL: ${e}`,n);if(r.includes(`ECONNREFUSED`))return new W(`connection_refused`,e,`Connection refused by registry server: ${e}`,n);if(r.includes(`CERT_`)||r.includes(`certificate`)||r.includes(`SSL`))return new W(`tls_error`,e,`TLS/certificate error when connecting to registry: ${e}`,n);let i=r.match(/HTTP\s+(\d+)/i);return i?new W(`http_error`,e,r,n,Number(i[1])):new W(`fetch_failed`,e,r,n)}function Ae(e){return{success:!1,error:e.code,message:e.message,url:e.url,...typeof e.status==`number`?{status:e.status}:{}}}async function q(t,n){let r=new AbortController,i=setTimeout(()=>r.abort(),1e4),a=n?.cacheKey?K(n.cacheKey):void 0;try{let i=await fetch(t,{signal:r.signal});if(!i.ok)throw new W(`http_error`,t,`HTTP ${i.status} ${i.statusText} from ${t}`,a,i.status);let o=await i.json();if(n?.cacheKey)try{await Oe(n.cacheKey,o)}catch(r){e.warn(`[extensions] Failed to persist ${n.cacheKey} registry cache for ${t}:`,r)}return{data:o,stale:!1,source:`network`,cachePath:a}}catch(r){let i=ke(t,r,a);if(n?.cacheKey){let r=await De(n.cacheKey);if(r)return e.warn(`[extensions] Using stale ${n.cacheKey} registry cache after ${i.code}: ${t}`),{data:r,stale:!0,source:`cache`,cachePath:a}}throw i}finally{clearTimeout(i)}}function je(e){let t=e.trim();return t?Se.some(e=>t.startsWith(e))||t.startsWith(`./`)||t.startsWith(`../`)||t.startsWith(`/`)?!0:/^[A-Za-z]:[\\/]/.test(t):!1}async function Me(e){let t=await E(w(e,`package.json`),`utf8`),n=JSON.parse(t);for(let e of[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`]){let t=n[e];if(!t||typeof t!=`object`)continue;let r=t[U];if(typeof r==`string`&&je(r))throw Error(`package.json ${e}.${U} uses unsupported local dependency spec "${r}". Declare a published npm version instead, for example "^0.3.2".`)}}async function Ne(e,t){let[n,r]=await Promise.allSettled([q(`${e}/workflows.index.json`,{cacheKey:`workflows`}),q(`${e}/plugins.index.json`,{cacheKey:`plugins`})]);if(n.status===`fulfilled`){let e=(Array.isArray(n.value.data.workflows)?n.value.data.workflows:[]).find(e=>e.slug===t);if(e)return{entry:e,kind:`workflow`}}if(r.status===`fulfilled`){let e=(Array.isArray(r.value.data.plugins)?r.value.data.plugins:[]).find(e=>e.slug===t);if(e)return{entry:e,kind:`plugin`}}let i=n.status===`rejected`?n.reason instanceof Error?n.reason:Error(String(n.reason)):void 0,a=r.status===`rejected`?r.reason instanceof Error?r.reason:Error(String(r.reason)):void 0;throw Error(i&&a?`Failed to resolve extension slug "${t}": workflow registry error: ${i.message}; plugin registry error: ${a.message}`:a?`Extension "${t}" was not found in workflow registry, and plugin registry lookup failed: ${a.message}`:i?`Extension "${t}" was not found in plugin registry, and workflow registry lookup failed: ${i.message}`:`Extension "${t}" not found in workflow or plugin registry`)}var Pe=class{ctx;constructor(e){this.ctx=e}async handleListExtensions(){try{return p({success:!0,...this.ctx.listExtensions()})}catch(t){return e.error(`Failed to list extensions:`,t),p(f(t))}}async handleReloadExtensions(){try{return p({success:!0,...await this.ctx.reloadExtensions()})}catch(t){return e.error(`Failed to reload extensions:`,t),p(f(t))}}async handleBrowseExtensionRegistry(t){try{let e=z(),n=t===`all`||t===`plugin`,r=t===`all`||t===`workflow`,i={success:!0},a=!1,o=n?q(`${e}/plugins.index.json`,{cacheKey:`plugins`}):void 0,s=r?q(`${e}/workflows.index.json`,{cacheKey:`workflows`}):void 0,[c,l]=await Promise.all([o??Promise.resolve(void 0),s??Promise.resolve(void 0)]);if(c){let e=Array.isArray(c.data.plugins)?c.data.plugins:[];i.plugins=e.map(e=>({slug:e.slug,id:e.id,name:e.meta.name,description:e.meta.description,author:e.meta.author,repo:e.source.repo,commit:e.source.commit,entry:e.source.entry})),i.pluginCount=e.length,i.pluginSource=c.source,a||=c.stale}if(l){let e=Array.isArray(l.data.workflows)?l.data.workflows:[];i.workflows=e.map(e=>({slug:e.slug,id:e.id,name:e.meta.name,description:e.meta.description,author:e.meta.author,repo:e.source.repo,commit:e.source.commit,entry:e.source.entry})),i.workflowCount=e.length,i.workflowSource=l.source,a||=l.stale}return a&&(i.stale=!0),p(i)}catch(t){return e.error(`Failed to browse extension registry:`,t),t instanceof W?p(Ae(t)):p(f(t))}}async handleInstallExtension(t,r){try{let{entry:e,kind:i}=await Ne(z(),t),a=i===`workflow`,s=_e(a?`workflow`:`plugin`),c=r?w(r):w(s,t),l=ve(c,e.source.subpath);if(H(l,e.source.entry),b(c))return p({success:!1,error:`Target directory already exists: ${c}`,hint:`Remove the existing directory first, or specify a different targetDir`});await T(x(c),{recursive:!0});let u=process.platform===`win32`?`git.exe`:`git`;if(await R(u,[`clone`,e.source.repo,c],{timeout:o}),await R(u,[`-C`,c,`checkout`,e.source.commit],{timeout:n}),b(w(l,`package.json`))){await Me(l);let e=await Ee(l);await G(e,e===`pnpm`?[`--ignore-workspace`,`install`,`--no-frozen-lockfile`,`--ignore-scripts`]:[`install`,`--ignore-scripts`],{cwd:l,timeout:Math.max(o,12e4)}),await G(e,e===`pnpm`?[`--ignore-workspace`,`run`,`--if-present`,`build`]:[`run`,`build`,`--if-present`],{cwd:l,timeout:Math.max(o,12e4)})}let d=be(l,e.source.entry),f=H(l,d);if(!b(f))return p({success:!1,error:`Installed extension entry not found: ${d}`,installDir:c,projectDir:l,expectedEntryFile:f,hint:`The registry source.entry or its compiled JS output must exist after clone/build before reloadExtensions can load it.`});let m=await xe(a?`workflow`:`plugin`,e,l,d),h=await this.ctx.reloadExtensions();return p({success:!0,installed:{slug:e.slug,id:e.id,name:e.meta.name,repo:e.source.repo,commit:e.source.commit,installDir:c,projectDir:l,entry:d,entryFile:f,metadataPath:m},reload:{addedTools:h.addedTools,pluginCount:h.pluginCount,workflowCount:h.workflowCount,errors:h.errors,warnings:h.warnings}})}catch(t){return e.error(`Failed to install extension:`,t),p(f(t))}}};const J=a,Y=i*1024*1024;let X=null;function Z(){return X||=import(`quickjs-emscripten`).then(e=>e.getQuickJS()),X}function Q(e,t){if(t==null)return e.undefined;switch(typeof t){case`string`:return e.newString(t);case`number`:return e.newNumber(t);case`boolean`:return t?e.true:e.false;case`object`:{if(Array.isArray(t)){let n=e.newArray();for(let r=0;r<t.length;r++){let i=Q(e,t[r]);e.setProp(n,r,i),i.dispose()}return n}let n=e.newObject();for(let[r,i]of Object.entries(t)){let t=Q(e,i);e.setProp(n,r,t),t.dispose()}return n}default:return e.newString(String(t))}}function $(e,t){switch(e.typeof(t)){case`undefined`:return;case`number`:return e.getNumber(t);case`string`:return e.getString(t);case`boolean`:return e.dump(t);case`object`:return e.dump(t);default:return e.dump(t)}}var Fe=class{bridge=null;setBridge(e){this.bridge=e}async execute(e,t={}){let n=t.timeoutMs??J,r=t.memoryLimitBytes??Y,i=(await Z()).newRuntime();i.setMemoryLimit(r);let a=Date.now(),o=!1;i.setInterruptHandler(()=>Date.now()-a>n?(o=!0,!0):!1);let s=i.newContext(),c=[];try{this.injectConsole(s,c),this.injectHelpers(s),this.bridge&&this.injectBridge(s,this.bridge,c),t.globals&&this.injectGlobals(s,t.globals);let n=s.evalCode(e,`sandbox-eval.js`);if(n.error){let e=s.dump(n.error);return n.error.dispose(),o?{ok:!1,error:`Execution timed out`,timedOut:!0,durationMs:Date.now()-a,logs:c}:{ok:!1,error:typeof e==`object`?JSON.stringify(e):String(e),timedOut:!1,durationMs:Date.now()-a,logs:c}}let r=$(s,n.value);return n.value.dispose(),{ok:!0,output:r,timedOut:!1,durationMs:Date.now()-a,logs:c}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e),timedOut:o,durationMs:Date.now()-a,logs:c}}finally{s.dispose(),i.dispose()}}async executeWithOrchestration(e,t,n={}){let r=n.maxBridgeCalls??10,i=Date.now(),a=[],o=[];n.bridgeAllowlist&&t.setAllowlist(n.bridgeAllowlist);let s={},c,l=0;for(;l<=r;){let r={...n.globals,__bridgeRound:l};l>0&&(r.__bridgeResults=s);let u=await this.executeOneRound(e,t,{...n,globals:r});if(a.push(...u.logs),!u.ok||u.timedOut)return{...u,logs:a,durationMs:Date.now()-i,bridgeCallCount:o.length,bridgeCalls:o};if(c=u.output,!t.hasPending())break;let d=t.drainPending(),f={};for(let e of d)try{let n=await t.call(e.toolName,e.args);f[e.id]=n,o.push({toolName:e.toolName,args:e.args,result:n})}catch(t){let n=t instanceof Error?t.message:String(t);f[e.id]={__error:!0,message:n},o.push({toolName:e.toolName,args:e.args,result:{__error:!0,message:n}})}s={...s,...f},l++}return{ok:!0,output:c,timedOut:!1,durationMs:Date.now()-i,logs:a,bridgeCallCount:o.length,bridgeCalls:o}}async executeOneRound(e,t,n={}){let r=n.timeoutMs??J,i=n.memoryLimitBytes??Y,a=(await Z()).newRuntime();a.setMemoryLimit(i);let o=Date.now(),s=!1;a.setInterruptHandler(()=>Date.now()-o>r?(s=!0,!0):!1);let c=a.newContext(),l=[];try{this.injectConsole(c,l),this.injectHelpers(c),this.injectBridgeForOrchestration(c,t,l),n.globals&&this.injectGlobals(c,n.globals);let r=c.evalCode(e,`sandbox-eval.js`);if(r.error){let e=c.dump(r.error);return r.error.dispose(),s?{ok:!1,error:`Execution timed out`,timedOut:!0,durationMs:Date.now()-o,logs:l}:{ok:!1,error:typeof e==`object`?JSON.stringify(e):String(e),timedOut:!1,durationMs:Date.now()-o,logs:l}}let i=$(c,r.value);return r.value.dispose(),{ok:!0,output:i,timedOut:!1,durationMs:Date.now()-o,logs:l}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e),timedOut:s,durationMs:Date.now()-o,logs:l}}finally{c.dispose(),a.dispose()}}injectConsole(e,t){let n=e.newObject(),r=e.newFunction(`log`,(...n)=>{let r=n.map(t=>{let n=$(e,t);return typeof n==`string`?n:JSON.stringify(n)});t.push(r.join(` `))});e.setProp(n,`log`,r),e.setProp(n,`warn`,r),e.setProp(n,`error`,r),e.setProp(e.global,`console`,n),r.dispose(),n.dispose()}injectGlobals(e,t){for(let[n,r]of Object.entries(t)){let t=Q(e,r);e.setProp(e.global,n,t),t.dispose()}}injectHelpers(e){let t=e.evalCode(`
|
|
2
|
+
(function() {
|
|
3
|
+
var helpers = {};
|
|
4
|
+
|
|
5
|
+
// ── base64 ──
|
|
6
|
+
helpers.base64 = {
|
|
7
|
+
_chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
|
|
8
|
+
encode: function(str) {
|
|
9
|
+
var output = '';
|
|
10
|
+
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
|
|
11
|
+
var i = 0;
|
|
12
|
+
while (i < str.length) {
|
|
13
|
+
chr1 = str.charCodeAt(i++);
|
|
14
|
+
chr2 = str.charCodeAt(i++);
|
|
15
|
+
chr3 = str.charCodeAt(i++);
|
|
16
|
+
enc1 = chr1 >> 2;
|
|
17
|
+
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
|
|
18
|
+
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
|
19
|
+
enc4 = chr3 & 63;
|
|
20
|
+
if (isNaN(chr2)) { enc3 = enc4 = 64; }
|
|
21
|
+
else if (isNaN(chr3)) { enc4 = 64; }
|
|
22
|
+
output += this._chars.charAt(enc1) + this._chars.charAt(enc2) +
|
|
23
|
+
this._chars.charAt(enc3) + this._chars.charAt(enc4);
|
|
24
|
+
}
|
|
25
|
+
return output;
|
|
26
|
+
},
|
|
27
|
+
decode: function(str) {
|
|
28
|
+
var output = '';
|
|
29
|
+
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
|
|
30
|
+
var i = 0;
|
|
31
|
+
str = str.replace(/[^A-Za-z0-9+/=]/g, '');
|
|
32
|
+
while (i < str.length) {
|
|
33
|
+
enc1 = this._chars.indexOf(str.charAt(i++));
|
|
34
|
+
enc2 = this._chars.indexOf(str.charAt(i++));
|
|
35
|
+
enc3 = this._chars.indexOf(str.charAt(i++));
|
|
36
|
+
enc4 = this._chars.indexOf(str.charAt(i++));
|
|
37
|
+
chr1 = (enc1 << 2) | (enc2 >> 4);
|
|
38
|
+
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
|
39
|
+
chr3 = ((enc3 & 3) << 6) | enc4;
|
|
40
|
+
output += String.fromCharCode(chr1);
|
|
41
|
+
if (enc3 !== 64) output += String.fromCharCode(chr2);
|
|
42
|
+
if (enc4 !== 64) output += String.fromCharCode(chr3);
|
|
43
|
+
}
|
|
44
|
+
return output;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// ── hex ──
|
|
49
|
+
helpers.hex = {
|
|
50
|
+
encode: function(str) {
|
|
51
|
+
var hex = '';
|
|
52
|
+
for (var i = 0; i < str.length; i++) {
|
|
53
|
+
hex += ('0' + str.charCodeAt(i).toString(16)).slice(-2);
|
|
54
|
+
}
|
|
55
|
+
return hex;
|
|
56
|
+
},
|
|
57
|
+
decode: function(hex) {
|
|
58
|
+
var str = '';
|
|
59
|
+
for (var i = 0; i < hex.length; i += 2) {
|
|
60
|
+
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
|
|
61
|
+
}
|
|
62
|
+
return str;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// ── hash (simple djb2/fnv for in-sandbox use; NOT cryptographic!) ──
|
|
67
|
+
helpers.hash = {
|
|
68
|
+
djb2: function(str) {
|
|
69
|
+
var hash = 5381;
|
|
70
|
+
for (var i = 0; i < str.length; i++) {
|
|
71
|
+
hash = ((hash << 5) + hash) + str.charCodeAt(i);
|
|
72
|
+
hash = hash & hash; // Convert to 32-bit
|
|
73
|
+
}
|
|
74
|
+
return (hash >>> 0).toString(16);
|
|
75
|
+
},
|
|
76
|
+
fnv1a: function(str) {
|
|
77
|
+
var hash = 0x811c9dc5;
|
|
78
|
+
for (var i = 0; i < str.length; i++) {
|
|
79
|
+
hash ^= str.charCodeAt(i);
|
|
80
|
+
hash = Math.imul(hash, 0x01000193);
|
|
81
|
+
}
|
|
82
|
+
return (hash >>> 0).toString(16);
|
|
83
|
+
},
|
|
84
|
+
/** Simple MD5 — pure JS implementation */
|
|
85
|
+
md5: function(str) {
|
|
86
|
+
// Lightweight MD5 for sandbox use
|
|
87
|
+
function md5cycle(x, k) {
|
|
88
|
+
var a = x[0], b = x[1], c = x[2], d = x[3];
|
|
89
|
+
a = ff(a,b,c,d,k[0],7,0xd76aa478);
|
|
90
|
+
d=ff(d,a,b,c,k[1],12,0xe8c7b756);
|
|
91
|
+
c=ff(c,d,a,b,k[2],17,0x242070db);
|
|
92
|
+
b=ff(b,c,d,a,k[3],22,0xc1bdceee);
|
|
93
|
+
a=ff(a,b,c,d,k[4],7,0xf57c0faf);
|
|
94
|
+
d=ff(d,a,b,c,k[5],12,0x4787c62a);
|
|
95
|
+
c=ff(c,d,a,b,k[6],17,0xa8304613);
|
|
96
|
+
b=ff(b,c,d,a,k[7],22,0xfd469501);
|
|
97
|
+
a=ff(a,b,c,d,k[8],7,0x698098d8);
|
|
98
|
+
d=ff(d,a,b,c,k[9],12,0x8b44f7af);
|
|
99
|
+
c=ff(c,d,a,b,k[10],17,0xffff5bb1);
|
|
100
|
+
b=ff(b,c,d,a,k[11],22,0x895cd7be);
|
|
101
|
+
a=ff(a,b,c,d,k[12],7,0x6b901122);
|
|
102
|
+
d=ff(d,a,b,c,k[13],12,0xfd987193);
|
|
103
|
+
c=ff(c,d,a,b,k[14],17,0xa679438e);
|
|
104
|
+
b=ff(b,c,d,a,k[15],22,0x49b40821);
|
|
105
|
+
a=gg(a,b,c,d,k[1],5,0xf61e2562);
|
|
106
|
+
d=gg(d,a,b,c,k[6],9,0xc040b340);
|
|
107
|
+
c=gg(c,d,a,b,k[11],14,0x265e5a51);
|
|
108
|
+
b=gg(b,c,d,a,k[0],20,0xe9b6c7aa);
|
|
109
|
+
a=gg(a,b,c,d,k[5],5,0xd62f105d);
|
|
110
|
+
d=gg(d,a,b,c,k[10],9,0x02441453);
|
|
111
|
+
c=gg(c,d,a,b,k[15],14,0xd8a1e681);
|
|
112
|
+
b=gg(b,c,d,a,k[4],20,0xe7d3fbc8);
|
|
113
|
+
a=gg(a,b,c,d,k[9],5,0x21e1cde6);
|
|
114
|
+
d=gg(d,a,b,c,k[14],9,0xc33707d6);
|
|
115
|
+
c=gg(c,d,a,b,k[3],14,0xf4d50d87);
|
|
116
|
+
b=gg(b,c,d,a,k[8],20,0x455a14ed);
|
|
117
|
+
a=gg(a,b,c,d,k[13],5,0xa9e3e905);
|
|
118
|
+
d=gg(d,a,b,c,k[2],9,0xfcefa3f8);
|
|
119
|
+
c=gg(c,d,a,b,k[7],14,0x676f02d9);
|
|
120
|
+
b=gg(b,c,d,a,k[12],20,0x8d2a4c8a);
|
|
121
|
+
a=hh(a,b,c,d,k[5],4,0xfffa3942);
|
|
122
|
+
d=hh(d,a,b,c,k[8],11,0x8771f681);
|
|
123
|
+
c=hh(c,d,a,b,k[11],16,0x6d9d6122);
|
|
124
|
+
b=hh(b,c,d,a,k[14],23,0xfde5380c);
|
|
125
|
+
a=hh(a,b,c,d,k[1],4,0xa4beea44);
|
|
126
|
+
d=hh(d,a,b,c,k[4],11,0x4bdecfa9);
|
|
127
|
+
c=hh(c,d,a,b,k[7],16,0xf6bb4b60);
|
|
128
|
+
b=hh(b,c,d,a,k[10],23,0xbebfbc70);
|
|
129
|
+
a=hh(a,b,c,d,k[13],4,0x289b7ec6);
|
|
130
|
+
d=hh(d,a,b,c,k[0],11,0xeaa127fa);
|
|
131
|
+
c=hh(c,d,a,b,k[3],16,0xd4ef3085);
|
|
132
|
+
b=hh(b,c,d,a,k[6],23,0x04881d05);
|
|
133
|
+
a=hh(a,b,c,d,k[9],4,0xd9d4d039);
|
|
134
|
+
d=hh(d,a,b,c,k[12],11,0xe6db99e5);
|
|
135
|
+
c=hh(c,d,a,b,k[15],16,0x1fa27cf8);
|
|
136
|
+
b=hh(b,c,d,a,k[2],23,0xc4ac5665);
|
|
137
|
+
a=ii(a,b,c,d,k[0],6,0xf4292244);
|
|
138
|
+
d=ii(d,a,b,c,k[7],10,0x432aff97);
|
|
139
|
+
c=ii(c,d,a,b,k[14],15,0xab9423a7);
|
|
140
|
+
b=ii(b,c,d,a,k[5],21,0xfc93a039);
|
|
141
|
+
a=ii(a,b,c,d,k[12],6,0x655b59c3);
|
|
142
|
+
d=ii(d,a,b,c,k[3],10,0x8f0ccc92);
|
|
143
|
+
c=ii(c,d,a,b,k[10],15,0xffeff47d);
|
|
144
|
+
b=ii(b,c,d,a,k[1],21,0x85845dd1);
|
|
145
|
+
a=ii(a,b,c,d,k[8],6,0x6fa87e4f);
|
|
146
|
+
d=ii(d,a,b,c,k[15],10,0xfe2ce6e0);
|
|
147
|
+
c=ii(c,d,a,b,k[6],15,0xa3014314);
|
|
148
|
+
b=ii(b,c,d,a,k[13],21,0x4e0811a1);
|
|
149
|
+
a=ii(a,b,c,d,k[4],6,0xf7537e82);
|
|
150
|
+
d=ii(d,a,b,c,k[11],10,0xbd3af235);
|
|
151
|
+
c=ii(c,d,a,b,k[2],15,0x2ad7d2bb);
|
|
152
|
+
b=ii(b,c,d,a,k[9],21,0xeb86d391);
|
|
153
|
+
x[0]=add32(a,x[0]);x[1]=add32(b,x[1]);x[2]=add32(c,x[2]);x[3]=add32(d,x[3]);
|
|
154
|
+
}
|
|
155
|
+
function cmn(q,a,b,x,s,t){a=add32(add32(a,q),add32(x,t));return add32((a<<s)|(a>>>(32-s)),b)}
|
|
156
|
+
function ff(a,b,c,d,x,s,t){return cmn((b&c)|((~b)&d),a,b,x,s,t)}
|
|
157
|
+
function gg(a,b,c,d,x,s,t){return cmn((b&d)|(c&(~d)),a,b,x,s,t)}
|
|
158
|
+
function hh(a,b,c,d,x,s,t){return cmn(b^c^d,a,b,x,s,t)}
|
|
159
|
+
function ii(a,b,c,d,x,s,t){return cmn(c^(b|(~d)),a,b,x,s,t)}
|
|
160
|
+
function add32(a,b){return(a+b)&0xFFFFFFFF}
|
|
161
|
+
|
|
162
|
+
var n = str.length;
|
|
163
|
+
var state = [1732584193,-271733879,-1732584194,271733878];
|
|
164
|
+
var tail = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
|
|
165
|
+
var i;
|
|
166
|
+
for (i = 64; i <= n; i += 64) {
|
|
167
|
+
var blk = [];
|
|
168
|
+
for (var j = i - 64; j < i; j += 4) {
|
|
169
|
+
blk.push(str.charCodeAt(j)|(str.charCodeAt(j+1)<<8)|(str.charCodeAt(j+2)<<16)|(str.charCodeAt(j+3)<<24));
|
|
170
|
+
}
|
|
171
|
+
md5cycle(state, blk);
|
|
172
|
+
}
|
|
173
|
+
for (var j = 0; j < 16; j++) tail[j] = 0;
|
|
174
|
+
for (i = i - 64; i < n; i++) {
|
|
175
|
+
tail[i>>2] |= str.charCodeAt(i) << ((i%4)<<3);
|
|
176
|
+
}
|
|
177
|
+
tail[i>>2] |= 0x80 << ((i%4)<<3);
|
|
178
|
+
if (i > 55) { md5cycle(state, tail); for (j = 0; j < 16; j++) tail[j] = 0; }
|
|
179
|
+
tail[14] = n * 8;
|
|
180
|
+
md5cycle(state, tail);
|
|
181
|
+
|
|
182
|
+
var hex_chr = '0123456789abcdef';
|
|
183
|
+
var s = '';
|
|
184
|
+
for (i = 0; i < 4; i++) {
|
|
185
|
+
for (j = 0; j < 4; j++) {
|
|
186
|
+
s += hex_chr.charAt((state[i] >> (j*8+4)) & 0x0F) + hex_chr.charAt((state[i] >> (j*8)) & 0x0F);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return s;
|
|
190
|
+
},
|
|
191
|
+
sha256: function(str) {
|
|
192
|
+
// Minimal pure-JS SHA-256
|
|
193
|
+
var K = [0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
|
|
194
|
+
0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
|
|
195
|
+
0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
|
|
196
|
+
0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
|
|
197
|
+
0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
|
|
198
|
+
0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
|
|
199
|
+
0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
|
|
200
|
+
0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2];
|
|
201
|
+
function rr(x,n){return(x>>>n)|(x<<(32-n))}
|
|
202
|
+
var H=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19];
|
|
203
|
+
var msg=[];
|
|
204
|
+
for(var i=0;i<str.length;i++)msg.push(str.charCodeAt(i));
|
|
205
|
+
msg.push(0x80);
|
|
206
|
+
var l=msg.length;
|
|
207
|
+
while(l%64!==56){msg.push(0);l++;}
|
|
208
|
+
var bits=str.length*8;
|
|
209
|
+
for(i=7;i>=0;i--)msg.push((bits>>>(i*8))&0xff);
|
|
210
|
+
for(var offset=0;offset<msg.length;offset+=64){
|
|
211
|
+
var W=[];
|
|
212
|
+
for(i=0;i<16;i++)W[i]=(msg[offset+i*4]<<24)|(msg[offset+i*4+1]<<16)|(msg[offset+i*4+2]<<8)|msg[offset+i*4+3];
|
|
213
|
+
for(i=16;i<64;i++){
|
|
214
|
+
var s0=rr(W[i-15],7)^rr(W[i-15],18)^(W[i-15]>>>3);
|
|
215
|
+
var s1=rr(W[i-2],17)^rr(W[i-2],19)^(W[i-2]>>>10);
|
|
216
|
+
W[i]=(W[i-16]+s0+W[i-7]+s1)|0;
|
|
217
|
+
}
|
|
218
|
+
var a=H[0],b=H[1],c=H[2],d=H[3],e=H[4],f=H[5],g=H[6],h=H[7];
|
|
219
|
+
for(i=0;i<64;i++){
|
|
220
|
+
var S1=rr(e,6)^rr(e,11)^rr(e,25);
|
|
221
|
+
var ch=(e&f)^((~e)&g);
|
|
222
|
+
var t1=(h+S1+ch+K[i]+W[i])|0;
|
|
223
|
+
var S0=rr(a,2)^rr(a,13)^rr(a,22);
|
|
224
|
+
var maj=(a&b)^(a&c)^(b&c);
|
|
225
|
+
var t2=(S0+maj)|0;
|
|
226
|
+
h=g;g=f;f=e;e=(d+t1)|0;d=c;c=b;b=a;a=(t1+t2)|0;
|
|
227
|
+
}
|
|
228
|
+
H[0]=(H[0]+a)|0;H[1]=(H[1]+b)|0;H[2]=(H[2]+c)|0;H[3]=(H[3]+d)|0;
|
|
229
|
+
H[4]=(H[4]+e)|0;H[5]=(H[5]+f)|0;H[6]=(H[6]+g)|0;H[7]=(H[7]+h)|0;
|
|
230
|
+
}
|
|
231
|
+
var hex='';
|
|
232
|
+
for(i=0;i<8;i++)for(var j=7;j>=0;j--)hex+='0123456789abcdef'.charAt((H[i]>>>(j*4))&0xf);
|
|
233
|
+
return hex;
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// ── json ──
|
|
238
|
+
helpers.json = {
|
|
239
|
+
safeParse: function(str) {
|
|
240
|
+
try { return { ok: true, value: JSON.parse(str) }; }
|
|
241
|
+
catch(e) { return { ok: false, error: e.message }; }
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
// ── array ──
|
|
246
|
+
helpers.array = {
|
|
247
|
+
chunk: function(arr, size) {
|
|
248
|
+
var result = [];
|
|
249
|
+
for (var i = 0; i < arr.length; i += size) {
|
|
250
|
+
result.push(arr.slice(i, i + size));
|
|
251
|
+
}
|
|
252
|
+
return result;
|
|
253
|
+
},
|
|
254
|
+
flatten: function(arr) {
|
|
255
|
+
var result = [];
|
|
256
|
+
for (var i = 0; i < arr.length; i++) {
|
|
257
|
+
if (Array.isArray(arr[i])) {
|
|
258
|
+
result = result.concat(this.flatten(arr[i]));
|
|
259
|
+
} else {
|
|
260
|
+
result.push(arr[i]);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return result;
|
|
264
|
+
},
|
|
265
|
+
unique: function(arr) {
|
|
266
|
+
var seen = {};
|
|
267
|
+
var result = [];
|
|
268
|
+
for (var i = 0; i < arr.length; i++) {
|
|
269
|
+
var key = JSON.stringify(arr[i]);
|
|
270
|
+
if (!seen[key]) {
|
|
271
|
+
seen[key] = true;
|
|
272
|
+
result.push(arr[i]);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return result;
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
// ── string ──
|
|
280
|
+
helpers.string = {
|
|
281
|
+
camelCase: function(s) {
|
|
282
|
+
return s.replace(/[-_\\s]+(\\w)/g, function(_, c) { return c.toUpperCase(); })
|
|
283
|
+
.replace(/^\\w/, function(c) { return c.toLowerCase(); });
|
|
284
|
+
},
|
|
285
|
+
snakeCase: function(s) {
|
|
286
|
+
return s.replace(/([A-Z])/g, '_$1').toLowerCase()
|
|
287
|
+
.replace(/[-\\s]+/g, '_')
|
|
288
|
+
.replace(/^_/, '');
|
|
289
|
+
},
|
|
290
|
+
truncate: function(s, len) {
|
|
291
|
+
if (s.length <= len) return s;
|
|
292
|
+
return s.slice(0, len - 3) + '...';
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
// Expose to global scope
|
|
297
|
+
globalThis.helpers = helpers;
|
|
298
|
+
})();
|
|
299
|
+
`,`sandbox-helpers.js`);t.error?(e.dump(t.error),t.error.dispose()):t.value.dispose()}injectBridge(e,t,n){let r=e.newObject(),i=e.newFunction(`call`,(t,r)=>{let i=e.getString(t),a=e.dump(r)??{};return n.push(`[mcp.call] ${i}(${JSON.stringify(a)})`),Q(e,{pending:!0,tool:i})}),a=e.newFunction(`listTools`,()=>Q(e,t.listAvailableTools()));e.setProp(r,`call`,i),e.setProp(r,`listTools`,a),e.setProp(e.global,`mcp`,r),i.dispose(),a.dispose(),r.dispose()}injectBridgeForOrchestration(e,t,n){let r=e.newObject(),i=e.newFunction(`call`,(r,i)=>{let a=e.getString(r),o=e.dump(i)??{};try{let r=t.enqueue(a,o);return n.push(`[mcp.call] enqueued ${a}(${JSON.stringify(o)}) → ${r}`),Q(e,{__bridgeCall:!0,callId:r})}catch(t){let r=t instanceof Error?t.message:String(t);return n.push(`[mcp.call] rejected ${a}: ${r}`),Q(e,{__bridgeCall:!1,error:r})}}),a=e.newFunction(`listTools`,()=>Q(e,t.listAvailableTools()));e.setProp(r,`call`,i),e.setProp(r,`listTools`,a),e.setProp(e.global,`mcp`,r),i.dispose(),a.dispose(),r.dispose()}},Ie=class{ctx;allowlist=null;pendingCalls=[];constructor(e){this.ctx=e}setAllowlist(e){this.allowlist=e?new Set(e):null}enqueue(e,t={}){if(!(this.ctx.selectedTools?.map(e=>e.name)??[]).includes(e))throw Error(`Tool "${e}" is not a registered MCP tool`);if(this.allowlist&&!this.allowlist.has(e))throw Error(`Tool "${e}" is not in the sandbox allowlist`);let n=re().slice(0,8);return this.pendingCalls.push({id:n,toolName:e,args:t}),n}drainPending(){let e=[...this.pendingCalls];return this.pendingCalls.length=0,e}hasPending(){return this.pendingCalls.length>0}async call(e,t={}){if(this.allowlist&&!this.allowlist.has(e))throw Error(`Tool "${e}" is not in the sandbox allowlist`);if(!this.listAvailableTools().includes(e))throw Error(`Tool "${e}" is not a registered MCP tool`);let n=await this.ctx.executeToolWithTracking(e,t);if(n.content&&Array.isArray(n.content)){let e=[];for(let t of n.content)t.type===`text`&&e.push(t.text);let t=e.join(`
|
|
300
|
+
`);try{return JSON.parse(t)}catch{return t}}return n}listAvailableTools(){let e=this.ctx.selectedTools.map(e=>e.name);return this.allowlist?e.filter(e=>this.allowlist.has(e)):e}},Le=class{store=new Map;set(e,t,n){let r=this.store.get(e);r||(r=new Map,this.store.set(e,r)),r.set(t,JSON.stringify(n))}get(e,t){let n=this.store.get(e);if(!n)return;let r=n.get(t);if(r!==void 0)try{return JSON.parse(r)}catch{return r}}getAll(e){let t=this.store.get(e);if(!t)return{};let n={};for(let[e,r]of t)try{n[e]=JSON.parse(r)}catch{n[e]=r}return n}keys(e){let t=this.store.get(e);return t?Array.from(t.keys()):[]}clear(e){this.store.delete(e)}clearAll(){this.store.clear()}};async function Re(e,t,n={},r=2){let i=null,a=t;for(let o=0;o<=r;o++){if(i=await e.execute(a,n),i.ok||i.timedOut)return{...i,retryCount:o};o<r&&(a=`/* Previous error (attempt ${o+1}): ${i.error??`unknown error`} */\n${t}`)}return{...i,retryCount:r}}var ze=class{ctx;scratchpad=new Le;constructor(e){this.ctx=e}async handleExecuteSandboxScript(e){let t=e.code,n=e.sessionId??void 0,i=e.timeoutMs??void 0,a=e.autoCorrect??!1;if(!t||typeof t!=`string`)return{content:[{type:`text`,text:JSON.stringify({ok:!1,error:`code parameter is required`})}]};let o=new Fe,s=new Ie(this.ctx);o.setBridge(s);let c={};if(i!==void 0){let e=r;c.timeoutMs=Math.min(Math.max(1,Number.isFinite(i)?i:0),e)}if(n){c.sessionId=n;let e=this.scratchpad.getAll(n);c.globals={...c.globals,__scratchpad:e}}let l;if(l=a?await Re(o,t,c):await o.execute(t,c),n&&l.ok&&l.output&&typeof l.output==`object`){let e=l.output;if(e.__scratchpad&&typeof e.__scratchpad==`object`)for(let[t,r]of Object.entries(e.__scratchpad))this.scratchpad.set(n,t,r)}return{content:[{type:`text`,text:[`**Status:** ${l.ok?`✓ Success`:`✗ Failed`}`,l.timedOut?`**Timed out:** yes`:``,`**Duration:** ${l.durationMs}ms`,l.logs.length>0?`**Console output:**\n\`\`\`\n${l.logs.join(`
|
|
301
|
+
`)}\n\`\`\``:``,l.output===void 0?``:`**Result:** ${JSON.stringify(l.output)}`,l.error?`**Error:** ${l.error}`:``].filter(Boolean).join(`
|
|
302
|
+
`)}]}}};export{me as CoreMaintenanceHandlers,Pe as ExtensionManagementHandlers,ze as SandboxToolHandlers};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{D as e,F as t,Pt as n,R as r,Zt as i}from"./constants-DMv3svps.mjs";import{t as a}from"./registry-xB8Wgmyj.mjs";import{n as o}from"./bind-helpers-D0mGAOof.mjs";import{t as s}from"./tool-builder-CpLh-UQd.mjs";const c=[s(`apk_packer_detect`,e=>e.desc("Detect Android APK packers by matching `lib/<abi>/lib*.so` filenames against user-supplied customSignatures (ReDoS-guarded regex compilation). The framework ships no built-in signature table — callers provide their own. **Does not unpack, execute, or otherwise interact with the packed payload.**").string(`apkPath`,`Absolute path to the .apk (or .aab) file to inspect`).string(`dirPath`,`Optional path to a directory containing an already-unpacked APK tree`).enum(`ruleMode`,[`append`,`prepend`,`replace`],`How customSignatures interact with the default (empty) signature table`,{default:`append`}).array(`customSignatures`,{type:`object`,properties:{name:{type:`string`,description:`Display name of the fingerprint entry`},category:{type:`string`,description:`Optional free-form category label supplied by the caller`},libPatterns:{type:`array`,items:{type:`string`},description:`lib basenames or anchored regex sources (case-insensitive; ReDoS-guarded)`},confidence:{type:`string`,enum:[`high`,`medium`,`low`],description:`Optional single-hit confidence hint (default: medium)`},notes:{type:`string`,description:`Free-form notes surfaced in list-signatures`}},required:[`name`,`libPatterns`]},`Fingerprints supplied by the caller. Compile-time and runtime ReDoS guards apply.`).query()),s(`apk_packer_list_signatures`,e=>e.desc("List the in-process signature table used by `apk_packer_detect`. Empty by default; reflects caller-managed state at request time. Optionally filter by case-insensitive category substring.").string(`category`,`Optional case-insensitive category substring filter`).query()),s(`apk_signing_block_parse`,e=>e.desc(`Read-only parser for the APK Signing Block (schemes v2/v3/v3.1/v4) plus key-rotation lineage detection and residue-block / dex-prefix / magic-offset anomaly flags. Never mutates the APK.`).string(`apkPath`,`Absolute path to the .apk file to parse`).required(`apkPath`).query())],l=[s(`binary_key_extract`,e=>e.desc(`Scan a binary for hardcoded key candidates (raw high-entropy, Base64, hex). Read-only — no decryption.`).string(`filePath`,`Absolute path to the binary file to scan`).array(`keyLengths`,{type:`integer`,minimum:1,maximum:4096},`Decoded byte lengths to accept (default: [16, 24, 32, 64])`).number(`minEntropy`,`Inclusive minimum Shannon entropy for raw windows (0..8)`,{minimum:0,maximum:8}).array(`formats`,{type:`string`,enum:[`raw`,`base64`,`hex`]},`Which candidate formats to emit (default: all three)`).boolean(`includeContext`,`Attach a hex+ASCII context window to each candidate`,{default:!0}).integer(`contextBytes`,`Context window size on each side, in bytes (0..1024)`,{minimum:0,maximum:1024,default:16}).integer(`maxResults`,"Cap on returned candidates; excess sets `truncated:true`",{minimum:1}).integer(`maxChunkBytes`,`Streaming chunk size in bytes`).object(`scanWindow`,{start:{type:`integer`,minimum:0,description:`Inclusive start byte offset`},end:{type:`integer`,minimum:1,description:`Exclusive end byte offset`}},`Restrict scanning to a byte range (skip ELF headers, focus on a section, etc.)`).required(`filePath`).query())],u=[s(`binary_instrument_capabilities`,e=>e.desc(`Report binary instrumentation backend availability.`).query()),s(`frida_attach`,e=>e.desc(`Attach Frida to a local target and open a session.`).string(`target`,`Process name, PID, or binary path to attach to`).required(`target`)),s(`frida_enumerate_modules`,e=>e.desc(`List loaded modules in an attached Frida session.`).string(`sessionId`,`Session id returned by frida_attach`).required(`sessionId`).query()),s(`ghidra_analyze`,e=>e.desc(`Analyze a binary and return metadata.`).string(`binaryPath`,`Path to the binary file`).number(`timeout`,`Optional timeout in milliseconds for headless analysis`).required(`binaryPath`)),s(`generate_hooks`,e=>e.desc(`Generate a Frida interceptor script for a list of symbols.`).array(`symbols`,{type:`string`},`Symbol names to hook`).object(`options`,{includeArgs:{type:`boolean`,description:`Emit argument logging on function entry`},includeRetAddr:{type:`boolean`,description:`Emit return-address logging on function entry`}},`Optional Frida hook generation flags`).required(`symbols`)),s(`unidbg_emulate`,e=>e.desc(`Emulate a native function with Unidbg when available.`).string(`binaryPath`,`Path to the binary file`).string(`functionName`,`Function name to emulate`).array(`args`,{type:`string`},`Optional string arguments forwarded to emulation`).required(`binaryPath`,`functionName`)),s(`frida_run_script`,e=>e.desc(`Execute a Frida JavaScript snippet inside an attached Frida session.`).string(`sessionId`,`Session id returned by frida_attach`).string(`script`,`Frida JavaScript to execute`).required(`sessionId`,`script`)),s(`frida_detach`,e=>e.desc(`Detach from a Frida session and clean up resources.`).string(`sessionId`,`Session id returned by frida_attach`).required(`sessionId`)),s(`frida_list_sessions`,e=>e.desc(`List all active Frida attach sessions with target info.`).query()),s(`frida_dex_dump`,e=>e.desc(`Run frida-dexdump as a high-level Android DEX dump helper by package/process name or PID.`).string(`target`,`Package/process name for -n, for example com.example.app.`).number(`pid`,`Optional process id for -p. Overrides target when provided.`).string(`outputDir`,`Required output directory for dumped DEX files.`).boolean(`usb`,`Use USB device mode (-U).`,{default:!0}).number(`timeoutMs`,`Optional timeout in milliseconds.`,{default:i}).required(`outputDir`)),s(`frida_generate_script`,e=>e.desc(`Generate a Frida interceptor or hook script from built-in templates.`).string(`target`,`Target binary or module name`).string(`template`,`Hook template type: trace, intercept, replace, log`).string(`functionName`,`Function name to generate hook for`).required(`target`,`template`)),s(`get_available_plugins`,e=>e.desc(`List installed binary analysis plugins.`).query()),s(`ghidra_decompile`,e=>e.desc(`Decompile a function using Ghidra.`).string(`binaryPath`,`Path to the binary file`).string(`functionName`,`Function name to decompile`).required(`binaryPath`,`functionName`)),s(`ida_decompile`,e=>e.desc(`Decompile a function using IDA Pro.`).string(`binaryPath`,`Path to the binary file`).string(`functionName`,`Function name to decompile`).required(`binaryPath`,`functionName`)),s(`jadx_decompile`,e=>e.desc(`Decompile an APK class or method with JADX CLI, auto-resolving likely class matches when possible, or use the legacy plugin bridge when available.`).string(`apkPath`,`Path to the APK file`).string(`className`,`Fully qualified class name`).string(`methodName`,`Method name to decompile`).required(`apkPath`,`className`)),s(`jadx_decompile_apk`,e=>e.desc(`High-level JADX APK decompile: decompile the whole APK to a stable output directory and return sourcesDir for jadx_search_code.`).string(`apkPath`,`Path to the APK, DEX, or CDEX file`).string(`outputDir`,`Optional output directory. Defaults to a temp directory.`).boolean(`noResources`,`Skip resources with --no-res.`,{default:!1}).boolean(`force`,`Clear outputDir before decompilation if it exists.`,{default:!1}).required(`apkPath`)),s(`apktool_decode`,e=>e.desc(`Decode an APK using apktool to inspect resources, manifest, and smali output.`).string(`apkPath`,`Path to the APK file`).string(`outputDir`,`Optional output directory for decoded contents`).boolean(`force`,`Overwrite output directory if it already exists`,{default:!1}).required(`apkPath`)),s(`apk_manifest_dump`,e=>e.desc(`Extract AndroidManifest.xml from an APK for quick inspection; return readable XML when possible, using JADX CLI as a cross-platform decode fallback for binary AXML, otherwise return base64.`).string(`apkPath`,`Path to the APK file`).required(`apkPath`)),s(`apk_manifest_query`,e=>e.desc(`Return a compact structured AndroidManifest summary: package, launcher activity, app class, SDKs, permissions, components, providers, and SDK/vendor hints.`).string(`apkPath`,`Path to the APK file`).boolean(`includeRawManifest`,`Include decoded manifest XML in the response.`,{default:!1}).required(`apkPath`).query()),s(`apk_static_triage`,t=>t.desc(`One-shot APK triage: ZIP metadata, manifest summary, native libs, asset hints, likely packers/protectors, and recommended next steps.`).string(`apkPath`,`Path to the APK file`).number(`maxEntries`,`Maximum ZIP entries to summarize.`,{default:e}).required(`apkPath`).query()),s(`dex_scan_file`,e=>e.desc(`Scan a binary/memory-dump file for DEX or CompactDex magic and optionally extract hits.`).string(`filePath`,`Path to a binary, memory dump, DEX, CDEX, VDEX, or APK-extracted blob.`).string(`outputDir`,`Optional output directory for extracted DEX/CDEX payloads.`).number(`maxHits`,`Maximum DEX/CDEX headers to report.`,{default:n}).boolean(`extract`,`Write discovered payloads to outputDir when file sizes are plausible.`,{default:!1}).required(`filePath`).query()),s(`binary_strings_extract`,e=>e.desc(`Extract printable ASCII/UTF-16LE strings from a binary file with regex filtering.`).string(`filePath`,`Path to the binary file.`).number(`minLength`,`Minimum string length.`,{default:r}).number(`maxResults`,`Maximum strings to return.`,{default:t}).string(`pattern`,`Optional JavaScript regex filter.`).required(`filePath`).query()),s(`apk_native_libs_list`,e=>e.desc(`List packaged native shared libraries (.so) inside an APK.`).string(`apkPath`,`Path to the APK file`).required(`apkPath`).query()),s(`unidbg_launch`,e=>e.desc(`Emulate a native shared library in Unidbg.`).string(`soPath`,`Path to the .so library file`).string(`arch`,`Architecture: arm or arm64`).required(`soPath`)),s(`unidbg_call`,e=>e.desc(`Call a JNI function in a running Unidbg emulator session.`).string(`sessionId`,`Session id from unidbg_launch`).string(`functionName`,`JNI function name to call`).required(`sessionId`,`functionName`)),s(`unidbg_trace`,e=>e.desc(`Get execution trace from Unidbg session with configurable detail.`).string(`sessionId`,`Session id from unidbg_launch`).required(`sessionId`)),s(`export_hook_script`,e=>e.desc(`Export generated hook templates as a complete, runnable Frida script.`).string(`hookTemplates`,`JSON array of hook template objects`)),s(`frida_enumerate_functions`,e=>e.desc(`Enumerate exported functions for a specific module in a Frida session.`).string(`sessionId`,`Session id returned by frida_attach`).string(`moduleName`,`Module name to enumerate exports from`).required(`sessionId`,`moduleName`).query()),s(`frida_find_symbols`,e=>e.desc(`Search for symbols matching a pattern in a Frida session.`).string(`sessionId`,`Session id returned by frida_attach`).string(`pattern`,`Symbol search pattern (e.g. "exports:*libssl*SSL*")`).required(`sessionId`,`pattern`).query()),s(`jadx_search_code`,e=>e.desc(`Ripgrep-backed search over jadx output. Pass decompileDir for read-only search, or apkPath to auto-decompile to a temporary directory first.`).string(`decompileDir`,`Absolute path to an existing jadx decompile output directory.`).string(`apkPath`,`Optional APK path. Used only when decompileDir is omitted.`).string(`query`,"Search query (regex unless `literal:true`)").boolean(`literal`,"Treat `query` as a literal string, not a regex",{default:!1}).boolean(`caseInsensitive`,`Case-insensitive matching`,{default:!1}).integer(`contextLines`,`Lines of context around each match`,{default:2,minimum:0,maximum:20}).integer(`maxMatchesPerFile`,`Cap on matches recorded per file`,{minimum:1}).integer(`maxResults`,`Hard ceiling on total matches across all files`,{minimum:1}).array(`globs`,{type:`string`,description:`Glob pattern (negative globs may start with !)`},"File globs applied during enumeration. Defaults to `**/*.java`, `**/*.kt`.").required(`query`).query()),...c,...l],d=`binary-instrument`,f=`binaryInstrumentHandlers`,p=o({domain:d,depKey:f,lookup:a(u),entries:[{tool:`binary_instrument_capabilities`,method:`handleBinaryInstrumentCapabilities`},{tool:`frida_attach`,method:`handleFridaAttach`},{tool:`frida_enumerate_modules`,method:`handleFridaEnumerateModules`},{tool:`ghidra_analyze`,method:`handleGhidraAnalyze`},{tool:`generate_hooks`,method:`handleGenerateHooks`},{tool:`unidbg_emulate`,method:`handleUnidbgEmulate`},{tool:`frida_run_script`,method:`handleFridaRunScript`},{tool:`frida_detach`,method:`handleFridaDetach`},{tool:`frida_list_sessions`,method:`handleFridaListSessions`},{tool:`frida_dex_dump`,method:`handleFridaDexDump`},{tool:`frida_generate_script`,method:`handleFridaGenerateScript`},{tool:`get_available_plugins`,method:`handleGetAvailablePlugins`},{tool:`ghidra_decompile`,method:`handleGhidraDecompile`},{tool:`ida_decompile`,method:`handleIdaDecompile`},{tool:`jadx_decompile`,method:`handleJadxDecompile`},{tool:`jadx_decompile_apk`,method:`handleJadxDecompileApk`},{tool:`jadx_search_code`,method:`handleJadxSearchCode`},{tool:`apktool_decode`,method:`handleApktoolDecode`},{tool:`apk_manifest_dump`,method:`handleApkManifestDump`},{tool:`apk_manifest_query`,method:`handleApkManifestQuery`},{tool:`apk_static_triage`,method:`handleApkStaticTriage`},{tool:`dex_scan_file`,method:`handleDexScanFile`},{tool:`binary_strings_extract`,method:`handleBinaryStringsExtract`},{tool:`apk_native_libs_list`,method:`handleApkNativeLibsList`},{tool:`unidbg_launch`,method:`handleUnidbgLaunch`},{tool:`unidbg_call`,method:`handleUnidbgCall`},{tool:`unidbg_trace`,method:`handleUnidbgTrace`},{tool:`export_hook_script`,method:`handleExportHookScript`},{tool:`frida_enumerate_functions`,method:`handleFridaEnumerateFunctions`},{tool:`frida_find_symbols`,method:`handleFridaFindSymbols`}]}),m=o({domain:d,depKey:`apkPackerHandlers`,lookup:a(c),entries:[{tool:`apk_packer_detect`,method:`handleApkPackerDetect`},{tool:`apk_packer_list_signatures`,method:`handleApkPackerListSignatures`},{tool:`apk_signing_block_parse`,method:`handleApkSigningBlockParse`}]}),h=o({domain:d,depKey:`binarySecretsHandlers`,lookup:a(l),entries:[{tool:`binary_key_extract`,method:`handleBinaryKeyExtract`}]}),g=[...p,...m,...h];async function _(e){let{BinaryInstrumentHandlers:t}=await import(`./handlers-6iNsXOVT.mjs`),{GhidraAnalyzer:n,HookGenerator:r}=await import(`./binary-instrument-BeZ224mZ.mjs`).then(e=>e.t),i=e.getDomainInstance(f);if(i||(i=new t(e,new n,new r),e.setDomainInstance(f,i)),!e.getDomainInstance(`apkPackerHandlers`)){let{ApkPackerHandlers:t}=await import(`./handlers-gVscChvl.mjs`);e.setDomainInstance(`apkPackerHandlers`,new t)}if(!e.getDomainInstance(`binarySecretsHandlers`)){let{BinarySecretsHandlers:t}=await import(`./handlers-CWKBBjai.mjs`);e.setDomainInstance(`binarySecretsHandlers`,new t)}return i}const v={kind:`domain-manifest`,version:1,domain:d,depKey:f,secondaryDepKeys:[`apkPackerHandlers`,`binarySecretsHandlers`],profiles:[`full`],ensure:_,registrations:g,workflowRule:{patterns:[/\b(frida|ghidra|ida|unidbg|jadx|binary|disassemb|decompil|dump\s?so)\b/i,/(binary|native|so|dll|elf|apk).*(analyze|hook|instrument|decompile)/i,/(apk|android).*(manifest|apktool|native\s+libs|shared\s+library|\.so)/i,/(apk|android).*(triage|static|packer|protector|launcher|splash)/i,/(dex|cdex|vdex|binary|memory).*(scan|string|extract|dump)/i],priority:88,tools:[`ghidra_analyze`,`jadx_decompile`,`jadx_decompile_apk`,`apktool_decode`,`apk_manifest_dump`,`apk_manifest_query`,`apk_static_triage`,`dex_scan_file`,`binary_strings_extract`,`apk_native_libs_list`,`generate_hooks`,`unidbg_launch`],hint:`Binary analysis pipeline: decompile/inspect APK, manifest, DEX files, and native libs → generate hook scripts → emulate with Unidbg when needed.`},prerequisites:{frida_attach:[{condition:`Frida CLI must be installed; device targets may also require frida-server and elevated privileges`,fix:`Install frida-tools and, for Android/device targets, launch frida-server on the target.`}],frida_run_script:[{condition:`A Frida session must be active`,fix:`Call frida_attach before running a script`}],ghidra_analyze:[{condition:`Ghidra analyzeHeadless must be installed and reachable on PATH`,fix:`Install Ghidra and ensure analyzeHeadless is on PATH.`}],ida_decompile:[{condition:`plugin_ida_bridge must be installed`,fix:`Install @jshookmcpextension/plugin-ida-bridge and provide IDA Pro license`}],jadx_decompile:[{condition:`jadx CLI or plugin_jadx_bridge must be available`,fix:`Install JADX and ensure jadx is on PATH, or install @jshookmcpextension/plugin-jadx-bridge.`}],apktool_decode:[{condition:`apktool CLI must be installed`,fix:`Install apktool and ensure it is on PATH.`}],unidbg_launch:[{condition:`Java 17+ and unidbg JAR must be reachable`,fix:`Install JDK 17+ and download unidbg from its official release`}],generate_hooks:[{condition:`Ghidra analysis output required`,fix:`Run ghidra_analyze first and pass the output to generate_hooks`}]},toolDependencies:[{from:`process`,to:`binary-instrument`,relation:`uses`,weight:.6}]};export{v as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./logger-
|
|
2
|
-
`),s=await this.bridge.sampleText({systemPrompt:`You are an expert JavaScript reverse engineer. You specialize in deobfuscation and renaming obfuscated identifiers to semantically meaningful names. Output only valid JSON.`,userMessage:o,maxTokens:256,temperature:.3,modelHint:`haiku`});return s?this.parseNameSuggestions(s,r):null}async inferFunctionPurpose(e){if(!this.bridge.isSamplingSupported())return null;let t=e.slice(0,a);return(await this.bridge.sampleText({systemPrompt:`You are a JavaScript reverse engineer. Analyze code and describe its purpose in one concise sentence.`,userMessage:`What does this function do?\n\n\`\`\`javascript\n${t}\n\`\`\`\n\nRespond with a single sentence.`,maxTokens:100,temperature:.2,modelHint:`haiku`}))?.trim()??null}parseNameSuggestions(t,n){try{let r=t.match(/\[[\s\S]*\]/);if(!r)return e.warn(`LLMDeobfuscator: no JSON array found in LLM response`),[];let i=JSON.parse(r[0]);if(!Array.isArray(i))return[];let a=new Set(n);return i.filter(e=>typeof e==`object`&&!!e&&typeof e.original==`string`&&typeof e.suggested==`string`).filter(e=>a.has(e.original)).map(e=>({original:e.original,suggested:e.suggested,confidence:[`high`,`medium`,`low`].includes(e.confidence)?e.confidence:`low`}))}catch(t){return e.warn(`LLMDeobfuscator: failed to parse LLM response:`,t),[]}}};const s=`core`,c=`coreAnalysisHandlers`,l=
|
|
1
|
+
import{t as e}from"./logger-CCikqqvj.mjs";import{t}from"./EventBus-Cm-t-B65.mjs";import{t as n}from"./ensure-browser-core-JHwDo5ql.mjs";import{t as r}from"./registry-xB8Wgmyj.mjs";import{t as i}from"./definitions-DuIPS8gq.mjs";const a=2e3;var o=class{bridge;constructor(e){this.bridge=e}isAvailable(){return this.bridge.isSamplingSupported()}async suggestVariableNames(t,n){if(!this.bridge.isSamplingSupported())return e.debug(`LLMDeobfuscator: sampling not available, skipping name suggestion`),null;let r=n.slice(0,20),i=t.slice(0,a),o=[`Given this obfuscated JavaScript code, suggest meaningful variable/function names`,`for these identifiers: ${r.join(`, `)}`,``,"```javascript",i,"```",``,`Respond ONLY with a valid JSON array of objects with fields:`,` { "original": "<old_name>", "suggested": "<new_name>", "confidence": "high"|"medium"|"low" }`,``,`Rules:`,`- Use camelCase for variables/functions, PascalCase for classes`,`- If uncertain, use confidence "low"`,`- If the name is already meaningful, keep it and mark confidence "high"`].join(`
|
|
2
|
+
`),s=await this.bridge.sampleText({systemPrompt:`You are an expert JavaScript reverse engineer. You specialize in deobfuscation and renaming obfuscated identifiers to semantically meaningful names. Output only valid JSON.`,userMessage:o,maxTokens:256,temperature:.3,modelHint:`haiku`});return s?this.parseNameSuggestions(s,r):null}async inferFunctionPurpose(e){if(!this.bridge.isSamplingSupported())return null;let t=e.slice(0,a);return(await this.bridge.sampleText({systemPrompt:`You are a JavaScript reverse engineer. Analyze code and describe its purpose in one concise sentence.`,userMessage:`What does this function do?\n\n\`\`\`javascript\n${t}\n\`\`\`\n\nRespond with a single sentence.`,maxTokens:100,temperature:.2,modelHint:`haiku`}))?.trim()??null}parseNameSuggestions(t,n){try{let r=t.match(/\[[\s\S]*\]/);if(!r)return e.warn(`LLMDeobfuscator: no JSON array found in LLM response`),[];let i=JSON.parse(r[0]);if(!Array.isArray(i))return[];let a=new Set(n);return i.filter(e=>typeof e==`object`&&!!e&&typeof e.original==`string`&&typeof e.suggested==`string`).filter(e=>a.has(e.original)).map(e=>({original:e.original,suggested:e.suggested,confidence:[`high`,`medium`,`low`].includes(e.confidence)?e.confidence:`low`}))}catch(t){return e.warn(`LLMDeobfuscator: failed to parse LLM response:`,t),[]}}};const s=`core`,c=`coreAnalysisHandlers`,l=r(i);let u=null;function d(e){return n=>{let r=n[c];return n=>{let i=n._meta,a;return i?.progressToken!==void 0&&u&&(a=t(u.eventBus,i.progressToken)),e(r,{...n,onProgress:a})}}}const f=d;async function p(e){let{Deobfuscator:t,AdvancedDeobfuscator:r,ObfuscationDetector:i,CodeAnalyzer:a,CryptoDetector:o,HookManager:s}=await import(`./modules-DO3jXCgj.mjs`).then(e=>e.t),{CoreAnalysisHandlers:c}=await import(`./analysis-C-ln0Brh.mjs`);return u=e,await n(e),(!e.deobfuscator||!e.advancedDeobfuscator||!e.obfuscationDetector||!e.analyzer||!e.cryptoDetector||!e.hookManager||!e.coreAnalysisHandlers)&&(e.deobfuscator||=new t,e.advancedDeobfuscator||=new r,e.obfuscationDetector||=new i,e.analyzer||=new a,e.cryptoDetector||=new o,e.hookManager||=new s,e.coreAnalysisHandlers||=new c({collector:e.collector,scriptManager:e.scriptManager,deobfuscator:e.deobfuscator,advancedDeobfuscator:e.advancedDeobfuscator,obfuscationDetector:e.obfuscationDetector,analyzer:e.analyzer,cryptoDetector:e.cryptoDetector,hookManager:e.hookManager})),e.coreAnalysisHandlers}const m={kind:`domain-manifest`,version:1,domain:s,depKey:c,profiles:[`workflow`,`full`],ensure:p,workflowRule:{patterns:[/(deobfuscate|deobfusc|beautify|analyze).*(javascript|js|script|code)/i,/(反混淆|美化|分析).*(javascript|js|脚本|代码)/i],priority:85,tools:[`deobfuscate`,`extract_function_tree`,`llm_suggest_names`],hint:`JavaScript analysis workflow: collect -> deobfuscate -> inspect function tree | LLM-powered naming`},prerequisites:{collect_code:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}]},registrations:[{tool:l(`collect_code`),domain:s,bind:f((e,t)=>e.handleCollectCode(t))},{tool:l(`search_in_scripts`),domain:s,profiles:[`search`,`workflow`,`full`],bind:f((e,t)=>e.handleSearchInScripts(t))},{tool:l(`extract_function_tree`),domain:s,bind:f((e,t)=>e.handleExtractFunctionTree(t))},{tool:l(`deobfuscate`),domain:s,bind:f((e,t)=>e.handleDeobfuscate(t))},{tool:l(`understand_code`),domain:s,profiles:[`search`,`workflow`,`full`],bind:f((e,t)=>e.handleUnderstandCode(t))},{tool:l(`detect_crypto`),domain:s,profiles:[`search`,`workflow`,`full`],bind:f((e,t)=>e.handleDetectCrypto(t))},{tool:l(`manage_hooks`),domain:s,bind:f((e,t)=>e.handleManageHooks(t))},{tool:l(`detect_obfuscation`),domain:s,profiles:[`search`,`workflow`,`full`],bind:f((e,t)=>e.handleDetectObfuscation(t))},{tool:l(`webcrack_unpack`),domain:s,bind:f((e,t)=>e.handleWebcrackUnpack(t))},{tool:l(`clear_collected_data`),domain:s,bind:f(e=>e.handleClearCollectedData())},{tool:l(`get_collection_stats`),domain:s,bind:f(e=>e.handleGetCollectionStats())},{tool:l(`webpack_enumerate`),domain:s,bind:f((e,t)=>e.handleWebpackEnumerate(t))},{tool:l(`llm_suggest_names`),domain:s,bind:d(async(e,t)=>{if(!u)return{content:[{type:`text`,text:JSON.stringify({success:!1,error:`Server context not initialized`})}]};let n=new o(u.samplingBridge);if(!n.isAvailable())return{content:[{type:`text`,text:JSON.stringify({success:!1,error:`Sampling not supported by this client`,hint:`The connected MCP client does not declare sampling capabilities. Try using Claude Desktop or another sampling-capable client.`})}]};let r=typeof t.code==`string`?t.code:``,i=Array.isArray(t.identifiers)?t.identifiers.filter(e=>typeof e==`string`):[],a=await n.suggestVariableNames(r,i);return{content:[{type:`text`,text:JSON.stringify({success:!0,suggestions:a??[],samplingUsed:!0})}]}})},{tool:l(`js_deobfuscate_jsvmp`),domain:s,bind:f((e,t)=>e.handleJsDeobfuscateJsvmp(t))},{tool:l(`js_deobfuscate_pipeline`),domain:s,bind:f((e,t)=>e.handleJsDeobfuscatePipeline(t))},{tool:l(`js_analyze_vm`),domain:s,bind:f((e,t)=>e.handleJsAnalyzeVm(t))},{tool:l(`js_solve_constraints`),domain:s,bind:f((e,t)=>e.handleJsSolveConstraints(t))},{tool:l(`analysis_ast_match`),domain:s,bind:f((e,t)=>e.handleAnalysisAstMatch(t))},{tool:l(`analysis_deflat_control_flow`),domain:s,bind:f((e,t)=>e.handleAnalysisDeflatControlFlow(t))},{tool:l(`analysis_decode_string_array`),domain:s,bind:f((e,t)=>e.handleAnalysisDecodeStringArray(t))},{tool:l(`js_symbolic_execute`),domain:s,bind:f((e,t)=>e.handleJsSymbolicExecute(t))},{tool:l(`js_symbolic_execute_jsvmp`),domain:s,bind:f((e,t)=>e.handleJsSymbolicExecuteJsvmp(t))}]};export{m as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./registry-
|
|
1
|
+
import{t as e}from"./registry-xB8Wgmyj.mjs";import{n as t}from"./bind-helpers-D0mGAOof.mjs";import{t as n}from"./definitions-DbN2CjI2.mjs";const r=`proxy`,i=`proxyHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`proxy_start`,method:`handleProxyStart`},{tool:`proxy_stop`,method:`handleProxyStop`},{tool:`proxy_status`,method:`handleProxyStatus`},{tool:`proxy_export_ca`,method:`handleProxyExportCa`},{tool:`proxy_add_rule`,method:`handleProxyAddRule`},{tool:`proxy_get_requests`,method:`handleProxyGetRequests`},{tool:`proxy_clear_logs`,method:`handleProxyClearLogs`},{tool:`proxy_setup_adb_device`,method:`handleProxySetupAdbDevice`}]});async function o(e){let{ProxyHandlers:t}=await import(`./proxy-DPNgM7TE.mjs`);return e.proxyHandlers||=new t,e.proxyHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`full`],ensure:o,registrations:a};export{s as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./registry-xB8Wgmyj.mjs";import{n as t}from"./bind-helpers-D0mGAOof.mjs";import{t as n}from"./definitions-Cv5r8xwq.mjs";const r=`transform`,i=`transformHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`ast_transform_preview`,method:`handleAstTransformPreview`},{tool:`ast_transform_chain`,method:`handleAstTransformChain`},{tool:`ast_transform_apply`,method:`handleAstTransformApply`},{tool:`crypto_extract_standalone`,method:`handleCryptoExtractStandalone`},{tool:`crypto_test_harness`,method:`handleCryptoTestHarness`},{tool:`crypto_compare`,method:`handleCryptoCompare`}]});async function o(e){let{CodeCollector:t}=await import(`./collector-CB2syQEg.mjs`),{TransformToolHandlers:n}=await import(`./transform-D-peM3aO.mjs`);return e.collector||(e.collector=new t(e.config.puppeteer),e.registerCaches()),e.transformHandlers||=new n(e.collector),e.transformHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`full`],ensure:o,registrations:a};export{s as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./response-B1RuVVfD.mjs";import{t}from"./ensure-browser-core-JHwDo5ql.mjs";import{t as n}from"./registry-xB8Wgmyj.mjs";import{n as r}from"./bind-helpers-D0mGAOof.mjs";import{n as i,t as a}from"./definitions-B3a9QC2t.mjs";const o=`canvas`,s=`canvasHandlers`,c=n([...i,...a]),l=r({domain:o,depKey:s,lookup:c,entries:[{tool:`canvas_engine_fingerprint`,method:`handleFingerprint`,profiles:[`full`]},{tool:`canvas_scene_dump`,method:`handleSceneDump`,profiles:[`full`]},{tool:`canvas_pick_object_at_point`,method:`handlePick`,profiles:[`full`]},{tool:`canvas_trace_click_handler`,method:`handleTraceClick`,profiles:[`full`]}]}),u=r({domain:o,depKey:`skiaCaptureHandlers`,lookup:c,wrapResult:e,entries:[{tool:`skia_detect_renderer`,method:`handleSkiaDetectRenderer`},{tool:`skia_extract_scene`,method:`handleSkiaExtractScene`},{tool:`skia_correlate_objects`,method:`handleSkiaCorrelateObjects`}]});async function d(e){let{DebuggerManager:n}=await import(`./modules-DO3jXCgj.mjs`).then(e=>e.t),{TraceRecorder:r}=await import(`./TraceRecorder-B5ktv3nP.mjs`),{ReverseEvidenceGraph:i}=await import(`./ReverseEvidenceGraph-BksOpsPs.mjs`).then(e=>e.t),{CanvasToolHandlers:a,SkiaCaptureHandlers:o}=await import(`./canvas-396ieNv5.mjs`);await t(e),e.debuggerManager||=new n(e.collector),e.traceRecorder||=new r;let s=e.getDomainInstance(`evidenceGraph`);return s||(s=new i,e.setDomainInstance(`evidenceGraph`,s)),e.canvasHandlers||=new a({pageController:e.pageController,debuggerManager:e.debuggerManager,traceRecorder:e.traceRecorder,evidenceStore:s}),e.skiaCaptureHandlers||=new o({pageController:e.pageController??null,eventBus:e.eventBus}),e.canvasHandlers}const f={kind:`domain-manifest`,version:1,domain:o,depKey:s,secondaryDepKeys:[`skiaCaptureHandlers`],profiles:[`workflow`,`full`],ensure:d,workflowRule:{patterns:[/(canvas|scene|engine|game).*(pick|dump|trace|reverse)/i,/(canvas|webgl|webgpu|scene).*(graph|tree|node)/i,/(laya|pixi|phaser|cocos|unity).*(reverse|scene|dump|hook)/i,/\b(skia|gpu|render(er)?|scene\s?(tree|graph)|draw\s?call|raster|paint|layer)\b/i,/skia.*(render|detect|scene)/i,/gpu.*backend/i],priority:80,tools:[`canvas_engine_fingerprint`,`canvas_scene_dump`,`canvas_pick_object_at_point`,`canvas_trace_click_handler`,`skia_detect_renderer`,`skia_extract_scene`,`skia_correlate_objects`],hint:`Canvas/Skia reverse: fingerprint engine → dump scene tree → pick object at point → trace click; or detect Skia GPU backend → extract scene → correlate with JS objects.`},prerequisites:{canvas_engine_fingerprint:[{condition:`Browser must be running`,fix:`Call browser_launch or browser_attach first`}],canvas_scene_dump:[{condition:`Browser must be running`,fix:`Call browser_launch or browser_attach first`}],canvas_pick_object_at_point:[{condition:`Browser must be running`,fix:`Call browser_launch or browser_attach first`}],canvas_trace_click_handler:[{condition:`Debugger must be enabled`,fix:`Call debugger_lifecycle({ action: 'enable' }) first`}],skia_detect_renderer:[{condition:`Browser must be running with CDP attached`,fix:`Call browser_launch or browser_attach first`}],skia_extract_scene:[{condition:`Browser must be running with CDP attached`,fix:`Call browser_launch or browser_attach first`}],skia_correlate_objects:[{condition:`V8 heap snapshot should be available for robust matching`,fix:`Run v8_heap_snapshot_capture before correlation`}]},toolDependencies:[{from:`skia_correlate_objects`,to:`v8_heap_snapshot_capture`,relation:`precedes`,weight:.6}],registrations:[...l,...u]};export{f as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./registry-
|
|
1
|
+
import{t as e}from"./registry-xB8Wgmyj.mjs";import{n as t}from"./bind-helpers-D0mGAOof.mjs";import{t as n}from"./tool-builder-CpLh-UQd.mjs";const r=[n(`mojo_ipc_capabilities`,e=>e.desc(`Report Mojo IPC monitoring availability.`).query()),n(`mojo_monitor`,e=>e.desc(`Start or stop Mojo IPC monitoring for the active Chromium-based target.`).enum(`action`,[`start`,`stop`],`Monitor action`).string(`deviceId`,`Optional device or transport identifier (action=start)`).required(`action`)),n(`mojo_decode_message`,e=>e.desc(`Decode a Mojo IPC hex payload into a structured field map.`).string(`hexPayload`,`Hex-encoded Mojo IPC payload`).required(`hexPayload`).query()),n(`mojo_list_interfaces`,e=>e.desc(`List discovered Mojo IPC interfaces and their pending message counts.`).query()),n(`mojo_messages_get`,e=>e.desc(`Retrieve captured Mojo IPC messages from the active monitoring session.`).number(`limit`,`Maximum number of messages to retrieve (default 100)`).string(`interface`,`Filter messages by interface name`).query())],i=`mojo-ipc`,a=`mojoIpcHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`mojo_ipc_capabilities`,method:`handleMojoIpcCapabilities`},{tool:`mojo_monitor`,method:`handleMojoMonitorDispatch`},{tool:`mojo_decode_message`,method:`handleMojoDecodeMessage`},{tool:`mojo_list_interfaces`,method:`handleMojoListInterfaces`},{tool:`mojo_messages_get`,method:`handleMojoMessagesGet`}]});async function s(e){let{MojoIPCHandlers:t}=await import(`./mojo-ipc-Be-ccWrc.mjs`),n=e.getDomainInstance(a);if(n)return n;let r=new t(void 0,void 0,e.eventBus);return e.setDomainInstance(a,r),r}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`full`],registrations:o,ensure:s,workflowRule:{patterns:[/\b(mojo|ipc|chromium\s?(ipc|message)|interface\s?(broker|registry))\b/i,/(mojo|ipc|chromium).*(monitor|capture|hook|trace)/i],priority:75,tools:[`mojo_monitor`,`mojo_decode_message`,`mojo_list_interfaces`],hint:`Mojo IPC: start monitor → capture messages → decode payloads → correlate with CDP`},prerequisites:{mojo_monitor:[{condition:`Frida must be available for real process attachment`,fix:`Install Frida and ensure the Chromium target process is launched first`}],mojo_decode_message:[{condition:`Captured message payload hex is required`,fix:`Start a monitoring session via mojo_monitor and capture traffic first`}]},toolDependencies:[{from:`browser`,to:`mojo-ipc`,relation:`uses`,weight:.8}]};export{c as default,r as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./registry-
|
|
1
|
+
import{t as e}from"./registry-xB8Wgmyj.mjs";import{n as t}from"./bind-helpers-D0mGAOof.mjs";import{t as n}from"./tool-builder-CpLh-UQd.mjs";const r=[n(`cross_domain_capabilities`,e=>e.desc(`List all cross-domain capability categories and available workflows.`).query()),n(`cross_domain_suggest_workflow`,e=>e.desc(`Recommend a multi-domain workflow to achieve a specific analysis goal.`).string(`goal`,`High-level task goal or problem statement to classify`).boolean(`preferAvailableOnly`,`Prefer workflows whose dependent domains are currently enabled`,{default:!0}).required(`goal`).query()),n(`cross_domain_health`,e=>e.desc(`Report health status of cross-domain bridges and correlators.`).query()),n(`cross_domain_correlate_all`,e=>e.desc(`Run the built-in skia, mojo, syscall, and binary correlators and merge the results into the shared evidence graph.`).prop(`sceneTree`,{type:`object`,description:`Skia scene tree with layers and drawCommands`,additionalProperties:!0}).array(`jsObjects`,{type:`object`,additionalProperties:!0},`JS object descriptors for Skia correlation`).array(`mojoMessages`,{type:`object`,properties:{interface:{type:`string`},method:{type:`string`},timestamp:{type:`number`},messageId:{type:`string`}},required:[`interface`,`method`,`timestamp`,`messageId`]},`Mojo messages for MOJO-03 correlation`).array(`cdpEvents`,{type:`object`,properties:{eventType:{type:`string`},timestamp:{type:`number`},url:{type:`string`}},required:[`eventType`,`timestamp`]},`CDP events for MOJO-03 correlation`).array(`networkRequests`,{type:`object`,properties:{requestId:{type:`string`},url:{type:`string`},timestamp:{type:`number`}},required:[`requestId`,`url`,`timestamp`]},`Network requests for MOJO-03 correlation`).array(`syscallEvents`,{type:`object`,properties:{pid:{type:`number`},tid:{type:`number`},syscallName:{type:`string`},timestamp:{type:`number`}},required:[`pid`,`tid`,`syscallName`,`timestamp`]},`Syscall events for SYSCALL-02 correlation`).array(`jsStacks`,{type:`object`,properties:{threadId:{type:`number`},timestamp:{type:`number`},frames:{type:`array`,items:{type:`object`,properties:{functionName:{type:`string`}},required:[`functionName`]}}},required:[`threadId`,`timestamp`,`frames`]},`JS stacks for SYSCALL-02 correlation`).prop(`ghidraOutput`,{type:`object`,description:`Binary analysis output with moduleName and functions`,additionalProperties:!0})),n(`cross_domain_evidence_export`,e=>e.desc(`Export the shared cross-domain evidence graph as JSON.`).query()),n(`cross_domain_evidence_stats`,e=>e.desc(`Get node and edge statistics for the shared cross-domain evidence graph.`).query())],i=`cross-domain`,a=`crossDomainHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`cross_domain_capabilities`,method:`handleCapabilities`},{tool:`cross_domain_suggest_workflow`,method:`handleSuggestWorkflow`},{tool:`cross_domain_health`,method:`handleHealth`},{tool:`cross_domain_correlate_all`,method:`handleCorrelateAll`},{tool:`cross_domain_evidence_export`,method:`handleEvidenceExport`},{tool:`cross_domain_evidence_stats`,method:`handleEvidenceStats`}]});async function s(e){let{ReverseEvidenceGraph:t}=await import(`./ReverseEvidenceGraph-BksOpsPs.mjs`).then(e=>e.t),{CrossDomainEvidenceBridge:n}=await import(`./evidence-graph-bridge-eT9icP6a.mjs`),{CrossDomainWorkflowClassifier:r,CrossDomainHandlers:i}=await import(`./handlers-CIKOP4aI.mjs`),o=e.getDomainInstance(a);if(o)return o;let s=e.getDomainInstance(`evidenceGraph`);s||(s=new t,s.setEventBus(e.eventBus),e.setDomainInstance(`evidenceGraph`,s));let c=e.getDomainInstance(`crossDomainEvidenceBridge`);c||(c=new n(s),e.setDomainInstance(`crossDomainEvidenceBridge`,c));let l=e.getDomainInstance(`crossDomainWorkflowClassifier`);l||(l=new r(e,!0),e.setDomainInstance(`crossDomainWorkflowClassifier`,l));let u=new i(c,l);return e.setDomainInstance(a,u),u}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`full`],ensure:s,workflowRule:{patterns:[/(cross[- ]domain|multi[- ]domain|evidence graph|correlate).*(v8|network|canvas|syscall|mojo|binary)/i,/(跨域|多域|证据图|关联).*(v8|网络|canvas|syscall|mojo|binary)/i],priority:98,tools:[`cross_domain_capabilities`,`cross_domain_suggest_workflow`,`cross_domain_correlate_all`,`cross_domain_evidence_stats`],hint:`Cross-domain reverse workflow: inspect capabilities → suggest mission workflow → correlate evidencefrom all v5.0 domains → export evidence graph`},toolDependencies:[{from:`cross_domain_suggest_workflow`,to:`deobfuscate`,relation:`suggests`,weight:.6},{from:`cross_domain_suggest_workflow`,to:`js_heap_search`,relation:`suggests`,weight:.6},{from:`cross_domain_suggest_workflow`,to:`network_enable`,relation:`suggests`,weight:.5},{from:`cross_domain_suggest_workflow`,to:`canvas_scene_dump`,relation:`suggests`,weight:.5},{from:`cross_domain_suggest_workflow`,to:`skia_correlate_objects`,relation:`suggests`,weight:.5},{from:`cross_domain_suggest_workflow`,to:`syscall_correlate_js`,relation:`suggests`,weight:.5},{from:`cross_domain_suggest_workflow`,to:`ghidra_analyze`,relation:`suggests`,weight:.5},{from:`cross_domain_correlate_all`,to:`evidence_export`,relation:`precedes`,weight:.7}],registrations:o};export{c as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./ensure-browser-core-JHwDo5ql.mjs";import{t}from"./registry-xB8Wgmyj.mjs";import{n}from"./bind-helpers-D0mGAOof.mjs";import{t as r}from"./definitions-aeRd5DAR.mjs";import{t as i}from"./definitions-Fetw_Cge.mjs";const a=`debugger`,o=`debuggerHandlers`,s=[`antidebugHandlers`],c=t(i),l=t(r),u=[...n({domain:a,depKey:o,lookup:c,entries:[{tool:`debugger_lifecycle`,method:`handleDebuggerLifecycle`},{tool:`debugger_pause`,method:`handleDebuggerPause`},{tool:`debugger_resume`,method:`handleDebuggerResume`},{tool:`debugger_step`,method:`handleDebuggerStep`},{tool:`breakpoint`,method:`handleBreakpoint`},{tool:`get_call_stack`,method:`handleGetCallStack`},{tool:`debugger_evaluate`,method:`handleDebuggerEvaluateDispatch`},{tool:`debugger_wait_for_paused`,method:`handleDebuggerWaitForPaused`},{tool:`debugger_get_paused_state`,method:`handleDebuggerGetPausedState`},{tool:`get_object_properties`,method:`handleGetObjectProperties`},{tool:`get_scope_variables_enhanced`,method:`handleGetScopeVariablesEnhanced`},{tool:`debugger_session`,method:`handleDebuggerSession`},{tool:`watch`,method:`handleWatch`},{tool:`blackbox_add`,method:`handleBlackboxAdd`},{tool:`blackbox_add_common`,method:`handleBlackboxAddCommon`},{tool:`blackbox_list`,method:`handleBlackboxList`}]}),...n({domain:a,depKey:`antidebugHandlers`,lookup:l,entries:[{tool:`antidebug_bypass`,method:`handleAntidebugBypass`,profiles:[`full`]},{tool:`antidebug_detect_protections`,method:`handleAntiDebugDetectProtections`,profiles:[`full`]}]})];async function d(t){let{DebuggerManager:n,RuntimeInspector:r}=await import(`./modules-DO3jXCgj.mjs`).then(e=>e.t),{DebuggerToolHandlers:i}=await import(`./debugger-CLzkObIO.mjs`);if(await e(t),(!t.debuggerManager||!t.runtimeInspector||!t.debuggerHandlers)&&(t.debuggerManager||=new n(t.collector),t.runtimeInspector||=new r(t.collector,t.debuggerManager),t.debuggerHandlers||=new i(t.debuggerManager,t.runtimeInspector,t.eventBus)),!t.antidebugHandlers){let{AntiDebugToolHandlers:e}=await import(`./antidebug-CsnpOR9z.mjs`);t.antidebugHandlers=new e(t.collector)}return t.debuggerHandlers}const f={kind:`domain-manifest`,version:1,domain:a,depKey:o,secondaryDepKeys:s,profiles:[`workflow`,`full`],ensure:d,prerequisites:{debugger_lifecycle:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],breakpoint:[{condition:`Browser must be launched`,fix:`Call browser_launch and debugger_lifecycle(enable) first`}]},registrations:u};export{f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./ensure-browser-core-JHwDo5ql.mjs";import{t}from"./registry-xB8Wgmyj.mjs";import{n}from"./bind-helpers-D0mGAOof.mjs";import{t as r}from"./definitions-DywfwPMb.mjs";const i=`streaming`,a=`streamingHandlers`,o=n({domain:i,depKey:a,lookup:t(r),entries:[{tool:`ws_monitor`,method:`handleWsMonitorDispatch`},{tool:`ws_get_frames`,method:`handleWsGetFrames`},{tool:`ws_get_connections`,method:`handleWsGetConnections`},{tool:`sse_monitor_enable`,method:`handleSseMonitorEnable`},{tool:`sse_get_events`,method:`handleSseGetEvents`}]});async function s(t){let{StreamingToolHandlers:n}=await import(`./streaming-Dbk4eStJ.mjs`);return await e(t),t.streamingHandlers||=new n(t.collector),t.streamingHandlers}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`workflow`,`full`],ensure:s,registrations:o};export{c as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./registry-
|
|
1
|
+
import{t as e}from"./registry-xB8Wgmyj.mjs";import{n as t}from"./bind-helpers-D0mGAOof.mjs";import{t as n}from"./definitions-D_dTDX9B.mjs";const r=`graphql`,i=`graphqlHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`call_graph_analyze`,method:`handleCallGraphAnalyze`},{tool:`script_replace_persist`,method:`handleScriptReplacePersist`},{tool:`graphql_introspect`,method:`handleGraphqlIntrospect`},{tool:`graphql_extract_queries`,method:`handleGraphqlExtractQueries`},{tool:`graphql_replay`,method:`handleGraphqlReplay`},{tool:`graphql_enum_schema`,method:`handleGraphqlEnumSchema`}]});async function o(e){let{CodeCollector:t,ConsoleMonitor:n}=await import(`./collector-CB2syQEg.mjs`),{GraphQLToolHandlers:r}=await import(`./graphql-GBWsZ9xC.mjs`);return e.collector||(e.collector=new t(e.config.puppeteer),e.registerCaches()),e.consoleMonitor||=new n(e.collector),e.graphqlHandlers||=new r({collector:e.collector,consoleMonitor:e.consoleMonitor}),e.graphqlHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`workflow`,`full`],ensure:o,registrations:a};export{s as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./registry-xB8Wgmyj.mjs";import{n as t}from"./bind-helpers-D0mGAOof.mjs";import{t as n}from"./tool-builder-CpLh-UQd.mjs";const r=[n(`nemu_capabilities`,e=>e.desc(`Report native-emulator backend availability and supported features (self-built ARM64 interpreter, no external dependencies). Emulates the integer AArch64 ISA + SIMD/FP load-store + AES/SHA/PMULL crypto-extension (bit-exact vs FIPS-197/180-4/180-1) + scalar IEEE-754 floating-point + NEON integer-lane SIMD (three-same arithmetic/logical/compare/min-max, misc, DUP, MOVI, shift-by-immediate, across-lanes, permute, EXT, TBL) + ELF relocations + DT_INIT_ARRAY constructor execution + auto-wired bionic libc + JNI; long/widening and saturating NEON variants are not yet supported (declared in the response).`).query()),n(`nemu_create_session`,e=>e.desc(`Create an isolated ARM64 emulator session and return its sessionId. Each session owns its own CPU registers, guest stack, and JNI object table, so concurrent analyses never interfere. Destroy it with nemu_destroy_session when done; idle sessions auto-expire.`).boolean(`installSyscalls`,`Install the default Android syscall table (default: true)`,{default:!0})),n(`nemu_destroy_session`,e=>e.desc(`Destroy an emulator session and free its memory (mapped library, stack, JNI tables).`).string(`sessionId`,`Session id returned by nemu_create_session`).required(`sessionId`).resettable()),n(`nemu_list_sessions`,e=>e.desc(`List active emulator sessions with their creation and last-use timestamps.`).query()),n(`nemu_load_library`,e=>e.desc(`Load an AArch64 ELF shared object (.so) from a filesystem path into a session, mapping its segments and resolving exported symbols. Prerequisite for list_symbols / call_symbol / call_jni_export.`).string(`sessionId`,`Session id returned by nemu_create_session`).string(`soPath`,`Filesystem path to the .so library`).required(`sessionId`,`soPath`)),n(`nemu_extract_apk_libs`,e=>e.desc(`List the loadable arm64-v8a native libraries (.so) packaged inside an APK, with their byte sizes. Use nemu_load_apk_library to load one. Note: libapp.so (Flutter Dart AOT) is listed but is not executable here — route it to the Dart layer.`).string(`apkPath`,`Filesystem path to the APK file`).required(`apkPath`).query()),n(`nemu_load_apk_library`,e=>e.desc(`Extract a specific arm64-v8a .so from an APK by name and load it into a session in one step (no temp files). Pair with nemu_extract_apk_libs to discover library names.`).string(`sessionId`,`Session id returned by nemu_create_session`).string(`apkPath`,`Filesystem path to the APK file`).string(`libName`,`Library basename to load, e.g. "libnative-lib.so"`).required(`sessionId`,`apkPath`,`libName`)),n(`nemu_list_symbols`,e=>e.desc(`List the exported function symbols of the loaded library — the names callable via call_symbol / call_jni_export.`).string(`sessionId`,`Session id with a library already loaded`).required(`sessionId`).query()),n(`nemu_call_symbol`,e=>e.desc("Invoke an exported function by name following AArch64 AAPCS (integer args in x0..x7, result in x0). For plain native exports; use call_jni_export for `Java_*` JNI entry points.").string(`sessionId`,`Session id with a library already loaded`).string(`symbol`,`Exported symbol name to call`).array(`args`,{type:`number`},`Integer arguments passed in x0..x7 (default: none)`).required(`sessionId`,`symbol`)),n(`nemu_call_jni_export`,e=>e.desc("Invoke an exported `Java_*` JNI function. Injects the guest `JNIEnv*` and thiz, then the Java arguments. Returns x0 — an int/jboolean directly, or a jobject/jbyteArray/jstring handle to resolve via read_byte_array. The main entry point for reversing a native signing/crypto routine.").string(`sessionId`,`Session id with a library already loaded`).string(`symbol`,"Exported `Java_*` JNI function name").array(`javaArgs`,{type:`number`},`Java arguments (ints or jobject handles) after thiz`).number(`thiz`,`Receiver handle (jobject/jclass); 0 for static/none`,{default:0}).required(`sessionId`,`symbol`)),n(`nemu_setup_java_mock`,e=>e.desc("Register a mock Java method the emulated native code can call back into via JNI (GetMethodID/GetStaticMethodID + `Call*Method`). Declaratively specify the return value with returnInt, returnString, or returnBytes (base64) — emulating the 'Java world' a native routine reads from before computing its result. No code is executed; only the configured constant is returned.").string(`sessionId`,`Session id for the mock registration`).string(`className`,`Java class name, e.g. "com/app/Config"`).string(`methodName`,`Method name the native code looks up`).string(`signature`,`JNI method signature, e.g. "()I" or "(I)[B"`).number(`returnInt`,`Constant int/jboolean to return (mutually exclusive)`).string(`returnString`,`Constant string to return as a jstring handle (mutually exclusive)`).string(`returnBytes`,`Constant base64 bytes to return as a jbyteArray handle (exclusive)`).required(`sessionId`,`className`,`methodName`,`signature`)),n(`nemu_setup_java_field`,e=>e.desc(`Register a mock Java field the emulated native code reads back via JNI (GetFieldID/GetStaticFieldID + Get<Type>Field). Declaratively specify the value with valueInt, valueString, or valueBytes (base64) — the 'Java world' constant a native routine folds into its result. No code is executed.`).string(`sessionId`,`Session id for the mock registration`).string(`className`,`Java class name, e.g. "com/app/Config"`).string(`fieldName`,`Field name the native code looks up`).string(`signature`,`JNI field signature, e.g. "I", "J", or "Ljava/lang/String;"`).number(`valueInt`,`Constant int/long/boolean value (mutually exclusive)`).string(`valueString`,`Constant string returned as a jstring handle (mutually exclusive)`).string(`valueBytes`,`Constant base64 bytes returned as a jbyteArray handle (exclusive)`).required(`sessionId`,`className`,`fieldName`,`signature`)),n(`nemu_new_byte_array`,e=>e.desc(`Wrap base64 bytes as a JNI jbyteArray handle to pass as an argument into call_jni_export (e.g. the plaintext a signing routine consumes). Returns the handle.`).string(`sessionId`,`Session id to allocate the handle in`).string(`dataBase64`,`Byte payload as a base64 string`).required(`sessionId`,`dataBase64`)),n(`nemu_read_byte_array`,e=>e.desc(`Resolve a jbyteArray handle (e.g. a native call's return value) back to its bytes, returned as base64 plus length.`).string(`sessionId`,`Session id owning the handle`).number(`handle`,`jbyteArray handle returned by a native call or new_byte_array`).required(`sessionId`,`handle`).query()),n(`nemu_trace`,e=>e.desc(`Invoke an exported symbol while recording every instruction executed (pc, opcode, step), optionally snapshotting named registers per step. Bounded by maxSteps. Use to follow the control flow / algorithm of an obfuscated native function.`).string(`sessionId`,`Session id with a library already loaded`).string(`symbol`,`Exported symbol name to execute under trace`).array(`args`,{type:`number`},`Integer arguments passed in x0..x7 (default: none)`).array(`captureRegisters`,{type:`string`},`Register names to snapshot each step, e.g. ["x0","x1","sp"] (default: none)`).number(`maxSteps`,`Maximum trace events to return (default: 1000)`,{default:1e3}).required(`sessionId`,`symbol`)),n(`nemu_disassemble`,e=>e.desc(`Disassemble a single instruction without creating an emulator session. Supports arm64/aarch64, x86, x64, riscv32/riscv64, mips/mips32, and mipsel. This is a local lightweight decoder for trace readability, including common SSE/AVX/AVX2/AVX-512 EVEX, RISC-V, and MIPS instructions.`).enum(`architecture`,[`arm64`,`aarch64`,`x86`,`x64`,`riscv32`,`riscv64`,`mips`,`mips32`,`mipsel`],`Instruction architecture / ISA mode`,{default:`arm64`}).prop(`opcode`,{anyOf:[{type:`string`},{type:`number`}],description:`Instruction opcode as a number, a 0x-prefixed hex string, or hex bytes separated by spaces (e.g. "62 f1 74 48 58 c2").`}).string(`pc`,`Program counter used for relative target formatting, as decimal or 0x hex`,{default:`0x0`}).required(`architecture`,`opcode`).query())],i=`native-emulator`,a=`nativeEmulatorHandlers`,o=t({domain:i,depKey:a,lookup:e(r),entries:[{tool:`nemu_capabilities`,method:`handleCapabilities`},{tool:`nemu_create_session`,method:`handleCreateSession`},{tool:`nemu_destroy_session`,method:`handleDestroySession`},{tool:`nemu_list_sessions`,method:`handleListSessions`},{tool:`nemu_load_library`,method:`handleLoadLibrary`},{tool:`nemu_extract_apk_libs`,method:`handleExtractApkLibs`},{tool:`nemu_load_apk_library`,method:`handleLoadApkLibrary`},{tool:`nemu_list_symbols`,method:`handleListSymbols`},{tool:`nemu_call_symbol`,method:`handleCallSymbol`},{tool:`nemu_call_jni_export`,method:`handleCallJniExport`},{tool:`nemu_setup_java_mock`,method:`handleSetupJavaMock`},{tool:`nemu_setup_java_field`,method:`handleSetupJavaField`},{tool:`nemu_new_byte_array`,method:`handleNewByteArray`},{tool:`nemu_read_byte_array`,method:`handleReadByteArray`},{tool:`nemu_trace`,method:`handleTrace`},{tool:`nemu_disassemble`,method:`handleDisassemble`}]});async function s(e){let{NativeEmulatorHandlers:t}=await import(`./handlers-CrJsKnEI.mjs`),n=e.getDomainInstance(a);return n||(n=new t,e.setDomainInstance(a,n)),n}const c={kind:`domain-manifest`,version:1,domain:i,depKey:a,profiles:[`full`],ensure:s,registrations:o,workflowRule:{patterns:[/\b(emulate|emulator|nemu)\b.*(so|native|jni|arm64|aarch64)/i,/(android|flutter|apk).*(native|jni|\.so|sign|crypt|decrypt|encrypt)/i,/\b(jni|java_[a-z])\b.*(emulate|reverse|recover|call)/i,/(in-process|self-?built|no-?device).*(emulat|arm64|native)/i,/(recover|reverse).*(native|jni|signing|crypto).*(algorithm|function|\.so)/i],priority:86,tools:[`nemu_capabilities`,`nemu_create_session`,`nemu_extract_apk_libs`,`nemu_load_library`,`nemu_list_symbols`,`nemu_setup_java_mock`,`nemu_call_jni_export`,`nemu_trace`,`nemu_disassemble`],hint:`In-process ARM64 emulation: create a session → load a .so (or extract one from an APK) → register mock Java methods → call exported / Java_* JNI functions → optionally trace instructions. Destroy the session when done.`},prerequisites:{nemu_load_library:[{condition:`An emulator session must exist`,fix:`Call nemu_create_session first and reuse the returned sessionId.`}],nemu_call_symbol:[{condition:`A library must be loaded into the session`,fix:`Call nemu_load_library (or nemu_load_apk_library) before calling a symbol.`}],nemu_call_jni_export:[{condition:`A library must be loaded into the session`,fix:`Call nemu_load_library (or nemu_load_apk_library) first; register any Java callbacks with nemu_setup_java_mock.`}],nemu_list_symbols:[{condition:`A library must be loaded into the session`,fix:`Call nemu_load_library before listing symbols.`}],nemu_trace:[{condition:`A library must be loaded into the session`,fix:`Call nemu_load_library before tracing a symbol.`}]},toolDependencies:[{from:`nemu_extract_apk_libs`,to:`nemu_load_apk_library`,relation:`precedes`,weight:.7},{from:`nemu_load_library`,to:`nemu_call_jni_export`,relation:`precedes`,weight:.6},{from:`nemu_setup_java_mock`,to:`nemu_call_jni_export`,relation:`suggests`,weight:.5}]};export{c as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./registry-
|
|
1
|
+
import{t as e}from"./registry-xB8Wgmyj.mjs";import{n as t}from"./bind-helpers-D0mGAOof.mjs";import{t as n}from"./definitions-Ym8niHDb.mjs";const r=`platform`,i=`platformHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`platform_capabilities`,method:`handlePlatformCapabilities`},{tool:`miniapp_pkg_scan`,method:`handleMiniappPkgScan`},{tool:`miniapp_pkg_unpack`,method:`handleMiniappPkgUnpack`},{tool:`miniapp_pkg_analyze`,method:`handleMiniappPkgAnalyze`},{tool:`asar_extract`,method:`handleAsarExtract`},{tool:`electron_inspect_app`,method:`handleElectronInspectApp`},{tool:`electron_scan_userdata`,method:`handleElectronScanUserdata`},{tool:`asar_search`,method:`handleAsarSearch`},{tool:`electron_check_fuses`,method:`handleElectronCheckFuses`},{tool:`electron_patch_fuses`,method:`handleElectronPatchFuses`},{tool:`v8_bytecode_decompile`,method:`handleV8BytecodeDecompile`},{tool:`electron_launch_debug`,method:`handleElectronLaunchDebug`},{tool:`electron_debug_status`,method:`handleElectronDebugStatus`},{tool:`electron_ipc_sniff`,method:`handleElectronIPCSniff`}]});async function o(e){let{CodeCollector:t}=await import(`./collector-CB2syQEg.mjs`),{PlatformToolHandlers:n}=await import(`./platform-DjWbuiF8.mjs`);return e.collector||(e.collector=new t(e.config.puppeteer),e.registerCaches()),e.platformHandlers||=new n(e.collector),e.platformHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`full`],ensure:o,registrations:a};export{s as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./registry-
|
|
1
|
+
import{t as e}from"./registry-xB8Wgmyj.mjs";import{n as t}from"./bind-helpers-D0mGAOof.mjs";import{t as n}from"./definitions-DtZ6Ktx2.mjs";const r=`sourcemap`,i=`sourcemapHandlers`,a=t({domain:r,depKey:i,lookup:e(n),entries:[{tool:`sourcemap_discover`,method:`handleSourcemapDiscover`},{tool:`sourcemap_fetch_and_parse`,method:`handleSourcemapFetchAndParse`},{tool:`sourcemap_coverage`,method:`handleSourcemapCoverage`},{tool:`sourcemap_lookup`,method:`handleSourcemapLookup`},{tool:`sourcemap_reconstruct_tree`,method:`handleSourcemapReconstructTree`},{tool:`sourcemap_parse_v4`,method:`handleSourcemapParseV4`}]});async function o(e){let{CodeCollector:t}=await import(`./collector-CB2syQEg.mjs`),{SourcemapToolHandlers:n}=await import(`./sourcemap-DqEW15Ao.mjs`);return e.collector||(e.collector=new t(e.config.puppeteer),e.registerCaches()),e.sourcemapHandlers||=new n(e.collector),e.sourcemapHandlers}const s={kind:`domain-manifest`,version:1,domain:r,depKey:i,profiles:[`full`],ensure:o,registrations:a};export{s as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./ServerRuntimeState-CgqBBwfd.mjs";import{t}from"./BrowserSessionCoordinator-QIt3tetp.mjs";import{t as n}from"./ensure-browser-core-JHwDo5ql.mjs";import{t as r}from"./registry-xB8Wgmyj.mjs";import{n as i}from"./bind-helpers-D0mGAOof.mjs";import{n as a,t as o}from"./definitions-DBYSxChX.mjs";const s=`browser`,c=`browserHandlers`,l=i({domain:s,depKey:c,lookup:r([...o,...a]),entries:[{tool:`get_detailed_data`,method:`handleGetDetailedData`},{tool:`get_offloaded_data`,method:`handleGetOffloadedData`},{tool:`browser_attach`,method:`handleBrowserAttach`},{tool:`browser_list_tabs`,method:`handleBrowserListTabs`},{tool:`browser_list_cdp_targets`,method:`handleBrowserListCdpTargets`},{tool:`browser_select_tab`,method:`handleBrowserSelectTab`},{tool:`browser_attach_cdp_target`,method:`handleBrowserAttachCdpTarget`},{tool:`browser_detach_cdp_target`,method:`handleBrowserDetachCdpTarget`},{tool:`browser_evaluate_cdp_target`,method:`handleBrowserEvaluateCdpTarget`},{tool:`browser_launch`,method:`handleBrowserLaunch`},{tool:`browser_close`,method:`handleBrowserClose`},{tool:`browser_status`,method:`handleBrowserStatus`},{tool:`page_navigate`,method:`handlePageNavigate`},{tool:`page_reload`,method:`handlePageReload`},{tool:`page_back`,method:`handlePageBack`},{tool:`page_forward`,method:`handlePageForward`},{tool:`page_list_frames`,method:`handlePageListFrames`},{tool:`page_click`,method:`handlePageClick`},{tool:`page_type`,method:`handlePageType`},{tool:`page_upload_files`,method:`handlePageUploadFiles`},{tool:`page_select`,method:`handlePageSelect`},{tool:`page_hover`,method:`handlePageHover`},{tool:`page_scroll`,method:`handlePageScroll`},{tool:`page_wait_for_selector`,method:`handlePageWaitForSelector`},{tool:`page_evaluate`,method:`handlePageEvaluate`},{tool:`page_screenshot`,method:`handlePageScreenshot`},{tool:`get_all_scripts`,method:`handleGetAllScripts`},{tool:`get_script_source`,method:`handleGetScriptSource`},{tool:`console_monitor`,method:`handleConsoleMonitor`},{tool:`console_get_logs`,method:`handleConsoleGetLogs`},{tool:`console_execute`,method:`handleConsoleExecute`},{tool:`page_inject_script`,method:`handlePageInjectScript`},{tool:`page_cookies`,method:`handlePageCookiesDispatch`},{tool:`page_set_viewport`,method:`handlePageSetViewport`},{tool:`page_emulate_device`,method:`handlePageEmulateDevice`},{tool:`page_local_storage`,method:`handlePageLocalStorageDispatch`},{tool:`page_press_key`,method:`handlePagePressKey`},{tool:`captcha_detect`,method:`handleCaptchaDetect`},{tool:`captcha_wait`,method:`handleCaptchaWait`},{tool:`captcha_config`,method:`handleCaptchaConfig`},{tool:`stealth_inject`,method:`handleStealthInject`},{tool:`stealth_set_user_agent`,method:`handleStealthSetUserAgent`},{tool:`stealth_configure_jitter`,method:`handleStealthConfigureJitter`},{tool:`stealth_generate_fingerprint`,method:`handleStealthGenerateFingerprint`},{tool:`stealth_verify`,method:`handleStealthVerify`},{tool:`camoufox_geolocation`,method:`handleCamoufoxGeolocation`},{tool:`camoufox_server`,method:`handleCamoufoxServerDispatch`},{tool:`framework_state_extract`,method:`handleFrameworkStateExtract`},{tool:`indexeddb_dump`,method:`handleIndexedDBDump`},{tool:`js_heap_search`,method:`handleJSHeapSearch`},{tool:`tab_workflow`,method:`handleTabWorkflow`},{tool:`browser_codegen_start`,method:`handleBrowserCodegenStart`},{tool:`browser_codegen_stop`,method:`handleBrowserCodegenStop`},{tool:`human_mouse`,method:`handleHumanMouse`},{tool:`human_scroll`,method:`handleHumanScroll`},{tool:`human_typing`,method:`handleHumanTyping`},{tool:`captcha_solver_capabilities`,method:`handleCaptchaSolverCapabilities`},{tool:`captcha_vision_solve`,method:`handleCaptchaVisionSolve`},{tool:`widget_challenge_solve`,method:`handleWidgetChallengeSolve`},{tool:`browser_jsdom_parse`,method:`handleJsdomParse`},{tool:`browser_jsdom_query`,method:`handleJsdomQuery`},{tool:`browser_jsdom_execute`,method:`handleJsdomExecute`},{tool:`browser_jsdom_serialize`,method:`handleJsdomSerialize`},{tool:`browser_jsdom_cookies`,method:`handleJsdomCookies`}]});async function u(r){let{BrowserToolHandlers:i}=await import(`./browser-BUaB25bk.mjs`);if(await n(r),!r.browserHandlers){let n=r,a=typeof r.getDomainInstance==`function`?r.getDomainInstance.bind(r):null,o=typeof r.setDomainInstance==`function`?r.setDomainInstance.bind(r):null,s=a?.(`browserSessionCoordinator`)??n.browserSessionCoordinator??new t(()=>r.collector);o?o(`browserSessionCoordinator`,s):n.browserSessionCoordinator=s,r.browserHandlers=new i(r.collector,r.pageController,r.scriptManager,r.consoleMonitor,r.eventBus,()=>s.getCurrentSessionId(),s,t=>{e(r)?.setBrowserAttach(t)})}return r.browserHandlers}const d={kind:`domain-manifest`,version:1,domain:s,depKey:c,profiles:[`workflow`,`full`],ensure:u,workflowRule:{patterns:[/(browser|page|navigate|screenshot|click|type|scrape)/i,/(浏览器|页面|导航|截图|点击|输入|爬取)/i],priority:90,tools:[`page_navigate`,`page_evaluate`,`browser_jsdom_parse`,`console_get_logs`,`page_click`,`page_type`,`page_screenshot`],hint:`Browser automation workflow: bootstrap browser/page state -> inspect page state -> interact -> capture visual evidence only when needed`},prerequisites:{page_navigate:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_click:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_type:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_upload_files:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_screenshot:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_evaluate:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_hover:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_back:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_forward:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_reload:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}],page_scroll:[{condition:`Browser must be launched`,fix:`Call browser_launch or browser_attach first`}]},registrations:l};export{d as default};
|