@jshookmcp/jshook 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +11 -3
  3. package/README.zh.md +11 -3
  4. package/dist/{AntiCheatDetector-CGVGNfy5.mjs → AntiCheatDetector-B6d4Qe9D.mjs} +1 -1
  5. package/dist/BrowserSessionCoordinator-BJ-HOxo0.mjs +1 -0
  6. package/dist/{CodeInjector-BlgyqTOk.mjs → CodeInjector-Cll_7bLJ.mjs} +1 -1
  7. package/dist/ConsoleMonitor-CxDJV15E.mjs +306 -0
  8. package/dist/DOMInspector-C19J4zeq.mjs +95 -0
  9. package/dist/DetailedDataManager-DmQ1LT-W.mjs +1 -0
  10. package/dist/ExtensionManager-BD724zkO.mjs +1 -0
  11. package/dist/ExtensionManager.tools-oVMJgPcN.mjs +1 -0
  12. package/dist/{HardwareBreakpoint-OcJqNFVc.mjs → HardwareBreakpoint-BUfPdp0f.mjs} +1 -1
  13. package/dist/{HeapAnalyzer-CqAxZzeS.mjs → HeapAnalyzer-B_aqY8oj.mjs} +1 -1
  14. package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +1 -0
  15. package/dist/MemoryController-X1XNSn1n.mjs +2 -0
  16. package/dist/{MemoryScanSession-CaxAjZJf.mjs → MemoryScanSession-DG_F-PjE.mjs} +1 -1
  17. package/dist/{MemoryScanner-BLYnMJy6.mjs → MemoryScanner-g1_L1ub5.mjs} +1 -1
  18. package/dist/{NativeMemoryManager.impl-CI554XbY.mjs → NativeMemoryManager.impl-DniBe2wf.mjs} +1 -1
  19. package/dist/{NativeMemoryManager.utils-DM4NC3FE.mjs → NativeMemoryManager.utils-BHy1P_jM.mjs} +1 -1
  20. package/dist/NetworkMonitor-B_-au6aV.mjs +185 -0
  21. package/dist/{PEAnalyzer-DJyaJTQJ.mjs → PEAnalyzer-yWQaGrcx.mjs} +1 -1
  22. package/dist/PageController-Dfsm1_o7.mjs +1 -0
  23. package/dist/{PointerChainEngine-5nF9eNlu.mjs → PointerChainEngine-BhCUkmxY.mjs} +1 -1
  24. package/dist/ProcessRegistry-C-bN48oR.mjs +1 -0
  25. package/dist/{ResponseBuilder-B2lu4KEl.mjs → ResponseBuilder-BfWP-uaT.mjs} +1 -1
  26. package/dist/RingBuffer-Dm54ELKT.mjs +1 -0
  27. package/dist/{ScriptManager-fgqiALgj.mjs → ScriptManager-LWGPTdvD.mjs} +1 -1
  28. package/dist/ServerRuntimeState-D2bWHqEE.mjs +1 -0
  29. package/dist/{Speedhack-l6s8L2Qw.mjs → Speedhack-yseDPSZ9.mjs} +1 -1
  30. package/dist/{StructureAnalyzer-A-WamfYE.mjs → StructureAnalyzer-C5lpuZkg.mjs} +1 -1
  31. package/dist/ToolCatalog-CYdD9F5f.mjs +1 -0
  32. package/dist/ToolProbe-C7ZU2x7M.mjs +1 -0
  33. package/dist/ToolRegistry-C5oB8KP8.mjs +1 -0
  34. package/dist/{ToolRouter.policy-CFHoN_Lw.mjs → ToolRouter.policy-CfhJczkt.mjs} +2 -2
  35. package/dist/{TraceRecorder-Dd8jLXpi.mjs → TraceRecorder-BiJWBXHX.mjs} +1 -1
  36. package/dist/{Win32Debug-CQteFL4F.mjs → Win32Debug-CYrIQBvr.mjs} +1 -1
  37. package/dist/{WorkflowEngine-CxEp2WXH.mjs → WorkflowEngine-D876meOO.mjs} +1 -1
  38. package/dist/analysis-D4swdMvq.mjs +6 -0
  39. package/dist/{antidebug-BOTZH6-0.mjs → antidebug-7L3ygj_9.mjs} +4 -4
  40. package/dist/apk-packer-BqXcInnX.mjs +1 -0
  41. package/dist/{artifactRetention-NBdncOEW.mjs → artifactRetention-BCPQASm7.mjs} +1 -1
  42. package/dist/{artifacts-B5xQuEa_.mjs → artifacts-CkodUM4j.mjs} +1 -1
  43. package/dist/betterSqlite3-Brtq-SIQ.mjs +1 -0
  44. package/dist/{binary-instrument-Cf9qqLlM.mjs → binary-instrument-DU7V6TUM.mjs} +1 -1
  45. package/dist/binary-secrets-PdMVoyt0.mjs +1 -0
  46. package/dist/{boringssl-inspector-BST5vtKx.mjs → boringssl-inspector-BBaJwwkU.mjs} +1 -1
  47. package/dist/browser-Qqco2rOT.mjs +11 -0
  48. package/dist/collector-Bpl6qy2L.mjs +1 -0
  49. package/dist/constants-BYj8Xek8.mjs +1 -0
  50. package/dist/{coordination-BbijHEHH.mjs → coordination-CWXW1o8K.mjs} +1 -1
  51. package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
  52. package/dist/{debugger-CRJq_krh.mjs → debugger-DyALjYMk.mjs} +1 -1
  53. package/dist/{definitions-DZ8uKusP.mjs → definitions-BWxBke3r.mjs} +1 -1
  54. package/dist/{definitions-CYFbewnd.mjs → definitions-BYwATKc-.mjs} +1 -1
  55. package/dist/{definitions-DJklW2sS.mjs → definitions-B_83XfNQ.mjs} +1 -1
  56. package/dist/definitions-Bf3H1EwV.mjs +1 -0
  57. package/dist/{definitions-BGobEDQa.mjs → definitions-BftdXgXI.mjs} +1 -1
  58. package/dist/definitions-Bio5XJYy.mjs +1 -0
  59. package/dist/definitions-C3qNgSn1.mjs +1 -0
  60. package/dist/{definitions-NoVp_9Pm.mjs → definitions-CB6vmOer.mjs} +1 -1
  61. package/dist/{definitions-CoQFbggH.mjs → definitions-CMZRSy3k.mjs} +1 -1
  62. package/dist/{definitions-DI9YXsJk.mjs → definitions-CQd7yCQH.mjs} +1 -1
  63. package/dist/{definitions-CIO9O-Sw.mjs → definitions-CT8ln6GQ.mjs} +1 -1
  64. package/dist/{definitions-BGwNSkVm.mjs → definitions-Cenu6mxo.mjs} +1 -1
  65. package/dist/definitions-D4g-MS10.mjs +1 -0
  66. package/dist/{definitions-CuJRsJ6N.mjs → definitions-D5wl_8HN.mjs} +1 -1
  67. package/dist/{definitions-jXPaVy4P.mjs → definitions-DAQm1Xar.mjs} +1 -1
  68. package/dist/definitions-DP1vgxEY.mjs +1 -0
  69. package/dist/{definitions-Dds_zrWx.mjs → definitions-DxFNRQNK2.mjs} +1 -1
  70. package/dist/{definitions-DtE0XLrT.mjs → definitions-Ibci7e_L.mjs} +1 -1
  71. package/dist/{definitions-CCP9gphV.mjs → definitions-OeLvmlQy.mjs} +1 -1
  72. package/dist/{definitions-BbxOUiP-.mjs → definitions-RZYGD_Ey.mjs} +1 -1
  73. package/dist/definitions-Tls8c0A0.mjs +1 -0
  74. package/dist/{definitions-LaYTuwQd.mjs → definitions-bybDvnG0.mjs} +1 -1
  75. package/dist/{definitions-Dgrg7f3D.mjs → definitions-l7TjdE6V.mjs} +1 -1
  76. package/dist/{encoding-DGcr6Aj_.mjs → encoding-ycOaz8Vr.mjs} +1 -1
  77. package/dist/{ensure-browser-core-Buls24LQ.mjs → ensure-browser-core-DxWC-NTp.mjs} +1 -1
  78. package/dist/{factory-Cx_1LorX.mjs → factory-CKr4fAE1.mjs} +1 -1
  79. package/dist/{graphql-HLf3MS8H.mjs → graphql-B2TiPEow.mjs} +4 -4
  80. package/dist/{handlers-D49r1-1P.mjs → handlers-8zN_vBIz.mjs} +1 -1
  81. package/dist/handlers-B62K4FTc.mjs +1 -0
  82. package/dist/{handlers-BZoPla6E.mjs → handlers-BpDlVVVU.mjs} +1 -1
  83. package/dist/{handlers-DmQzIc44.mjs → handlers-CMJK7m1c.mjs} +1 -1
  84. package/dist/{handlers-BLMa4X7l.mjs → handlers-D2ZOul9p.mjs} +2 -2
  85. package/dist/{handlers-DW5AbYs5.mjs → handlers-D5E40ssn.mjs} +3 -3
  86. package/dist/{handlers-BP12ZsWc.mjs → handlers-DGbdQAgD.mjs} +2 -2
  87. package/dist/handlers-DHO3rjsW.mjs +1 -0
  88. package/dist/{handlers-DCE45Ww8.mjs → handlers-FJ80VzUI.mjs} +1 -1
  89. package/dist/handlers-VHWrxbM_.mjs +1 -0
  90. package/dist/{handlers-BggKiVx9.mjs → handlers-l8QIKqBj.mjs} +1 -1
  91. package/dist/{handlers-DnJRGp7t.mjs → handlers-mPFiNPe8.mjs} +1 -1
  92. package/dist/{handlers-pVNpaw4A.mjs → handlers-yo_xYzT8.mjs} +1 -1
  93. package/dist/handlers.impl-D9Hh8Bgl.mjs +1 -0
  94. package/dist/{hooks-DDKppogd.mjs → hooks-D4XLfgtV.mjs} +1 -1
  95. package/dist/index.mjs +11 -15
  96. package/dist/jadx-search-B_Yse0Zh.mjs +5 -0
  97. package/dist/maintenance-BUpIukhg.mjs +1 -0
  98. package/dist/{manifest-yu2xiQqe.mjs → manifest-0Jpt_AQa.mjs} +1 -1
  99. package/dist/{manifest-DMJlcsTR.mjs → manifest-B3fZbSWR.mjs} +1 -1
  100. package/dist/{manifest-De-6Wf2R.mjs → manifest-B7NB2rh2.mjs} +1 -1
  101. package/dist/manifest-BDi4nbH1.mjs +1 -0
  102. package/dist/{manifest-ais9Afrw.mjs → manifest-BLDfkE7n.mjs} +1 -1
  103. package/dist/manifest-BcXbB4gf.mjs +1 -0
  104. package/dist/{manifest-DsVh7Y4U.mjs → manifest-Bdnc_vrc.mjs} +1 -1
  105. package/dist/manifest-BuYKgCnp.mjs +1 -0
  106. package/dist/{manifest-Cx2IVMUY.mjs → manifest-CBfNnGPV.mjs} +1 -1
  107. package/dist/{manifest-DC-SMF6b.mjs → manifest-CPS1Xv69.mjs} +1 -1
  108. package/dist/{manifest-CGq4NpqH2.mjs → manifest-CQH9FhwI.mjs} +1 -1
  109. package/dist/{manifest-CRIJq4Hs.mjs → manifest-CRryuZF4.mjs} +1 -1
  110. package/dist/manifest-CctIumog.mjs +1 -0
  111. package/dist/manifest-CvTe5ZGV2.mjs +1 -0
  112. package/dist/{manifest-H-EpAyZQ.mjs → manifest-D-5GH0DV.mjs} +1 -1
  113. package/dist/{manifest-CtPmHAdn.mjs → manifest-D3Ssf3IC.mjs} +1 -1
  114. package/dist/{manifest-BeP_zJGb2.mjs → manifest-D5ck3NvC.mjs} +1 -1
  115. package/dist/{manifest-CeQmtQOY.mjs → manifest-D9jUUJAu.mjs} +1 -1
  116. package/dist/{manifest-C7qV1z7F.mjs → manifest-DCx6w2XV.mjs} +1 -1
  117. package/dist/{manifest-CFn0359q2.mjs → manifest-DG19q-Ld.mjs} +1 -1
  118. package/dist/{manifest-CJMGt7Qy.mjs → manifest-DLMlD0Zc.mjs} +1 -1
  119. package/dist/{manifest-CDeUZGUZ.mjs → manifest-DYpn8w_h.mjs} +1 -1
  120. package/dist/manifest-DYzWI8Xs.mjs +1 -0
  121. package/dist/{manifest-DKUorv5M.mjs → manifest-D_obs5F4.mjs} +1 -1
  122. package/dist/{manifest-D610kxZr.mjs → manifest-DujQqEQR.mjs} +2 -2
  123. package/dist/manifest-DwL2ik8P.mjs +1 -0
  124. package/dist/manifest-ItF5P8A12.mjs +1 -0
  125. package/dist/{manifest-tmb54wmA.mjs → manifest-KZphqIyX.mjs} +1 -1
  126. package/dist/{manifest-BPuE6oH2.mjs → manifest-LG42zPLY2.mjs} +1 -1
  127. package/dist/{manifest-D44TaRJU.mjs → manifest-LLdI5m4T.mjs} +1 -1
  128. package/dist/{manifest-Dgh0uDW-.mjs → manifest-QYbQXJn0.mjs} +1 -1
  129. package/dist/{manifest-BFGxlDRh.mjs → manifest-RcpX_MyZ.mjs} +2 -2
  130. package/dist/{manifest-CDiCtaQT.mjs → manifest-YgVd8Sgz.mjs} +1 -1
  131. package/dist/{manifest-D16xPXro.mjs → manifest-Zy7Odg5J.mjs} +1 -1
  132. package/dist/manifest-ff1H7Pdp.mjs +1 -0
  133. package/dist/{manifest-C_hEIjSx.mjs → manifest-iuhF6pTL2.mjs} +1 -1
  134. package/dist/{manifest-DWUUWBz0.mjs → manifest-nXHmtMSp2.mjs} +1 -1
  135. package/dist/{manifest-C1nZkTkO.mjs → manifest-xWfu6iLo.mjs} +1 -1
  136. package/dist/{manifest-C0g67k6U.mjs → manifest-yC16OhL2.mjs} +1 -1
  137. package/dist/manifest-ztWJoXy4.mjs +1 -0
  138. package/dist/modules-BPBcSaM-.mjs +333 -0
  139. package/dist/{mojo-ipc-VGlv3Qyp.mjs → mojo-ipc-BhwsdVUW.mjs} +1 -1
  140. package/dist/native/scripts/linux/enum-windows.sh +12 -12
  141. package/dist/native/scripts/macos/enum-windows.applescript +22 -22
  142. package/dist/native-j8l473zn.mjs +961 -0
  143. package/dist/network-T0VRwNPd.mjs +7 -0
  144. package/dist/{outputPaths-BonGThuc.mjs → outputPaths-B4Ic4RZh.mjs} +2 -2
  145. package/dist/platform-CzaQtISh.mjs +93 -0
  146. package/dist/process-CWhsCWrf.mjs +2 -0
  147. package/dist/proxy-DZFlDsG3.mjs +2 -0
  148. package/dist/{registry-DUHIPE-v.mjs → registry-DH4sc1dt.mjs} +1 -1
  149. package/dist/renderer-pid-9tJnZ_9N.mjs +1 -0
  150. package/dist/{search-defaults-D2bY-rzH.mjs → search-defaults-lYBVn_3L.mjs} +1 -1
  151. package/dist/server/plugin-api.d.mts +19 -36
  152. package/dist/server/plugin-api.mjs +1 -1
  153. package/dist/{shared-state-board-Cyg-xh_k.mjs → shared-state-board-BSjXLUV1.mjs} +1 -1
  154. package/dist/{sourcemap-D6Q1UuAp.mjs → sourcemap-Dh3Ai_ur.mjs} +1 -1
  155. package/dist/streaming-BcJ0B6ao.mjs +1 -0
  156. package/dist/transform-DOxzeWPB.mjs +103 -0
  157. package/dist/wasm-CZ_HTfKR.mjs +174 -0
  158. package/dist/{webcrack-CsLLJIs9.mjs → webcrack-C1iYG_EX.mjs} +3 -3
  159. package/dist/{workflow-CYIXtrWD.mjs → workflow-BdwQmARn.mjs} +4 -4
  160. package/package.json +16 -15
  161. package/src/native/scripts/linux/enum-windows.sh +12 -12
  162. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  163. package/dist/ConsoleMonitor-Dkqc0HNi.mjs +0 -490
  164. package/dist/DOMInspector-BYY_EJ0C.mjs +0 -95
  165. package/dist/DetailedDataManager-BniBJlVv.mjs +0 -1
  166. package/dist/ExtensionManager-erMpqcLk.mjs +0 -1
  167. package/dist/MCPServer.search.handlers.domain-DVbWL1bT.mjs +0 -1
  168. package/dist/MemoryController-BaqstM5w.mjs +0 -2
  169. package/dist/PageController-D9jVkH0i.mjs +0 -1
  170. package/dist/ProcessRegistry-Hf12LlR9.mjs +0 -1
  171. package/dist/ToolCatalog-D_IKl1Hu.mjs +0 -1
  172. package/dist/ToolProbe-xsfALmN3.mjs +0 -1
  173. package/dist/ToolRegistry-B0Zs-phN.mjs +0 -1
  174. package/dist/analysis-BuR-NgX8.mjs +0 -5
  175. package/dist/betterSqlite3-CGaxz4AX.mjs +0 -1
  176. package/dist/browser-C4Le3xqA.mjs +0 -11
  177. package/dist/collector-CKO8RPK8.mjs +0 -1
  178. package/dist/constants-Cp6hBrrx.mjs +0 -1
  179. package/dist/definitions-CdWEuIkI.mjs +0 -1
  180. package/dist/definitions-OvGsfxdt.mjs +0 -1
  181. package/dist/handlers-D3iev8g1.mjs +0 -1
  182. package/dist/handlers-De5u62Ga2.mjs +0 -1
  183. package/dist/handlers-S9Ws0IGy.mjs +0 -2
  184. package/dist/handlers.impl-CD2_kOcC.mjs +0 -1
  185. package/dist/maintenance-CutEO84j.mjs +0 -1
  186. package/dist/manifest-BXry5N09.mjs +0 -1
  187. package/dist/manifest-Cq0j7GZt.mjs +0 -1
  188. package/dist/manifest-DD3rtxvV.mjs +0 -1
  189. package/dist/manifest-Dm0o3i2U.mjs +0 -1
  190. package/dist/manifest-DtEFSRaq.mjs +0 -1
  191. package/dist/manifest-zrbrpKCC.mjs +0 -1
  192. package/dist/modules-p-PUNv9r.mjs +0 -332
  193. package/dist/network-BjZ1Y-GB.mjs +0 -7
  194. package/dist/platform-C446Lf97.mjs +0 -93
  195. package/dist/process-C9f2A5zk.mjs +0 -962
  196. package/dist/proxy-CvRepxgV.mjs +0 -1
  197. package/dist/streaming-CTX58tbb.mjs +0 -1
  198. package/dist/transform-Cv9P2vVD.mjs +0 -103
  199. package/dist/wasm-DaJa8J0V.mjs +0 -174
  200. /package/dist/{CacheAdapters-CdAxBmVW.mjs → CacheAdapters-CsNtQIR8.mjs} +0 -0
  201. /package/dist/{DarwinAPI-DC4HGGLl.mjs → DarwinAPI-ZfQdpLNI.mjs} +0 -0
  202. /package/dist/{EventBus-DgciURGg.mjs → EventBus-DL8iLA09.mjs} +0 -0
  203. /package/dist/{EvidenceGraphBridge-BIfgB7HP.mjs → EvidenceGraphBridge-BtbwXsLC.mjs} +0 -0
  204. /package/dist/{FingerprintManager-N7BZqjxP.mjs → FingerprintManager-DT0EAUEo.mjs} +0 -0
  205. /package/dist/{HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs → HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs} +0 -0
  206. /package/dist/{InstrumentationSession-DxXs0sCp.mjs → InstrumentationSession-D_G1ZPyd.mjs} +0 -0
  207. /package/dist/{PrerequisiteError-Bl3dK8XA.mjs → PrerequisiteError-BjCQA-gK.mjs} +0 -0
  208. /package/dist/{ReverseEvidenceGraph-B931HeoW.mjs → ReverseEvidenceGraph-BhSYYdiI.mjs} +0 -0
  209. /package/dist/{StealthVerifier-Dhbj4B4P.mjs → StealthVerifier-BmcxfwSF.mjs} +0 -0
  210. /package/dist/{VersionDetector-DMoUWyNm.mjs → VersionDetector-CHT36Az0.mjs} +0 -0
  211. /package/dist/{Win32API-Bhi5xFBe.mjs → Win32API-eUCF57l_.mjs} +0 -0
  212. /package/dist/{authorization-schema-B40obG1A.mjs → authorization-schema-BOFwSXUN.mjs} +0 -0
  213. /package/dist/{bind-helpers-BlAOQrFQ.mjs → bind-helpers-m2U8glkF.mjs} +0 -0
  214. /package/dist/{capabilities-DbYCv-HF.mjs → capabilities-CyXuKUl1.mjs} +0 -0
  215. /package/dist/{concurrency-CcK46d0h.mjs → concurrency-DCr8WQ2M.mjs} +0 -0
  216. /package/dist/{evidence-graph-bridge-B0yhGPcs.mjs → evidence-graph-bridge-CV_UdYqj.mjs} +0 -0
  217. /package/dist/{flat-target-session-CO5g78k3.mjs → flat-target-session-DvcQX7J5.mjs} +0 -0
  218. /package/dist/{formatAddress-C7j2fDlM.mjs → formatAddress-vLA_hOJt.mjs} +0 -0
  219. /package/dist/{handlers-Dv_runVv.mjs → handlers-0yKLRIfo.mjs} +0 -0
  220. /package/dist/{matchesWildcardPattern-BGqLSmEs.mjs → matchesWildcardPattern-BAG6LvX5.mjs} +0 -0
  221. /package/dist/{parse-args-Cuk7-xUt.mjs → parse-args-Bw413PlW.mjs} +0 -0
  222. /package/dist/{playwright-cdp-fallback-BwVR-_T3.mjs → playwright-cdp-fallback-DqFdx9-s.mjs} +0 -0
  223. /package/dist/{ssrf-policy-T96MR3r6.mjs → ssrf-policy-CsIJGkpd.mjs} +0 -0
  224. /package/dist/{tool-builder-CI9914Tf.mjs → tool-builder-qif8M9-K.mjs} +0 -0
  225. /package/dist/{types-DtThH00r.mjs → types-D9EiE5o9.mjs} +0 -0
  226. /package/dist/{types-CuyefmGT.mjs → types-Fz69RzbZ.mjs} +0 -0
@@ -1,2 +1,2 @@
1
- import{n as e}from"./response-C7rKQst4.mjs";import{a as t,t as n}from"./parse-args-Cuk7-xUt.mjs";function r(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function i(e,t){let n=r(e),i=r(t);return n===i&&n.length>0?1:n.length===0||i.length===0?0:n.includes(i)||i.includes(n)?.8:0}function a(e,t){let n=0,r;for(let a of t){let t=i(e,a.name);t>n&&(n=t,r={objectId:a.objectId,name:a.name,score:t});for(let t of a.stringProps){let o=i(e,t);o>n&&(n=o,r={objectId:a.objectId,name:a.name,score:o})}}if(r&&n>=.5)return r}function o(e,t){let n=[],r=[],i=[],o=new Set,s=[];for(let e of t.sceneTree.layers)s.push({id:e.id,label:e.label,heapObjectId:e.heapObjectId});for(let e of t.sceneTree.drawCommands)s.push({id:e.id,label:e.label});let c=s.length;for(let c of s){let s=e.addCanvasNode({nodeId:c.id,label:c.label});if(n.push(s.id),c.heapObjectId){let i=t.jsObjects.find(e=>e.objectId===c.heapObjectId);if(i){let t=e.addV8Object({address:c.heapObjectId,name:i.name});n.push(t.id),e.getGraph().addEdge(t.id,s.id,`canvas-rendered-by`,{domain:`cross-domain`,matchScore:1}),r.push({skiaNodeId:c.id,matchedObjectId:i.objectId,matchedObjectName:i.name,matchScore:1}),o.add(c.id);continue}}let l=a(c.label,t.jsObjects);if(l){let t=e.addV8Object({address:l.objectId,name:l.name});n.push(t.id),e.getGraph().addEdge(t.id,s.id,`canvas-rendered-by`,{domain:`cross-domain`,matchScore:l.score}),r.push({skiaNodeId:c.id,matchedObjectId:l.objectId,matchedObjectName:l.name,matchScore:l.score}),o.add(c.id)}else i.push(c.id)}return{skiaNodes:c,correlations:r,unmatchedSkiaNodes:i,confidence:c===0?0:r.length/c,graphNodeIds:n}}const s=[{mojoPattern:/URLLoader/i,cdpPattern:/Network\./i},{mojoPattern:/WebSocket/i,cdpPattern:/Network\.webSocket/i},{mojoPattern:/Fetch/i,cdpPattern:/Fetch\./i}];function c(e,t,n,r){let i=[],a=[],o=new Set,c=new Map;for(let t of r){let{node:n}=e.addNetworkRequest({requestId:t.requestId,url:t.url});c.set(t.requestId,n.id),i.push(n.id)}if(t.length===0)return{mojoMessages:0,matchedPairs:[],unmatchedMojo:[],confidence:0,graphNodeIds:i};let l=new Map;for(let n of t){let t=e.addMojoMessage({interface:n.interface,method:n.method,timestamp:n.timestamp});l.set(n.messageId,t.id),i.push(t.id)}for(let e of t)if(!o.has(e.messageId))for(let t of s){if(!t.mojoPattern.test(e.interface))continue;let r=n.find(n=>t.cdpPattern.test(n.eventType)&&!o.has(e.messageId));if(r){a.push({mojoMessageId:e.messageId,matchType:`interface`,cdpEventType:r.eventType}),o.add(e.messageId);break}}for(let n of t)if(!o.has(n.messageId)&&/URLLoader/i.test(n.interface)){let t=r.find(e=>Math.abs(e.timestamp-n.timestamp)<=50);if(t){let r=c.get(t.requestId),i=l.get(n.messageId);r&&i&&e.getGraph().addEdge(r,i,`mojo-routed-to`,{domain:`cross-domain`,relation:`network-request-correlates-to-mojo`,matchType:`urlloader`,timestampDelta:Math.abs(t.timestamp-n.timestamp)}),a.push({mojoMessageId:n.messageId,matchType:`urlloader`,networkRequestId:t.requestId,timestampDelta:Math.abs(t.timestamp-n.timestamp)}),o.add(n.messageId)}}for(let e of t){if(o.has(e.messageId))continue;let t=1/0,r;for(let i of n){let n=Math.abs(i.timestamp-e.timestamp);n<=50&&n<t&&(t=n,r=i)}r&&(a.push({mojoMessageId:e.messageId,matchType:`timestamp`,cdpEventType:r.eventType,timestampDelta:t}),o.add(e.messageId))}let u=t.filter(e=>!o.has(e.messageId)).map(e=>e.messageId),d=t.length===0?0:o.size/t.length;return{mojoMessages:t.length,matchedPairs:a,unmatchedMojo:u,confidence:d,graphNodeIds:i}}const l={NtReadFile:/read|fs[_.]read/i,NtWriteFile:/write|fs[_.]write/i,NtOpenFile:/open|fs[_.]open/i,NtCreateFile:/create|fs[_.]create/i,NtClose:/close|fs[_.]close/i,NtDeviceIoControlFile:/ioctl|device/i,NtQueryInformationFile:/stat|info|query/i,NtSetInformationFile:/set|chmod|chown/i};function u(e,t){let n=l[e];return n&&n.test(t)?`high`:/file|fs|read|write|open|close/i.test(t)?`medium`:`low`}function d(e,t,n){let r=[],i=[],a=[];if(t.length===0)return{syscalls:0,correlations:[],unmatchedSyscalls:[],correlationConfidence:0,graphNodeIds:[]};for(let o of t){let t=e.addSyscallEvent({pid:o.pid,tid:o.tid,syscallName:o.syscallName,timestamp:o.timestamp});r.push(t.id);let s=n.find(e=>e.threadId===o.tid&&e.timestamp===o.timestamp);if(s&&s.frames.length>0){let n=s.frames[0];if(n){let a=n.functionName,s=u(o.syscallName,a),c=e.addNode(`function`,a,{domain:`v8-inspector`,functionName:a,threadId:o.tid});r.push(c.id),e.getGraph().addEdge(c.id,t.id,`syscall-emitted-by`,{domain:`cross-domain`,confidence:s}),i.push({syscallName:o.syscallName,topJsFunction:a,threadId:o.tid,timestamp:o.timestamp,confidence:s})}else a.push({syscallName:o.syscallName,tid:o.tid})}else a.push({syscallName:o.syscallName,tid:o.tid})}let o=t.length===0?0:i.length/t.length;return{syscalls:t.length,correlations:i,unmatchedSyscalls:a,correlationConfidence:o,graphNodeIds:r}}const f=[/^native_/i,/^JS_/i,/^Java_/i];function p(e){return e.calledFrom&&e.calledFrom.length>0?!0:f.some(t=>t.test(e.name))}function m(e,t){let n=[];n.push(`// Binary-to-JS Hook Script`),n.push(`// Module: ${t}`),n.push(`// Generated at: ${new Date().toISOString()}`),n.push(``);for(let r of e){let e=r.moduleName||t;r.address?(n.push(`// Hook: ${r.name} at ${r.address} in ${e}`),n.push(`Interceptor.attach(Module.findBaseAddress('${e}').add(${r.address}), {`)):(n.push(`// Hook: ${r.name} in ${e}`),n.push(`Interceptor.attach(Module.findExportByName('${e}', '${r.name}'), {`)),n.push(` onEnter(args) {`),n.push(` console.log('[${r.name}] called with args:', args[0], args[1]);`),n.push(` },`),n.push(` onLeave(retval) {`),n.push(` console.log('[${r.name}] returned:', retval);`),n.push(` }`),n.push(`});`),n.push(``)}return n.push(`console.log('Binary-to-JS hook script loaded for ${t}');`),n.join(`
1
+ import{n as e}from"./response-C7rKQst4.mjs";import{a as t,t as n}from"./parse-args-Bw413PlW.mjs";function r(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function i(e,t){let n=r(e),i=r(t);return n===i&&n.length>0?1:n.length===0||i.length===0?0:n.includes(i)||i.includes(n)?.8:0}function a(e,t){let n=0,r;for(let a of t){let t=i(e,a.name);t>n&&(n=t,r={objectId:a.objectId,name:a.name,score:t});for(let t of a.stringProps){let o=i(e,t);o>n&&(n=o,r={objectId:a.objectId,name:a.name,score:o})}}if(r&&n>=.5)return r}function o(e,t){let n=[],r=[],i=[],o=new Set,s=[];for(let e of t.sceneTree.layers)s.push({id:e.id,label:e.label,heapObjectId:e.heapObjectId});for(let e of t.sceneTree.drawCommands)s.push({id:e.id,label:e.label});let c=s.length;for(let c of s){let s=e.addCanvasNode({nodeId:c.id,label:c.label});if(n.push(s.id),c.heapObjectId){let i=t.jsObjects.find(e=>e.objectId===c.heapObjectId);if(i){let t=e.addV8Object({address:c.heapObjectId,name:i.name});n.push(t.id),e.getGraph().addEdge(t.id,s.id,`canvas-rendered-by`,{domain:`cross-domain`,matchScore:1}),r.push({skiaNodeId:c.id,matchedObjectId:i.objectId,matchedObjectName:i.name,matchScore:1}),o.add(c.id);continue}}let l=a(c.label,t.jsObjects);if(l){let t=e.addV8Object({address:l.objectId,name:l.name});n.push(t.id),e.getGraph().addEdge(t.id,s.id,`canvas-rendered-by`,{domain:`cross-domain`,matchScore:l.score}),r.push({skiaNodeId:c.id,matchedObjectId:l.objectId,matchedObjectName:l.name,matchScore:l.score}),o.add(c.id)}else i.push(c.id)}return{skiaNodes:c,correlations:r,unmatchedSkiaNodes:i,confidence:c===0?0:r.length/c,graphNodeIds:n}}const s=[{mojoPattern:/URLLoader/i,cdpPattern:/Network\./i},{mojoPattern:/WebSocket/i,cdpPattern:/Network\.webSocket/i},{mojoPattern:/Fetch/i,cdpPattern:/Fetch\./i}];function c(e,t,n,r){let i=[],a=[],o=new Set,c=new Map;for(let t of r){let{node:n}=e.addNetworkRequest({requestId:t.requestId,url:t.url});c.set(t.requestId,n.id),i.push(n.id)}if(t.length===0)return{mojoMessages:0,matchedPairs:[],unmatchedMojo:[],confidence:0,graphNodeIds:i};let l=new Map;for(let n of t){let t=e.addMojoMessage({interface:n.interface,method:n.method,timestamp:n.timestamp});l.set(n.messageId,t.id),i.push(t.id)}for(let e of t)if(!o.has(e.messageId))for(let t of s){if(!t.mojoPattern.test(e.interface))continue;let r=n.find(n=>t.cdpPattern.test(n.eventType)&&!o.has(e.messageId));if(r){a.push({mojoMessageId:e.messageId,matchType:`interface`,cdpEventType:r.eventType}),o.add(e.messageId);break}}for(let n of t)if(!o.has(n.messageId)&&/URLLoader/i.test(n.interface)){let t=r.find(e=>Math.abs(e.timestamp-n.timestamp)<=50);if(t){let r=c.get(t.requestId),i=l.get(n.messageId);r&&i&&e.getGraph().addEdge(r,i,`mojo-routed-to`,{domain:`cross-domain`,relation:`network-request-correlates-to-mojo`,matchType:`urlloader`,timestampDelta:Math.abs(t.timestamp-n.timestamp)}),a.push({mojoMessageId:n.messageId,matchType:`urlloader`,networkRequestId:t.requestId,timestampDelta:Math.abs(t.timestamp-n.timestamp)}),o.add(n.messageId)}}for(let e of t){if(o.has(e.messageId))continue;let t=1/0,r;for(let i of n){let n=Math.abs(i.timestamp-e.timestamp);n<=50&&n<t&&(t=n,r=i)}r&&(a.push({mojoMessageId:e.messageId,matchType:`timestamp`,cdpEventType:r.eventType,timestampDelta:t}),o.add(e.messageId))}let u=t.filter(e=>!o.has(e.messageId)).map(e=>e.messageId),d=t.length===0?0:o.size/t.length;return{mojoMessages:t.length,matchedPairs:a,unmatchedMojo:u,confidence:d,graphNodeIds:i}}const l={NtReadFile:/read|fs[_.]read/i,NtWriteFile:/write|fs[_.]write/i,NtOpenFile:/open|fs[_.]open/i,NtCreateFile:/create|fs[_.]create/i,NtClose:/close|fs[_.]close/i,NtDeviceIoControlFile:/ioctl|device/i,NtQueryInformationFile:/stat|info|query/i,NtSetInformationFile:/set|chmod|chown/i};function u(e,t){let n=l[e];return n&&n.test(t)?`high`:/file|fs|read|write|open|close/i.test(t)?`medium`:`low`}function d(e,t,n){let r=[],i=[],a=[];if(t.length===0)return{syscalls:0,correlations:[],unmatchedSyscalls:[],correlationConfidence:0,graphNodeIds:[]};for(let o of t){let t=e.addSyscallEvent({pid:o.pid,tid:o.tid,syscallName:o.syscallName,timestamp:o.timestamp});r.push(t.id);let s=n.find(e=>e.threadId===o.tid&&e.timestamp===o.timestamp);if(s&&s.frames.length>0){let n=s.frames[0];if(n){let a=n.functionName,s=u(o.syscallName,a),c=e.addNode(`function`,a,{domain:`v8-inspector`,functionName:a,threadId:o.tid});r.push(c.id),e.getGraph().addEdge(c.id,t.id,`syscall-emitted-by`,{domain:`cross-domain`,confidence:s}),i.push({syscallName:o.syscallName,topJsFunction:a,threadId:o.tid,timestamp:o.timestamp,confidence:s})}else a.push({syscallName:o.syscallName,tid:o.tid})}else a.push({syscallName:o.syscallName,tid:o.tid})}let o=t.length===0?0:i.length/t.length;return{syscalls:t.length,correlations:i,unmatchedSyscalls:a,correlationConfidence:o,graphNodeIds:r}}const f=[/^native_/i,/^JS_/i,/^Java_/i];function p(e){return e.calledFrom&&e.calledFrom.length>0?!0:f.some(t=>t.test(e.name))}function m(e,t){let n=[];n.push(`// Binary-to-JS Hook Script`),n.push(`// Module: ${t}`),n.push(`// Generated at: ${new Date().toISOString()}`),n.push(``);for(let r of e){let e=r.moduleName||t;r.address?(n.push(`// Hook: ${r.name} at ${r.address} in ${e}`),n.push(`Interceptor.attach(Module.findBaseAddress('${e}').add(${r.address}), {`)):(n.push(`// Hook: ${r.name} in ${e}`),n.push(`Interceptor.attach(Module.findExportByName('${e}', '${r.name}'), {`)),n.push(` onEnter(args) {`),n.push(` console.log('[${r.name}] called with args:', args[0], args[1]);`),n.push(` },`),n.push(` onLeave(retval) {`),n.push(` console.log('[${r.name}] returned:', retval);`),n.push(` }`),n.push(`});`),n.push(``)}return n.push(`console.log('Binary-to-JS hook script loaded for ${t}');`),n.join(`
2
2
  `)}function h(e,t,n){let r=[],i=[],a;if(n&&n.length>0){let e=new Set(n);a=t.functions.filter(t=>e.has(t.name))}else a=t.functions.filter(p);let o=m(a,t.moduleName);for(let n of a){let a=e.addBinarySymbol({moduleName:n.moduleName||t.moduleName,symbolName:n.name,address:n.address??`0x0`}),o=e.addNode(`breakpoint-hook`,`frida:${n.name}`,{domain:`binary-instrument`,hookType:`frida-interceptor`,functionName:n.name,moduleName:n.moduleName||t.moduleName});e.getGraph().addEdge(a.id,o.id,`binary-exports`,{domain:`cross-domain`,relation:`binary-to-frida-hook`}),r.push({binarySymbolNodeId:a.id,hookScriptNodeId:o.id,functionName:n.name}),i.push(n.name)}return{hookCount:a.length,generatedHookScript:o,injectedFunctions:i,evidenceGraphLinks:r}}function g(e){return typeof e==`object`&&!!e}function _(e){return Array.isArray(e)?e.filter(g):[]}function v(e,t=``){return typeof e==`string`?e:t}function y(e){return typeof e==`string`?e:void 0}function b(e,t=0){return typeof e==`number`?e:t}function x(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function S(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):void 0}function C(e){return g(e)?Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`number`)):{}}function w(e){return g(e)?{layers:Array.isArray(e.layers)?e.layers:[],drawCommands:Array.isArray(e.drawCommands)?e.drawCommands:[]}:{layers:[],drawCommands:[]}}function T(e){return _(e).map(e=>({objectId:v(e.objectId),className:v(e.className),name:v(e.name),stringProps:x(e.stringProps),numericProps:C(e.numericProps),colorProps:x(e.colorProps),urlProps:x(e.urlProps)}))}function E(e){return _(e).map(e=>({interface:v(e.interface),method:v(e.method),timestamp:b(e.timestamp),messageId:v(e.messageId)}))}function D(e){return _(e).map(e=>({eventType:v(e.eventType),timestamp:b(e.timestamp),url:y(e.url)}))}function O(e){return _(e).map(e=>({requestId:v(e.requestId),url:v(e.url),timestamp:b(e.timestamp)}))}function k(e){return _(e).map(e=>({pid:b(e.pid),tid:b(e.tid),syscallName:v(e.syscallName),timestamp:b(e.timestamp)}))}function A(e){return _(e).map(e=>({threadId:b(e.threadId),timestamp:b(e.timestamp),frames:_(e.frames).map(e=>({functionName:v(e.functionName)}))}))}function j(e){if(!g(e))return null;let t=v(e.moduleName);return t?{functions:_(e.functions).map(e=>({name:v(e.name),moduleName:v(e.moduleName),address:y(e.address),calledFrom:S(e.calledFrom)})),moduleName:t}:null}const M={WORKFLOW_REVERSE_OBFUSCATED:{id:`reverse-obfuscated-api`,displayName:`Reverse Obfuscated API`,steps:[{tool:`deobfuscate`,args:{targetUrl:"${input.targetUrl}"}},{tool:`js_heap_search`,args:{pattern:"${previous.cryptoKeys}"}},{tool:`network_enable`,args:{}},{tool:`tls_cert_pin_bypass`,args:{target:"${input.target}"}},{tool:`console_inject_fetch_interceptor`,args:{urls:["${input.apiEndpoint}"]}}]},WORKFLOW_GAME_CANVAS_SKIA:{id:`game-canvas-skia-v8`,displayName:`Game Canvas + SKIA + V8 Analysis`,steps:[{tool:`canvas_engine_fingerprint`,args:{canvasId:"${input.canvasId}"}},{tool:`canvas_scene_dump`,args:{canvasId:"${input.canvasId}"}},{tool:`skia_correlate_objects`,args:{skiaNodeIds:"${previous.nodeIds}"}},{tool:`performance_take_heap_snapshot`,args:{}},{tool:`js_heap_search`,args:{pattern:"${input.searchTerm}"}}]},WORKFLOW_BINARY_NATIVE_HOOK:{id:`binary-native-hook`,displayName:`Binary Analysis + Native Hook`,steps:[{tool:`ghidra_analyze`,args:{binaryPath:"${input.binaryPath}"}},{tool:`generate_hooks`,args:{symbols:"${previous.exportedSymbols}"}},{tool:`frida_attach`,args:{target:"${input.target}"}},{tool:`frida_run_script`,args:{script:"${previous.hookScript}"}}]}},N=[`analysis`,`browser`,`network`,`canvas`,`skia-capture`,`v8-inspector`,`mojo-ipc`,`syscall-hook`,`binary-instrument`,`boringssl-inspector`,`evidence`];var P=class{ctx;evidenceBridgeReady;constructor(e,t){this.ctx=e,this.evidenceBridgeReady=t}getCapabilities(){let e=this.getAvailableDomains(),t=N.filter(t=>!e.includes(t)),n=Object.entries(M).map(([e,t])=>{let n=this.evaluateWorkflow(t);return{workflowKey:e,id:t.id,displayName:t.displayName,stepCount:t.steps.length,...n}});return{availableDomains:e,missingDomains:t,supportedDomains:[...N],workflows:n}}suggestWorkflow(e,t){let n=e.toLowerCase(),r=Object.entries(M).map(([e,t])=>({workflowKey:e,workflow:t,keywordScore:this.scoreWorkflowGoal(n,e,t),evaluation:this.evaluateWorkflow(t)})),i=t?r.filter(e=>e.evaluation.missingDomains.length===0):r,a=i.length>0?i:r;a.sort((e,t)=>t.keywordScore===e.keywordScore?t.evaluation.coverage-e.evaluation.coverage:t.keywordScore-e.keywordScore);let o=a[0];if(!o)throw Error(`No workflow definitions are available for cross-domain suggestion`);let s=this.describeWorkflowReason(n,o.evaluation);return{workflowKey:o.workflowKey,id:o.workflow.id,displayName:o.workflow.displayName,reason:s,...o.evaluation}}getHealth(){let e=this.getAvailableDomains();return{evidenceBridgeReady:this.evidenceBridgeReady,orchestratorReady:!0,availableDomains:e,missingDomains:N.filter(t=>!e.includes(t))}}getAvailableDomains(){let e=this.ctx.enabledDomains.size>0?this.ctx.enabledDomains:this.ctx.resolveEnabledDomains(this.ctx.selectedTools),t=[];for(let n of N)e.has(n)&&t.push(n);return t}evaluateWorkflow(e){let t=new Set;for(let n of e.steps)for(let e of this.inferDomainsForTool(n.tool))t.add(e);let n=[...t],r=this.getAvailableDomains().filter(e=>t.has(e));return{requiredDomains:n,availableDomains:r,missingDomains:n.filter(e=>!r.includes(e)),coverage:n.length===0?1:r.length/n.length}}inferDomainsForTool(e){return e.startsWith(`deobfuscate`)||e.startsWith(`advanced_deobfuscate`)?[`analysis`]:e.startsWith(`js_heap`)||e.startsWith(`performance_take_heap_snapshot`)?[`v8-inspector`]:e.startsWith(`network_`)?[`network`]:e.startsWith(`console_`)?[`browser`]:e.startsWith(`tls_`)||e.startsWith(`net_raw_`)?[`boringssl-inspector`]:e.startsWith(`canvas_`)?[`canvas`]:e.startsWith(`skia_`)?[`skia-capture`]:e.startsWith(`v8_`)?[`v8-inspector`]:e.startsWith(`mojo_`)?[`mojo-ipc`]:e.startsWith(`syscall_`)?[`syscall-hook`]:e.startsWith(`adb_`)?[`adb-bridge`]:e.startsWith(`ghidra_`)||e.startsWith(`frida_`)||e.startsWith(`generate_hooks`)||e.startsWith(`unidbg_`)||e.startsWith(`export_hook_script`)?[`binary-instrument`]:e.startsWith(`extension_`)||e===`webhook`?[`extension-registry`]:e.startsWith(`cross_domain_`)?[`cross-domain`]:e.startsWith(`evidence_`)?[`evidence`]:e.startsWith(`boringssl_`)?[`boringssl-inspector`]:[]}scoreWorkflowGoal(e,t,n){let r=0;return t===`WORKFLOW_REVERSE_OBFUSCATED`&&((e.includes(`obfus`)||e.includes(`api`))&&(r+=3),(e.includes(`tls`)||e.includes(`pin`))&&(r+=2)),t===`WORKFLOW_GAME_CANVAS_SKIA`&&((e.includes(`canvas`)||e.includes(`game`))&&(r+=3),(e.includes(`skia`)||e.includes(`scene`))&&(r+=2)),t===`WORKFLOW_BINARY_NATIVE_HOOK`&&((e.includes(`binary`)||e.includes(`native`))&&(r+=3),(e.includes(`hook`)||e.includes(`frida`))&&(r+=2)),r===0&&n.displayName.toLowerCase().includes(e)&&(r+=1),r}describeWorkflowReason(e,t){return t.missingDomains.length===0?`Matched goal "${e}" and all required domains are enabled.`:`Matched goal "${e}" with ${Math.round(t.coverage*100)}% domain coverage. Missing: ${t.missingDomains.join(`, `)}.`}},F=class{evidenceBridge;workflowClassifier;constructor(e,t){this.evidenceBridge=e,this.workflowClassifier=t}async handleCapabilities(t){let n={evidenceGraphAvailable:!0,workflowClassifierAvailable:this.workflowClassifier!==void 0};return this.workflowClassifier?e({capabilities:n,...this.workflowClassifier.getCapabilities()}):e({capabilities:n})}async handleSuggestWorkflow(r){let i=t(r,`query`,``)||t(r,`goal`,``),a=n(r,`preferAvailableOnly`,!0);return this.workflowClassifier&&i?e(this.workflowClassifier.suggestWorkflow(i,a)):e({message:`Cross-domain workflow suggestion requires a classifier and query.`})}async handleHealth(){let t=this.evidenceBridge.getStats();return this.workflowClassifier?e({...this.workflowClassifier.getHealth(),evidenceGraph:t}):e({evidenceBridgeReady:!0,orchestratorReady:!1,evidenceGraph:t})}async handleCorrelateAll(t){let n=[],r={};try{let e=w(t.sceneTree),n=T(t.jsObjects);r.skia=o(this.evidenceBridge,{sceneTree:e,jsObjects:n})}catch(e){n.push(`SKIA-03: ${e instanceof Error?e.message:String(e)}`)}try{let e=E(t.mojoMessages),n=D(t.cdpEvents),i=O(t.networkRequests);r.mojo=c(this.evidenceBridge,e,n,i)}catch(e){n.push(`MOJO-03: ${e instanceof Error?e.message:String(e)}`)}try{let e=k(t.syscallEvents),n=A(t.jsStacks);r.syscall=d(this.evidenceBridge,e,n)}catch(e){n.push(`SYSCALL-02: ${e instanceof Error?e.message:String(e)}`)}try{let e=j(t.ghidraOutput);e&&(r.binary=h(this.evidenceBridge,e))}catch(e){n.push(`BIN-04: ${e instanceof Error?e.message:String(e)}`)}let i=this.evidenceBridge.exportGraph();return e({correlationResults:{...r,errors:n},evidenceGraph:i})}async handleEvidenceExport(){return e(this.evidenceBridge.exportGraph())}async handleEvidenceStats(){return e(this.evidenceBridge.getStats())}};export{F as CrossDomainHandlers,P as CrossDomainWorkflowClassifier};
@@ -1,4 +1,4 @@
1
- import{Cn as e,Sn as t,xn as n}from"./constants-Cp6hBrrx.mjs";import{randomUUID as r}from"node:crypto";const i=n,a=e*1024*1024;let o=null;function s(){return o||=import(`quickjs-emscripten`).then(e=>e.getQuickJS()),o}function c(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=c(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=c(e,i);e.setProp(n,r,t),t.dispose()}return n}default:return e.newString(String(t))}}function l(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 u=class{bridge=null;setBridge(e){this.bridge=e}async execute(e,t={}){let n=t.timeoutMs??i,r=t.memoryLimitBytes??a,o=(await s()).newRuntime();o.setMemoryLimit(r);let c=Date.now(),u=!1;o.setInterruptHandler(()=>Date.now()-c>n?(u=!0,!0):!1);let d=o.newContext(),f=[];try{this.injectConsole(d,f),this.injectHelpers(d),this.bridge&&this.injectBridge(d,this.bridge,f),t.globals&&this.injectGlobals(d,t.globals);let n=d.evalCode(e,`sandbox-eval.js`);if(n.error){let e=d.dump(n.error);return n.error.dispose(),u?{ok:!1,error:`Execution timed out`,timedOut:!0,durationMs:Date.now()-c,logs:f}:{ok:!1,error:typeof e==`object`?JSON.stringify(e):String(e),timedOut:!1,durationMs:Date.now()-c,logs:f}}let r=l(d,n.value);return n.value.dispose(),{ok:!0,output:r,timedOut:!1,durationMs:Date.now()-c,logs:f}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e),timedOut:u,durationMs:Date.now()-c,logs:f}}finally{d.dispose(),o.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??i,o=n.memoryLimitBytes??a,c=(await s()).newRuntime();c.setMemoryLimit(o);let u=Date.now(),d=!1;c.setInterruptHandler(()=>Date.now()-u>r?(d=!0,!0):!1);let f=c.newContext(),p=[];try{this.injectConsole(f,p),this.injectHelpers(f),this.injectBridgeForOrchestration(f,t,p),n.globals&&this.injectGlobals(f,n.globals);let r=f.evalCode(e,`sandbox-eval.js`);if(r.error){let e=f.dump(r.error);return r.error.dispose(),d?{ok:!1,error:`Execution timed out`,timedOut:!0,durationMs:Date.now()-u,logs:p}:{ok:!1,error:typeof e==`object`?JSON.stringify(e):String(e),timedOut:!1,durationMs:Date.now()-u,logs:p}}let i=l(f,r.value);return r.value.dispose(),{ok:!0,output:i,timedOut:!1,durationMs:Date.now()-u,logs:p}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e),timedOut:d,durationMs:Date.now()-u,logs:p}}finally{f.dispose(),c.dispose()}}injectConsole(e,t){let n=e.newObject(),r=e.newFunction(`log`,(...n)=>{let r=n.map(t=>{let n=l(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=c(e,r);e.setProp(e.global,n,t),t.dispose()}}injectHelpers(e){let t=e.evalCode(`
1
+ import{Hn as e,Un as t,Wn as n}from"./constants-BYj8Xek8.mjs";import{randomUUID as r}from"node:crypto";const i=e,a=n*1024*1024;let o=null;function s(){return o||=import(`quickjs-emscripten`).then(e=>e.getQuickJS()),o}function c(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=c(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=c(e,i);e.setProp(n,r,t),t.dispose()}return n}default:return e.newString(String(t))}}function l(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 u=class{bridge=null;setBridge(e){this.bridge=e}async execute(e,t={}){let n=t.timeoutMs??i,r=t.memoryLimitBytes??a,o=(await s()).newRuntime();o.setMemoryLimit(r);let c=Date.now(),u=!1;o.setInterruptHandler(()=>Date.now()-c>n?(u=!0,!0):!1);let d=o.newContext(),f=[];try{this.injectConsole(d,f),this.injectHelpers(d),this.bridge&&this.injectBridge(d,this.bridge,f),t.globals&&this.injectGlobals(d,t.globals);let n=d.evalCode(e,`sandbox-eval.js`);if(n.error){let e=d.dump(n.error);return n.error.dispose(),u?{ok:!1,error:`Execution timed out`,timedOut:!0,durationMs:Date.now()-c,logs:f}:{ok:!1,error:typeof e==`object`?JSON.stringify(e):String(e),timedOut:!1,durationMs:Date.now()-c,logs:f}}let r=l(d,n.value);return n.value.dispose(),{ok:!0,output:r,timedOut:!1,durationMs:Date.now()-c,logs:f}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e),timedOut:u,durationMs:Date.now()-c,logs:f}}finally{d.dispose(),o.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??i,o=n.memoryLimitBytes??a,c=(await s()).newRuntime();c.setMemoryLimit(o);let u=Date.now(),d=!1;c.setInterruptHandler(()=>Date.now()-u>r?(d=!0,!0):!1);let f=c.newContext(),p=[];try{this.injectConsole(f,p),this.injectHelpers(f),this.injectBridgeForOrchestration(f,t,p),n.globals&&this.injectGlobals(f,n.globals);let r=f.evalCode(e,`sandbox-eval.js`);if(r.error){let e=f.dump(r.error);return r.error.dispose(),d?{ok:!1,error:`Execution timed out`,timedOut:!0,durationMs:Date.now()-u,logs:p}:{ok:!1,error:typeof e==`object`?JSON.stringify(e):String(e),timedOut:!1,durationMs:Date.now()-u,logs:p}}let i=l(f,r.value);return r.value.dispose(),{ok:!0,output:i,timedOut:!1,durationMs:Date.now()-u,logs:p}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e),timedOut:d,durationMs:Date.now()-u,logs:p}}finally{f.dispose(),c.dispose()}}injectConsole(e,t){let n=e.newObject(),r=e.newFunction(`log`,(...n)=>{let r=n.map(t=>{let n=l(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=c(e,r);e.setProp(e.global,n,t),t.dispose()}}injectHelpers(e){let t=e.evalCode(`
2
2
  (function() {
3
3
  var helpers = {};
4
4
 
@@ -1,4 +1,4 @@
1
- import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Cuk7-xUt.mjs";function n(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
1
+ import{n as e}from"./response-C7rKQst4.mjs";import{r as t}from"./parse-args-Bw413PlW.mjs";function n(e){let t=e.maxDepth??20,n=e.onlyInteractive??!1;return`(function() {
2
2
  function getChildren(node) {
3
3
  if (!node) return [];
4
4
  // v3 uses node.children, v2 uses node._children
@@ -0,0 +1 @@
1
+ import{an as e}from"./constants-BYj8Xek8.mjs";import{n as t}from"./ResponseBuilder-BfWP-uaT.mjs";import{t as n}from"./renderer-pid-9tJnZ_9N.mjs";var r=class{sessionManager;constructor(e){this.sessionManager=e}async handleScanList(e){return t(async()=>{let e=this.sessionManager.listSessions();return{sessions:e,count:e.length}})}async handleScanDelete(e){return t(async()=>({deleted:this.sessionManager.deleteSession(e.sessionId)}))}async handleScanExport(e){return t(async()=>({exportedData:this.sessionManager.exportSession(e.sessionId)}))}};async function i(e,t,r){return await n(e,t,r)}function a(t){return t===void 0||!Number.isFinite(t)||t<=0?e:Math.min(t,e)}var o=class{scanner;eventBus;processManager;ctx;constructor(e,t,n,r){this.scanner=e,this.eventBus=t,this.processManager=n,this.ctx=r}async resolvePid(e){return this.processManager?await i(e,this.processManager,this.ctx):e}async handleFirstScan(e){return t(async()=>{let t=await this.resolvePid(e.pid),n={valueType:e.valueType,alignment:e.alignment,maxResults:a(e.maxResults),regionFilter:e.regionFilter,onProgress:e.onProgress},r=await this.scanner.firstScan(t,e.value,n);return this.eventBus?.emit(`memory:scan_completed`,{scanType:`first`,resultCount:r.totalMatches??0,timestamp:new Date().toISOString()}),{...r,hint:r.totalMatches>0?`Found ${r.totalMatches} matches. Use memory_next_scan with sessionId "${r.sessionId}" to narrow down.`:`No matches found. Try a different value or type.`}})}async handleNextScan(e){return t(async()=>{let t=await this.scanner.nextScan(e.sessionId,e.mode,e.value,e.value2);return{...t,hint:t.totalMatches<=10?`Few matches remaining — inspect these addresses.`:`${t.totalMatches} matches remain. Continue narrowing with memory_next_scan.`}})}async handleUnknownScan(e){return t(async()=>{let t=await this.resolvePid(e.pid),n={valueType:e.valueType,alignment:e.alignment,maxResults:a(e.maxResults),regionFilter:e.regionFilter,onProgress:e.onProgress},r=await this.scanner.unknownInitialScan(t,n);return{...r,hint:`Captured ${r.totalMatches} addresses. Use memory_next_scan with changed/unchanged/increased/decreased to narrow.`}})}async handlePointerScan(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.scanner.pointerScan(t,e.targetAddress,{maxResults:a(e.maxResults),moduleOnly:e.moduleOnly})}})}async handleGroupScan(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.scanner.groupScan(t,e.pattern,{alignment:e.alignment,maxResults:a(e.maxResults)})}})}},s=class{ptrEngine;processManager;ctx;constructor(e,t,n){this.ptrEngine=e,this.processManager=t,this.ctx=n}async resolvePid(e){return this.processManager?await i(e,this.processManager,this.ctx):e}async handlePointerChainScan(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.ptrEngine.scan(t,e.targetAddress,{maxDepth:e.maxDepth,maxOffset:e.maxOffset,staticOnly:e.staticOnly,modules:e.modules,maxResults:e.maxResults});return{...n,hint:n.totalFound>0?`Found ${n.totalFound} pointer chains. Static chains survive process restarts.`:`No pointer chains found. Try increasing maxDepth or maxOffset.`}})}async handlePointerChainValidate(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=JSON.parse(e.chains),r=await this.ptrEngine.validateChains(t,n);return{results:r,validCount:r.filter(e=>e.isValid).length,totalChecked:n.length}})}async handlePointerChainResolve(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=JSON.parse(e.chain),r=await this.ptrEngine.resolveChain(t,n);return{chainId:n.id,resolvedAddress:r,isResolvable:r!==null}})}async handlePointerChainExport(e){return t(async()=>{let t=JSON.parse(e.chains);return{exportedData:this.ptrEngine.exportChains(t),chainCount:t.length}})}};const c={int8_t:`int8`,uint8_t:`uint8`,int16_t:`int16`,uint16_t:`uint16`,int32_t:`int32`,uint32_t:`uint32`,int64_t:`int64`,uint64_t:`uint64`,void_ptr:`pointer`,char_ptr:`string_ptr`};function l(e){if(typeof e!=`string`||e.length===0)return`unknown`;let t=e.toLowerCase().replace(/\s+/g,`_`).replace(/\*/g,`_ptr`);return c[t]??t}function u(e){if(!e||typeof e!=`object`)throw Error(`structure must be a JSON object`);let t=e,n=(Array.isArray(t.fields)?t.fields:[]).map((e,t)=>{let n=e;return{offset:typeof n.offset==`number`?n.offset:0,size:typeof n.size==`number`?n.size:1,type:l(n.type),name:typeof n.name==`string`&&n.name.length>0?n.name:`field_${t}`,value:typeof n.value==`string`?n.value:``,confidence:typeof n.confidence==`number`?n.confidence:1,notes:typeof n.notes==`string`?n.notes:void 0}}),r=n.reduce((e,t)=>Math.max(e,t.offset+t.size),0),i=typeof t.totalSize==`number`?t.totalSize:typeof t.size==`number`?t.size:r;return{baseAddress:typeof t.baseAddress==`string`?t.baseAddress:`0x0`,totalSize:i,fields:n,vtableAddress:typeof t.vtableAddress==`string`?t.vtableAddress:void 0,className:typeof t.className==`string`?t.className:void 0,baseClasses:Array.isArray(t.baseClasses)?t.baseClasses.filter(e=>typeof e==`string`):void 0,timestamp:typeof t.timestamp==`number`?t.timestamp:Date.now()}}var d=class{structAnalyzer;processManager;ctx;constructor(e,t,n){this.structAnalyzer=e,this.processManager=t,this.ctx=n}async resolvePid(e){return this.processManager?await i(e,this.processManager,this.ctx):e}async handleStructureAnalyze(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.structAnalyzer.analyzeStructure(t,e.address,{size:e.size,otherInstances:e.otherInstances,parseRtti:e.parseRtti});return{...n,hint:n.className?`Detected class: ${n.className}${n.baseClasses?.length?` (inherits: ${n.baseClasses.join(` → `)})`:``}`:`Inferred ${n.fields.length} fields. Use memory_structure_export_c to export as C struct.`}})}async handleVtableParse(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.structAnalyzer.parseVtable(t,e.vtableAddress)}})}async handleStructureExportC(e){return t(async()=>{let t=u(JSON.parse(e.structure));return{...this.structAnalyzer.exportToCStruct(t,e.name)}})}async handleStructureCompare(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.structAnalyzer.compareInstances(t,e.address1,e.address2,e.size);return{matchingFieldCount:n.matching.length,differingFieldCount:n.differing.length,...n}})}},f=class{bpEngine;injector;processManager;ctx;constructor(e,t,n,r){this.bpEngine=e,this.injector=t,this.processManager=n,this.ctx=r}async resolvePid(e){return this.processManager?await i(e,this.processManager,this.ctx):e}async handleBreakpointSet(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.bpEngine.setBreakpoint(t,e.address,e.access,e.size??4),hint:`Hardware breakpoint set on DR register. Use memory_breakpoint with action='trace' to collect hits.`}})}async handleBreakpointRemove(e){return t(async()=>({removed:await this.bpEngine.removeBreakpoint(e.breakpointId)}))}async handleBreakpointList(e){return t(async()=>{let e=this.bpEngine.listBreakpoints();return{breakpoints:e,count:e.length}})}async handleBreakpointTrace(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.bpEngine.traceAccess(t,e.address,e.access,e.maxHits,e.timeoutMs);return{hits:n,hitCount:n.length,hint:n.length>0?`${n.length} accesses captured. Check instructionAddress to find the code accessing this address.`:`No hits captured within timeout.`}})}async handlePatchBytes(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.injector.patchBytes(t,e.address,e.bytes);return{...n,hint:`Patch applied. Use memory_patch_undo with patchId "${n.id}" to restore.`}})}async handlePatchNop(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.injector.nopBytes(t,e.address,e.count),hint:`${e.count} bytes NOP'd. Use memory_patch_undo to restore.`}})}async handlePatchUndo(e){return t(async()=>({restored:await this.injector.unpatch(e.patchId)}))}async handleCodeCaves(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.injector.findCodeCaves(t,e.minSize);return{caves:n,count:n.length}})}},p=class{memCtrl;processManager;ctx;constructor(e,t,n){this.memCtrl=e,this.processManager=t,this.ctx=n}async resolvePid(e){return this.processManager?await i(e,this.processManager,this.ctx):e}async handleWriteValue(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.memCtrl.writeValue(t,e.address,e.value,e.valueType),hint:`Use memory_write_history with action='undo' to revert.`}})}async handleFreeze(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.memCtrl.freeze(t,e.address,e.value,e.valueType,e.intervalMs);return{...n,hint:`Frozen. Use memory_freeze with action="unfreeze" and freezeId "${n.id}" to stop.`}})}async handleUnfreeze(e){return t(async()=>({unfrozen:await this.memCtrl.unfreeze(e.freezeId)}))}async handleDump(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{dump:await this.memCtrl.dumpMemoryHex(t,e.address,e.size??256)}})}async handleWriteUndo(e){return t(async()=>{let e=await this.memCtrl.undo();return{undone:e!==null,entry:e}})}async handleWriteRedo(e){return t(async()=>{let e=await this.memCtrl.redo();return{redone:e!==null,entry:e}})}},m=class{speedhackEngine;heapAnalyzer;peAnalyzer;antiCheatDetector;processManager;ctx;constructor(e,t,n,r,i,a){this.speedhackEngine=e,this.heapAnalyzer=t,this.peAnalyzer=n,this.antiCheatDetector=r,this.processManager=i,this.ctx=a}async resolvePid(e){return this.processManager?await i(e,this.processManager,this.ctx):e}async handleSpeedhackApply(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.speedhackEngine.apply(t,e.speed),hint:`Speedhack active (${e.speed}x). Use memory_speedhack({ action: 'set' }) to adjust.`}})}async handleSpeedhackSet(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{updated:await this.speedhackEngine.setSpeed(t,e.speed),newSpeed:e.speed}})}async handleHeapEnumerate(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.heapAnalyzer.enumerateHeaps(t);return{...n,hint:`Enumerated ${n.heaps.length} heaps. Use memory_heap_stats for statistics or memory_heap_anomalies to check for issues.`}})}async handleHeapStats(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.heapAnalyzer.getStats(t)}})}async handleHeapAnomalies(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.heapAnalyzer.detectAnomalies(t);return{anomalies:n,count:n.length,hint:n.length>0?`Found ${n.length} anomalies — inspect types for spray, UAF, or suspicious patterns.`:`No heap anomalies detected.`}})}async handlePEHeaders(e){return t(async()=>{let t=await this.resolvePid(e.pid);return{...await this.peAnalyzer.parseHeaders(t,e.moduleBase)}})}async handlePEImportsExports(e){return t(async()=>{let t=e.table||`both`,n=e.moduleBase,r=await this.resolvePid(e.pid),i={};return(t===`imports`||t===`both`)&&(i.imports=await this.peAnalyzer.parseImports(r,n)),(t===`exports`||t===`both`)&&(i.exports=await this.peAnalyzer.parseExports(r,n)),i})}async handleInlineHookDetect(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.peAnalyzer.detectInlineHooks(t,e.moduleName);return{hooks:n,count:n.length,hint:n.length>0?`Detected ${n.length} inline hooks — check hookType and jumpTarget for each.`:`No inline hooks detected — exports match disk bytes.`}})}async handleAntiCheatDetect(e){return t(async()=>{let t=await this.resolvePid(e.pid),n=await this.antiCheatDetector.detect(t);return{detections:n,count:n.length,hint:n.length>0?`Found ${n.length} anti-debug mechanisms. Each includes a bypassSuggestion.`:`No anti-debug mechanisms detected in imports.`}})}async handleGuardPages(e){return t(async()=>{let t=await this.resolvePid(e.pid),{guardPages:n,stats:r}=await this.antiCheatDetector.scanGuardPages(t);return{guardPages:n,count:n.length,scan:r,hint:r.truncated?`Scan stopped after ${r.scannedRegions} regions in ${r.durationMs}ms to avoid hanging. Results may be partial.`:n.length>0?`Found ${n.length} guard page regions — these may indicate anti-tampering.`:`No guard pages found.`}})}async handleIntegrityCheck(e){return t(async()=>{let t=await this.resolvePid(e.pid),{sections:n,stats:r}=await this.antiCheatDetector.scanIntegrity(t,e.moduleName),i=n.filter(e=>e.isModified);return{sections:n,totalChecked:n.length,modifiedCount:i.length,scan:r,hint:r.truncated?`Checked ${r.scannedSections} executable section(s) across ${r.scannedModules} module(s) before hitting safety limits. Results may be partial.`:i.length>0?`${i.length} section(s) modified — code may have been patched or hooked.`:`All checked sections match disk — no runtime modifications detected.`}})}},h=class{sessions;scans;ptrChains;structures;hooks;readwrite;integrity;constructor(e,t,n,i,a,c,l,u,h,g,_,v,y,b){this.sessions=new r(t),this.scans=new o(e,v,y,b),this.ptrChains=new s(n,y,b),this.structures=new d(i,y,b),this.hooks=new f(a,c,y,b),this.readwrite=new p(l,y,b),this.integrity=new m(u,h,g,_,y,b)}handleScanSessionDispatch(e){switch(String(e.action??``)){case`delete`:return this.sessions.handleScanDelete(e);case`export`:return this.sessions.handleScanExport(e);default:return this.sessions.handleScanList(e)}}handleScanList=e=>this.sessions.handleScanList(e);handleScanDelete=e=>this.sessions.handleScanDelete(e);handleScanExport=e=>this.sessions.handleScanExport(e);handleFirstScan=e=>this.scans.handleFirstScan(e);handleNextScan=e=>this.scans.handleNextScan(e);handleUnknownScan=e=>this.scans.handleUnknownScan(e);handlePointerScan=e=>this.scans.handlePointerScan(e);handleGroupScan=e=>this.scans.handleGroupScan(e);handlePointerChainDispatch(e){switch(String(e.action??``)){case`validate`:return this.ptrChains.handlePointerChainValidate(e);case`resolve`:return this.ptrChains.handlePointerChainResolve(e);case`export`:return this.ptrChains.handlePointerChainExport(e);default:return this.ptrChains.handlePointerChainScan(e)}}handlePointerChainScan=e=>this.ptrChains.handlePointerChainScan(e);handlePointerChainValidate=e=>this.ptrChains.handlePointerChainValidate(e);handlePointerChainResolve=e=>this.ptrChains.handlePointerChainResolve(e);handlePointerChainExport=e=>this.ptrChains.handlePointerChainExport(e);handleStructureAnalyze=e=>this.structures.handleStructureAnalyze(e);handleVtableParse=e=>this.structures.handleVtableParse(e);handleStructureExportC=e=>this.structures.handleStructureExportC(e);handleStructureCompare=e=>this.structures.handleStructureCompare(e);handleBreakpointDispatch(e){switch(String(e.action??``)){case`remove`:return this.hooks.handleBreakpointRemove(e);case`list`:return this.hooks.handleBreakpointList(e);case`trace`:return this.hooks.handleBreakpointTrace(e);default:return this.hooks.handleBreakpointSet(e)}}handleBreakpointSet=e=>this.hooks.handleBreakpointSet(e);handleBreakpointRemove=e=>this.hooks.handleBreakpointRemove(e);handleBreakpointList=e=>this.hooks.handleBreakpointList(e);handleBreakpointTrace=e=>this.hooks.handleBreakpointTrace(e);handlePatchBytes=e=>this.hooks.handlePatchBytes(e);handlePatchNop=e=>this.hooks.handlePatchNop(e);handlePatchUndo=e=>this.hooks.handlePatchUndo(e);handleCodeCaves=e=>this.hooks.handleCodeCaves(e);handleFreezeDispatch(e){return String(e.action??``)===`unfreeze`?this.readwrite.handleUnfreeze(e):this.readwrite.handleFreeze(e)}handleWriteHistoryDispatch(e){return String(e.action??``)===`redo`?this.readwrite.handleWriteRedo(e):this.readwrite.handleWriteUndo(e)}handleWriteValue=e=>this.readwrite.handleWriteValue(e);handleFreeze=e=>this.readwrite.handleFreeze(e);handleUnfreeze=e=>this.readwrite.handleUnfreeze(e);handleDump=e=>this.readwrite.handleDump(e);handleWriteUndo=e=>this.readwrite.handleWriteUndo(e);handleWriteRedo=e=>this.readwrite.handleWriteRedo(e);handleSpeedhackDispatch(e){return String(e.action??``)===`set`?this.integrity.handleSpeedhackSet(e):this.integrity.handleSpeedhackApply(e)}handleSpeedhackApply=e=>this.integrity.handleSpeedhackApply(e);handleSpeedhackSet=e=>this.integrity.handleSpeedhackSet(e);handleHeapEnumerate=e=>this.integrity.handleHeapEnumerate(e);handleHeapStats=e=>this.integrity.handleHeapStats(e);handleHeapAnomalies=e=>this.integrity.handleHeapAnomalies(e);handlePEHeaders=e=>this.integrity.handlePEHeaders(e);handlePEImportsExports=e=>this.integrity.handlePEImportsExports(e);handleInlineHookDetect=e=>this.integrity.handleInlineHookDetect(e);handleAntiCheatDetect=e=>this.integrity.handleAntiCheatDetect(e);handleGuardPages=e=>this.integrity.handleGuardPages(e);handleIntegrityCheck=e=>this.integrity.handleIntegrityCheck(e)};export{h as MemoryScanHandlers};
@@ -1,4 +1,4 @@
1
- import{t as e}from"./logger-sBC6IdRT.mjs";import{a as t,o as n,s as r,t as i}from"./parse-args-Cuk7-xUt.mjs";import{o as a,s as o}from"./PageController-D9jVkH0i.mjs";import"./definitions-CCP9gphV.mjs";var s=class{pageController;injectedHooks=new Map;constructor(e){this.pageController=e}hasAttachedTargetSession(){return this.pageController.hasAttachedTargetSession()}async evaluateInAttachedTarget(e){return await this.pageController.evaluateAttachedTarget(e,{returnByValue:!0,awaitPromise:!0})}async addScriptToAttachedTarget(e){await this.pageController.addScriptToAttachedTarget(e)}async handleAIHookInject(n){try{let i=r(n,`hookId`),s=r(n,`code`),c=t(n,`method`,`evaluate`);if(this.hasAttachedTargetSession())c===`evaluateOnNewDocument`?(await this.addScriptToAttachedTarget(s),e.info(`Hook injected into attached target (evaluateOnNewDocument): ${i}`)):(await this.evaluateInAttachedTarget(s),e.info(`Hook injected into attached target (evaluate): ${i}`));else{let t=await this.pageController.getPage();c===`evaluateOnNewDocument`?(await a(t,s),e.info(`Hook injected (evaluateOnNewDocument): ${i}`)):(await o(t,s),e.info(`Hook injected (evaluate): ${i}`))}return this.injectedHooks.set(i,{code:s,injectionTime:Date.now()}),{content:[{type:`text`,text:JSON.stringify({success:!0,hookId:i,message:`Hook (: ${c})`,injectionTime:new Date().toISOString()},null,2)}]}}catch(t){return e.error(`Hook injection failed`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookGetData(t){try{let e=r(t,`hookId`),n=this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
1
+ import{t as e}from"./logger-sBC6IdRT.mjs";import{a as t,o as n,s as r,t as i}from"./parse-args-Bw413PlW.mjs";import{o as a,s as o}from"./PageController-Dfsm1_o7.mjs";import"./definitions-OeLvmlQy.mjs";var s=class{pageController;injectedHooks=new Map;constructor(e){this.pageController=e}hasAttachedTargetSession(){return this.pageController.hasAttachedTargetSession()}async evaluateInAttachedTarget(e){return await this.pageController.evaluateAttachedTarget(e,{returnByValue:!0,awaitPromise:!0})}async addPersistentScriptToManagedTargets(e,t){await this.pageController.addScriptToPageEvaluateOnNewDocument(t,{id:`ai-hook:${e}`}),await this.pageController.addPersistentScriptToManagedTargets(t,{id:`ai-hook:${e}`,evaluateNow:!0,targetTypes:[`page`,`iframe`]})}async handleAIHookInject(n){try{let i=r(n,`hookId`),s=r(n,`code`),c=t(n,`method`,`evaluate`);if(this.hasAttachedTargetSession())c===`evaluateOnNewDocument`?(await this.addPersistentScriptToManagedTargets(i,s),e.info(`Hook injected into attached target (evaluateOnNewDocument): ${i}`)):(await this.evaluateInAttachedTarget(s),e.info(`Hook injected into attached target (evaluate): ${i}`));else{let t=await this.pageController.getPage();c===`evaluateOnNewDocument`?(await a(t,s),e.info(`Hook injected (evaluateOnNewDocument): ${i}`)):(await o(t,s),e.info(`Hook injected (evaluate): ${i}`))}return this.injectedHooks.set(i,{code:s,injectionTime:Date.now()}),{content:[{type:`text`,text:JSON.stringify({success:!0,hookId:i,message:`Hook (: ${c})`,injectionTime:new Date().toISOString()},null,2)}]}}catch(t){return e.error(`Hook injection failed`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookGetData(t){try{let e=r(t,`hookId`),n=this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
2
2
  const hookId = ${JSON.stringify(e)};
3
3
  const hooks = globalThis.__aiHooks;
4
4
  if (!hooks?.[hookId]) {
package/dist/index.mjs CHANGED
@@ -1,26 +1,22 @@
1
1
  #!/usr/bin/env node
2
- import{t as e}from"./logger-sBC6IdRT.mjs";import{$t as t,Ct as n,M as r,St as i,a,bn as o,bt as s,dt as c,en as l,gr as u,h as d,i as f,j as p,m,n as h,nn as g,p as _,r as v,t as y,tn as b,ut as x,wt as S,xt as C,yn as w}from"./constants-Cp6hBrrx.mjs";import{a as T,i as ee,n as te,r as ne,t as re}from"./artifactRetention-NBdncOEW.mjs";import{t as ie}from"./DetailedDataManager-BniBJlVv.mjs";import{r as E,t as ae}from"./response-C7rKQst4.mjs";import{a as oe,c as se,f as ce,h as le,i as ue,l as de,m as fe,n as pe,o as me,r as D,u as he}from"./ToolCatalog-D_IKl1Hu.mjs";import{t as O}from"./ToolError-DWU_z7gp.mjs";import{a as ge,c as _e,i as k,l as ve,n as A,o as j,r as ye,s as be,u as xe}from"./MCPServer.search.handlers.domain-DVbWL1bT.mjs";import{t as Se}from"./ProcessRegistry-Hf12LlR9.mjs";import{i as Ce,n as we,r as Te}from"./ExtensionManager-erMpqcLk.mjs";import{_ as Ee,a as De,b as Oe,c as ke,d as Ae,f as M,g as je,h as Me,i as Ne,l as Pe,m as N,n as Fe,o as Ie,p as P,r as Le,s as Re,t as ze,u as Be,v as F,x as Ve,y as He}from"./ToolRouter.policy-CFHoN_Lw.mjs";import{i as Ue,r as We}from"./HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs";import{n as Ge}from"./EventBus-DgciURGg.mjs";import{d as Ke,l as qe}from"./outputPaths-BonGThuc.mjs";import{McpServer as Je,ResourceTemplate as Ye}from"@modelcontextprotocol/sdk/server/mcp.js";import{CompleteRequestSchema as Xe,ErrorCode as I,McpError as L}from"@modelcontextprotocol/sdk/types.js";import{promises as R}from"fs";import{join as Ze}from"path";import{createHash as Qe}from"crypto";import{createServer as $e}from"node:http";import{randomUUID as et,timingSafeEqual as tt}from"node:crypto";import{StdioServerTransport as nt}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as rt}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{ZodError as it,z}from"zod";import{readFileSync as at}from"node:fs";import{dirname as ot,resolve as st}from"node:path";import{fileURLToPath as ct}from"node:url";import{mkdir as lt,readFile as ut,rename as dt,writeFile as ft}from"node:fs/promises";var pt=class{config;constructor(e){this.config=e}async init(){if(this.config.enabled)try{await R.mkdir(this.config.dir,{recursive:!0}),e.debug(`Cache directory initialized: ${this.config.dir}`)}catch(t){e.error(`Failed to initialize cache directory`,t)}}generateKey(e){return Qe(`md5`).update(e).digest(`hex`)}getCachePath(e){let t=this.generateKey(e);return Ze(this.config.dir,`${t}.json`)}async get(t){if(!this.config.enabled)return null;try{let n=this.getCachePath(t),r=await R.readFile(n,`utf-8`),i=JSON.parse(r);return Date.now()-i.timestamp>this.config.ttl*1e3?(await this.delete(t),null):(e.debug(`Cache hit: ${t}`),i.value)}catch{return e.debug(`Cache miss: ${t}`),null}}async set(t,n){if(this.config.enabled)try{let r=this.getCachePath(t),i={timestamp:Date.now(),value:n};await R.writeFile(r,JSON.stringify(i),`utf-8`),e.debug(`Cache set: ${t}`)}catch(t){e.error(`Failed to set cache`,t)}}async delete(t){if(this.config.enabled)try{let n=this.getCachePath(t);await R.unlink(n),e.debug(`Cache deleted: ${t}`)}catch(t){t.code!==`ENOENT`&&e.warn(`Cache delete failed:`,t)}}async clear(){if(this.config.enabled)try{let t=await R.readdir(this.config.dir);await Promise.all(t.map(e=>R.unlink(Ze(this.config.dir,e)))),e.info(`Cache cleared`)}catch(t){if(t.code===`ENOENT`)return;e.error(`Failed to clear cache`,t)}}},mt=class{mcpServer;constructor(e){this.mcpServer=e}isSamplingSupported(){try{return!!this.mcpServer.server.getClientCapabilities()?.sampling}catch{return!1}}async sampleText(t){if(!this.isSamplingSupported())return e.debug(`Sampling not supported by connected client, skipping LLM delegation`),null;try{let n=(await this.mcpServer.server.createMessage({messages:[{role:`user`,content:{type:`text`,text:t.userMessage}}],systemPrompt:t.systemPrompt,maxTokens:t.maxTokens??512,...t.temperature===void 0?{}:{temperature:t.temperature},...t.modelHint?{modelPreferences:{hints:[{name:t.modelHint}],intelligencePriority:.8,speedPriority:.7,costPriority:.3}}:{}})).content;if(Array.isArray(n)){let e=n.filter(e=>e.type===`text`).map(e=>e.text);return e.length>0?e.join(``):null}return n&&typeof n==`object`&&`type`in n&&n.type===`text`?n.text:(e.warn(`sampling/createMessage returned non-text content`),null)}catch(t){return e.warn(`LLM sampling request failed:`,t),null}}},ht=class{mcpServer;constructor(e){this.mcpServer=e}isElicitationSupported(){try{return!!this.mcpServer.server.getClientCapabilities()?.elicitation}catch{return!1}}async requestFormInput(t){if(!this.isElicitationSupported())return e.debug(`Elicitation not supported by connected client`),null;try{let e=await this.mcpServer.server.elicitInput(t);return{action:e.action,content:e.content}}catch(t){return e.warn(`Elicitation request failed:`,t),null}}async requestConfirmation(e){let t=await this.requestFormInput({message:e,requestedSchema:{type:`object`,properties:{confirmed:{type:`boolean`,description:`Confirm this action`,title:`Confirm`,default:!0}},required:[`confirmed`]}});return t?.action===`accept`&&t.content?.confirmed===!0}async requestCaptchaSolution(e,t){let n=await this.requestFormInput({message:[`🛡️ CAPTCHA detected: **${t}**`,``,`Page: ${e}`,``,`Please solve the CAPTCHA in your browser, then confirm completion below.`,`If a token/response was generated, paste it in the token field.`].join(`
3
- `),requestedSchema:{type:`object`,properties:{solved:{type:`boolean`,description:`Have you solved the CAPTCHA?`,title:`CAPTCHA Solved`,default:!1},token:{type:`string`,description:`CAPTCHA response token (if available)`,title:`Response Token`}},required:[`solved`]}});return!n||n.action!==`accept`?null:{solved:n.content?.solved===!0,token:typeof n.content?.token==`string`?n.content.token:void 0}}},gt=class{handlers;constructor(e){this.handlers=new Map(Object.entries(e))}has(e){return this.handlers.has(e)}listToolNames(){return Array.from(this.handlers.keys())}addHandlers(e){for(let[t,n]of Object.entries(e))this.handlers.set(t,n)}removeHandler(e){this.handlers.delete(e)}async execute(e,t){let n=this.handlers.get(e);if(!n)throw new O(`NOT_FOUND`,`Unknown tool: ${e}`,{toolName:e});return n(t)}};const _t=[`page_`,`console_`,`debugger_`,`network_`,`dom_`,`stealth_`,`framework_`,`indexeddb_`,`js_heap_`,`script_`,`captcha_`,`ai_hook_`,`instrumentation_`,`hook_preset_`,`ws_`,`evidence_`],vt=new Set([`network_icmp_probe`,`network_traceroute`,`network_rtt_measure`,`http_request_build`,`http_plain_request`,`http2_probe`,`http2_frame_build`,`dns_resolve`,`dns_reverse`]),yt=new Set([`search_tools`,`route_tool`,`describe_tool`,`call_tool`,`activate_tools`,`deactivate_tools`,`activate_domain`]),bt=new Map([[`stealth`,[`page_navigate`,`page_evaluate`,`stealth_verify`,`page_screenshot`]],[`page`,[`browser_jsdom_parse`,`js_bundle_search`,`network_get_requests`,`page_screenshot`]],[`console`,[`page_evaluate`,`console_get_logs`,`page_screenshot`]],[`network`,[`network_get_requests`,`page_navigate`]],[`captcha`,[`captcha_wait`,`page_screenshot`]],[`ai_hook`,[`manage_hooks`,`page_evaluate`,`ai_hook_inject`]],[`instrumentation`,[`instrumentation_session`,`instrumentation_artifact`]],[`evidence`,[`evidence_query`,`evidence_chain`]]]);var xt=class{getProvider;contextSensitiveCache=new Map;lastToolName=null;consecutiveCount=0;constructor(e){this.getProvider=e}isContextSensitive(e){let t=this.contextSensitiveCache.get(e);if(t!==void 0)return t;if(vt.has(e))return this.contextSensitiveCache.set(e,!1),!1;let n=_t.some(t=>e.startsWith(t));return this.contextSensitiveCache.set(e,n),n}recordCall(e){return yt.has(e)?0:(e===this.lastToolName?this.consecutiveCount++:(this.lastToolName=e,this.consecutiveCount=1),this.consecutiveCount)}isRepeatLoop(){return this.consecutiveCount>=3}enrichResponse(t,n){if(this.isRepeatLoop()&&!yt.has(t)&&this.injectRepeatWarning(t,n),!this.isContextSensitive(t)||n.isError)return n;let r=this.getProvider();if(!r||typeof r.getContextMeta!=`function`)return n;let i=r.getContextMeta();if(!i.pageId&&i.tabIndex===null)return n;let a=n.content;if(!Array.isArray(a))return n;let o=a.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(!o)return n;let s=o.text,c=s.trimStart();if(c.startsWith(`{`)&&c.trimEnd().endsWith(`}`))try{let e=JSON.parse(s);if(typeof e==`object`&&e&&!Array.isArray(e))return`_tabContext`in e||(o.text=this.spliceTabContext(s,i)),n}catch{return e.debug(`[ContextGuard] Skipped non-JSON response enrichment for ${t}`),n}return n}spliceTabContext(e,t){let n={url:t.url,title:t.title,tabIndex:t.tabIndex,pageId:t.pageId};if(/\n\}\s*$/.test(e)){let t=JSON.stringify(n,null,2).replace(/\n/g,`
4
- `);return e.replace(/\n\}\s*$/,`,\n "_tabContext": ${t}\n}`)}let r=JSON.stringify(n);return/^\{\s*\}\s*$/.test(e)?e.replace(/\{\s*\}\s*$/,`{"_tabContext":${r}}`):e.replace(/\}\s*$/,`,"_tabContext":${r}}`)}injectRepeatWarning(e,t){let n=e.split(`_`)[0]??``,r=(e===`page_evaluate`?[`browser_jsdom_parse`,`js_bundle_search`,`network_get_requests`,`page_screenshot`]:bt.get(n)??[`page_navigate`,`page_evaluate`]).filter(t=>t!==e),i={detected:!0,consecutiveCount:this.consecutiveCount,message:`⚠ You have called "${e}" ${this.consecutiveCount} times in a row. This is likely a loop — consider what you actually need to do next.`,suggestedTools:r,hint:r.length>0?`Try calling ${r[0]} instead.`:`Re-evaluate your task objective before making another tool call.`},a=t.content;if(!Array.isArray(a))return;let o=a.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(o){let e=o.text;try{let t=JSON.parse(e);if(typeof t==`object`&&t&&!Array.isArray(t)){t.repeatWarning=i,o.text=JSON.stringify(t,null,2);return}}catch{}}a.push({type:`text`,text:JSON.stringify({repeatWarning:i},null,2)})}};const B=/^data:([a-zA-Z0-9/+-]+);base64,/,St=/"_?offload"|detailId|_filePath/;var Ct=class{detailedData;detailThreshold;fileThreshold;excludeTools;constructor(e,t={}){this.detailedData=e,this.detailThreshold=t.detailThreshold??512*1024,this.fileThreshold=t.fileThreshold??4*1024*1024,this.excludeTools=t.excludeTools??new Set}formatSize(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(1)}MB`}storeInDetailManager(t,n,r){let i=this.detailedData.store(t),a=this.detailedData.cache.get(i)?.size??0;return e.info(`[Offloader] Stored in DetailDataManager (${this.formatSize(a)}) → detailId=${i}`),{_offload:{type:`detailId`,detailId:i,size:this.formatSize(a)}}}tryParseJson(e){try{let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))return JSON.parse(t)}catch{}return null}offload(t,n){if(n.isError||this.excludeTools.has(t))return n;let r=n.content;if(!Array.isArray(r))return n;let i=!1;for(let e=0;e<r.length;e++){let n=r[e];if(typeof n!=`object`||!n)continue;let a=n;if(a.type!==`text`&&a.type!==`resource`)continue;let o=a.text;if(typeof o!=`string`||o.length<this.detailThreshold||St.test(o))continue;if(B.test(o)){r[e]={...a,text:JSON.stringify({_offload:{type:`file`,pending:!0,dataUriLength:o.length,hint:`Use get_detailed_data() or read file after async offload completes`,size:this.formatSize(o.length),mimeType:o.match(B)?.[1]??`application/octet-stream`}},null,2)},i=!0;continue}let s=this.tryParseJson(o);if(s!==null){r[e]={...a,text:JSON.stringify(this.storeInDetailManager(s,t,e),null,2)},i=!0;continue}if(o.length>=this.fileThreshold){r[e]={...a,text:JSON.stringify({_offload:{type:`file`,pending:!0,hint:`Large raw string — use get_detailed_data() or await async offload`,size:this.formatSize(o.length)}},null,2)},i=!0;continue}}return i&&e.debug(`[Offloader] Offloaded large data from ${t}`),n}async offloadAsync(t,n){if(n.isError||this.excludeTools.has(t))return n;let r=n.content;if(!Array.isArray(r))return n;for(let t=0;t<r.length;t++){let n=r[t];if(typeof n!=`object`||!n)continue;let i=n;if(i.type!==`text`)continue;let a=i.text;if(typeof a==`string`)try{let n=JSON.parse(a);n?._offload?.pending&&B.test(n._offload.mimeType?`data:${n._offload.mimeType};base64,`:``)&&e.debug(`[Offloader] Skipping async write for already-placeholdered entry ${t}`)}catch{}}return n}};function wt(){let t=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),n=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase(),r=me(process.env.MCP_TOOL_DOMAINS);if(r&&r.length>0){let t=ue(r);return e.info(`Tool registration mode=domains [${r.join(`,`)}], count=${t.length}`),{tools:t,profile:n===`full`||n===`workflow`||n===`search`?n:`search`}}let i;i=n===`full`||n===`workflow`||n===`search`?n:`search`;let a=oe(i);return e.info(`Tool registration mode=${i}, transport=${t}, count=${a.length}`),{tools:a,profile:i}}function V(e){return(typeof e==`object`||typeof e==`function`)&&e!==null&&typeof e.then==`function`}function Tt(e){let t=new Set;for(let n of e){let e=D(n.name);e&&t.add(e)}return t}function H(t,n,r,i){let a={domain:n,label:r},o,s,c=`unknown`,l=0;function u(e,t){let n=e[t];return typeof n==`function`?n.bind(e):n}function d(){if(s)return s;if(o)return o;if(l>0)throw new O(`RUNTIME`,`${r}: circular initialization detected for domain "${n}"`,{details:a});e.info(`Lazy-initializing ${r} for domain "${n}"`),l++;try{let e=i();return V(e)?(c=`async`,o=Promise.resolve(e).then(e=>(s=e,e)),o):(c=`sync`,s=e,o=Promise.resolve(e),e)}finally{l--}}async function f(){let e=d();return V(e)?await e:e}function p(e){let t=()=>f().then(t=>u(t,e));return new Proxy((...t)=>f().then(n=>{let r=n[e];return typeof r==`function`?r.call(n,...t):r}),{get:(e,n,r)=>n===`then`?(...e)=>t().then(...e):n===`catch`?(...e)=>t().catch(...e):n===`finally`?(...e)=>t().finally(...e):Reflect.get(e,n,r)})}return new Proxy({},{get:(e,i)=>{if(!t.enabledDomains.has(n))return()=>{throw new O(`PREREQUISITE`,`${r} is unavailable: domain "${n}" not enabled by current tool profile`,{details:a})};if(i===`then`||i===`catch`||i===Symbol.toStringTag)return;if(s&&c===`sync`)return u(s,i);let o=d();return V(o)?p(i):u(o,i)}})}const Et=new Set([`http://127.0.0.1`,`http://localhost`,`http://[::1]`]);function Dt(e,t){let n=e.headers.origin;if(!n)return!0;let r;try{let e=new URL(n);r=`${e.protocol}//${e.hostname}`}catch{return t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – invalid Origin header`),!1}return Et.has(r)||process.env.MCP_AUTH_TOKEN?!0:(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – cross-origin requests require MCP_AUTH_TOKEN`),!1)}function Ot(e,t){let n=process.env.MCP_AUTH_TOKEN;if(!n){let e=process.env.MCP_HOST??`127.0.0.1`;return!new Set([`127.0.0.1`,`localhost`,`::1`]).has(e)&&![`1`,`true`].includes((process.env.MCP_ALLOW_INSECURE??``).toLowerCase())?(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – MCP_AUTH_TOKEN is required when binding to non-localhost. Set MCP_ALLOW_INSECURE=1 to override.`),!1):!0}let r=e.headers.authorization;if(!r?.startsWith(`Bearer `))return t.writeHead(401,{"Content-Type":`text/plain`}),t.end(`Unauthorized – missing or malformed Authorization header`),!1;let i=r.slice(7),a=Buffer.from(i),o=Buffer.from(n);return a.length!==o.length||!tt(a,o)?(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – invalid token`),!1):!0}const kt=(()=>{let e=parseInt(process.env.MCP_MAX_BODY_BYTES??``,10);return Number.isFinite(e)&&e>0?e:10*1024*1024})();function At(e,t,n=kt){return new Promise((r,i)=>{let a=[],o=0,s=parseInt(e.headers[`content-length`]??``,10);if(!isNaN(s)&&s>n){t.writeHead(413,{"Content-Type":`text/plain`}),t.end(`Payload Too Large – limit is ${n} bytes`),i(Error(`body_too_large`));return}let c=!1;e.on(`data`,r=>{if(!c){if(o+=r.length,o>n){c=!0,t.writeHead(413,{"Content-Type":`text/plain`}),t.end(`Payload Too Large – limit is ${n} bytes`,()=>{e.destroy()}),i(Error(`body_too_large`));return}a.push(r)}}),e.on(`end`,()=>{if(!c)try{r(JSON.parse(Buffer.concat(a).toString(`utf8`)))}catch{t.writeHead(400,{"Content-Type":`text/plain`}),t.end(`Bad Request – invalid JSON body`),i(Error(`invalid_json`))}}),e.on(`error`,e=>i(e))})}const U=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_WINDOW_MS??``,10);return Number.isFinite(e)&&e>0?e:6e4})(),W=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_MAX??``,10);return Number.isFinite(e)&&e>0?e:60})(),G=new Map,jt=c,Mt=x;let K=Date.now();function Nt(e){if(e-K<Mt)return;K=e;let t=e-U;for(let[e,n]of G)n.timestamps=n.timestamps.filter(e=>e>t),n.timestamps.length===0&&G.delete(e)}function Pt(){if(G.size<=jt)return;let e=Math.ceil(jt*.1),t=0;for(let n of G.keys()){if(t>=e)break;G.delete(n),t++}}function Ft(e){if([`1`,`true`].includes((process.env.MCP_TRUST_PROXY??``).toLowerCase())){let t=e.headers[`x-forwarded-for`];if(t)return(Array.isArray(t)?t[0]:t.split(`,`)[0]).trim()}return e.socket.remoteAddress??`unknown`}function It(e,t,n=!1){if([`0`,`false`].includes((process.env.MCP_RATE_LIMIT_ENABLED??``).toLowerCase()))return!0;let r=n?W*3:W,i=Date.now();Nt(i),Pt();let a=Ft(e),o=G.get(a);o||(o={timestamps:[]},G.set(a,o));let s=i-U;if(o.timestamps=o.timestamps.filter(e=>e>s),o.timestamps.length>=r){let e=Math.ceil(U/1e3);return t.writeHead(429,{"Content-Type":`text/plain`,"Retry-After":String(e)}),t.end(`Too Many Requests – limit is ${r} per ${e}s window`),!1}return o.timestamps.push(i),!0}async function Lt(t){let n=new nt;if(typeof n.send==`function`){let t=n.send.bind(n);n.send=n=>new Promise(r=>{let i=setTimeout(()=>{e.warn(`transport.send() timed out — stdout broken, skipping write`),r()},500);t(n).then(()=>clearTimeout(i)).catch(()=>clearTimeout(i)).finally(r)})}n.onclose=()=>{t.shutdownStarted||(e.info(`stdio transport closed — running cleanup...`),q(t).catch(t=>e.warn(`cleanup after transport close failed:`,t)))},await t.server.connect(n);let r=!1,i=()=>{r||(r=!0,e.info(`stdin EOF — parent disconnected, shutting down...`),q(t).catch(t=>e.warn(`stdin EOF cleanup failed:`,t)).finally(()=>process.exit(0)))};process.stdin.on(`end`,i),process.stdin.on(`close`,i),e.success(`MCP stdio server started`)}async function Rt(t){let r=parseInt(process.env.MCP_PORT??`3000`,10),a=process.env.MCP_HOST??`127.0.0.1`,o=new rt({sessionIdGenerator:()=>et()});await t.server.connect(o),t.httpServer=$e((e,n)=>{let i=new URL(e.url??`/`,`http://localhost:${r}`);if(i.pathname===`/health`&&e.method===`GET`){zt(t,n);return}if(i.pathname!==`/mcp`){n.writeHead(404,{"Content-Type":`text/plain`}),n.end(`Not Found – use POST /mcp or GET /health`);return}if(!Dt(e,n))return;let a=Ot(e,n);if(a&&It(e,n,a)){if(e.method===`GET`||e.method===`DELETE`){o.handleRequest(e,n);return}if(e.method===`POST`){At(e,n).then(t=>o.handleRequest(e,n,t)).catch(()=>{});return}n.writeHead(405,{"Content-Type":`text/plain`}),n.end(`Method Not Allowed`)}});let s=t.httpServer;if(!s)throw Error(`HTTP server initialization failed`);s.requestTimeout=S,s.headersTimeout=i,s.keepAliveTimeout=n,s.on(`connection`,e=>{t.httpSockets.add(e),e.on(`close`,()=>t.httpSockets.delete(e))}),await new Promise((t,n)=>{s.listen(r,a,()=>{e.success(`MCP Streamable HTTP server listening on http://${a}:${r}/mcp`),t()}),s.on(`error`,n)})}function zt(e,t){let n=[`1`,`true`].includes((process.env.MCP_HEALTH_VERBOSE??``).toLowerCase()),r={status:`ok`,uptime:process.uptime()};if(n){let t=e.tokenBudget.getStats();r.tier=e.baseTier,r.baseTier=e.baseTier,r.enabledDomains=[...e.enabledDomains],r.registeredTools=e.selectedTools.length,r.activatedTools=e.activatedToolNames.size,r.tokenBudget={usagePercentage:t.usagePercentage,currentUsage:t.currentUsage,maxTokens:t.maxTokens}}t.writeHead(200,{"Content-Type":`application/json`}),t.end(JSON.stringify(r))}async function q(t){return t.shutdownStarted?t.shutdownPromise??Promise.resolve():(t.shutdownStarted=!0,t.shutdownPromise=(async()=>{let n=typeof t.getDomainInstance==`function`?t.getDomainInstance.bind(t):null;if(n){let t=n(`snapshotScheduler`);if(t)try{await t.flushAll(),t.dispose()}catch(t){e.warn(`snapshot flush on shutdown failed:`,t)}}for(let[,e]of t.domainTtlEntries)clearTimeout(e.timer);t.domainTtlEntries.clear(),t.detailedData.shutdown();let r=typeof t.getDomainInstance==`function`?t.getDomainInstance(`activationController`):t.activationController??void 0;if(r&&typeof r.dispose==`function`)try{r.dispose()}catch(t){e.warn(`activationController cleanup failed:`,t)}if(t.httpServer){let e=t.httpServer,n=new Promise(t=>e.close(()=>t())),r=setTimeout(()=>{for(let e of t.httpSockets)e.destroy()},C);await n,clearTimeout(r),t.httpSockets.clear(),t.httpServer=void 0}let i=[[`consoleMonitor`,t.consoleMonitor,`disable`],[`runtimeInspector`,t.runtimeInspector,`close`],[`debuggerManager`,t.debuggerManager,`close`],[`scriptManager`,t.scriptManager,`close`],[`transformHandlers`,t.transformHandlers,`close`]];for(let[t,n,r]of i)if(n)try{let e=n[r];typeof e==`function`&&await e.call(n)}catch(n){e.warn(`${t} cleanup failed:`,n)}if(t.consoleMonitor=void 0,t.runtimeInspector=void 0,t.debuggerManager=void 0,t.scriptManager=void 0,t.collector){try{await t.collector.close()}catch(t){e.warn(`collector cleanup failed:`,t)}t.collector=void 0}try{await t.server.close()}catch(t){e.warn(`MCP server close failed:`,t)}try{await Se.terminateAll()}catch(t){e.warn(`ProcessRegistry cleanup failed:`,t)}e.success(`MCP server closed`)})(),t.shutdownPromise)}const Bt=[{id:`wasm-chrome-macos`,name:`WASM inside Chrome on macOS`,conditions:[{type:`platform`,value:`darwin`},{type:`domain_active`,domain:`browser`},{type:`event_count`,event:`tool:called`,minCount:2,windowMs:p}],boostDomains:[`wasm`,`transform`],priority:20},{id:`debug-memory`,name:`Debug + Memory inspection`,conditions:[{type:`domain_active`,domain:`debugger`},{type:`event_count`,event:`debugger:breakpoint_hit`,minCount:1,windowMs:p}],boostDomains:[`memory`],priority:15},{id:`network-intercept-flow`,name:`Network interception workflow`,conditions:[{type:`domain_active`,domain:`network`},{type:`domain_active`,domain:`browser`}],boostDomains:[`hooks`],priority:10},{id:`skia-to-v8-correlation`,name:`Skia scene + V8 heap correlation`,conditions:[{type:`domain_active`,domain:`skia-capture`},{type:`event_count`,event:`v8:heap_captured`,minCount:1,windowMs:r}],boostDomains:[`cross-domain`,`v8-inspector`],priority:22},{id:`mojo-browser-network`,name:`Mojo IPC inside Chromium with active browser`,conditions:[{type:`domain_active`,domain:`mojo-ipc`},{type:`domain_active`,domain:`browser`}],boostDomains:[`network`,`cross-domain`],priority:18},{id:`frida-binary-trace`,name:`Frida attached → trace + cross-domain`,conditions:[{type:`tool_called_recently`,toolName:`frida_attach`,withinMs:r}],boostDomains:[`binary-instrument`,`trace`,`cross-domain`],priority:16},{id:`tls-capture-to-network`,name:`TLS keylog captured → network replay prep`,conditions:[{type:`domain_active`,domain:`boringssl-inspector`}],boostDomains:[`network`],priority:12},{id:`syscall-js-correlation`,name:`Syscall trace live → JS correlation`,conditions:[{type:`domain_active`,domain:`syscall-hook`},{type:`event_count`,event:`tool:called`,minCount:1,windowMs:r}],boostDomains:[`cross-domain`],priority:14}];var Vt=class{conditions;constructor(e=[]){this.conditions=[...Bt,...e].toSorted((e,t)=>t.priority-e.priority)}evaluate(e){let t=new Set;for(let n of this.conditions)if(this.allConditionsMet(n,e))for(let e of n.boostDomains)t.add(e);return[...t]}allConditionsMet(e,t){return e.conditions.every(e=>this.evaluatePredicate(e,t))}evaluatePredicate(e,t){let n=Date.now();switch(e.type){case`platform`:return t.platform===e.value;case`domain_active`:return t.activeDomains.has(e.domain);case`event_count`:{let r=n-e.windowMs;return t.eventHistory.filter(t=>t.event.startsWith(e.event)&&t.timestamp>=r).length>=e.minCount}case`tool_called_recently`:{let r=n-e.withinMs;return t.eventHistory.some(t=>t.event===`tool:called`&&t.timestamp>=r&&t.payload?.toolName===e.toolName)}default:return!1}}get conditionCount(){return this.conditions.length}},Ht=class{callHistory=[];maxHistory;confidenceThreshold;decayFactor;transitions=new Map;transitions2=new Map;maxSecondOrderKeys;constructor(e={}){this.maxHistory=e.maxHistory??b,this.confidenceThreshold=e.confidenceThreshold??t,this.decayFactor=e.decayFactor??l,this.maxSecondOrderKeys=e.maxSecondOrderKeys??g}recordCall(e){let t=this.callHistory.length>0?this.callHistory[this.callHistory.length-1]:null,n=this.callHistory.length>1?this.callHistory[this.callHistory.length-2]:null;if(this.callHistory.push(e),this.callHistory.length>this.maxHistory&&this.callHistory.splice(0,this.callHistory.length-this.maxHistory),this.applyDecay(this.transitions),this.applyDecay(this.transitions2),t&&this.bumpTransition(this.transitions,t,e),n&&t){let r=`${n}\u0001${t}`;this.bumpTransition(this.transitions2,r,e),this.enforceSecondOrderCap()}}predictNext(e){let t=this.callHistory.length>1?this.callHistory[this.callHistory.length-2]:null;if(t){let n=`${t}\u0001${e}`,r=this.transitions2.get(n),i=this.pickPredictions(r);if(i.length>0)return i}return this.pickPredictions(this.transitions.get(e))}predictNextDomains(e,t){let n=this.predictNext(e),r=new Set;for(let e of n){let n=t(e);n&&r.add(n)}return[...r]}get historyLength(){return this.callHistory.length}get transitionCount(){return this.transitions.size}get secondOrderTransitionCount(){return this.transitions2.size}reset(){this.callHistory.length=0,this.transitions.clear(),this.transitions2.clear()}applyDecay(e){if(!(this.decayFactor>=1))for(let[,t]of e)for(let[e,n]of t){let r=n*this.decayFactor;r<.01?t.delete(e):t.set(e,r)}}bumpTransition(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r)),r.set(n,(r.get(n)??0)+1)}enforceSecondOrderCap(){if(this.transitions2.size<=this.maxSecondOrderKeys)return;let e=this.transitions2.size-this.maxSecondOrderKeys,t=this.transitions2.keys();for(let n=0;n<e;n++){let{value:e,done:n}=t.next();if(n||!e)break;this.transitions2.delete(e)}}pickPredictions(e){if(!e||e.size===0)return[];let t=0;for(let n of e.values())t+=n;if(t===0)return[];let n=[];for(let[r,i]of e){let e=i/t;e>=this.confidenceThreshold&&n.push({tool:r,confidence:e})}return n.sort((e,t)=>t.confidence-e.confidence),n.map(e=>e.tool)}},Ut=class{lastActivity=new Map;baseDomains;autoActivatedDomains=new Set;autoInactivityMs;manualInactivityMs;checkIntervalMs;checkTimer=null;eventBus;onPrune;constructor(e,t,n,r={}){this.eventBus=e,this.baseDomains=t,this.onPrune=n,this.autoInactivityMs=r.autoActivatedInactivityMs??_,this.manualInactivityMs=r.manualActivatedInactivityMs??d,this.checkIntervalMs=r.checkIntervalMs??m,this.startCheckTimer()}recordActivity(e){this.lastActivity.set(e,Date.now())}markAutoActivated(e){this.autoActivatedDomains.add(e),this.lastActivity.set(e,Date.now())}startCheckTimer(){this.checkTimer=setInterval(()=>{this.checkAndPrune()},this.checkIntervalMs),this.checkTimer.unref&&this.checkTimer.unref()}checkAndPrune(){let t=Date.now();for(let[n,r]of this.lastActivity.entries()){if(this.baseDomains.has(n))continue;let i=t-r,a=this.autoActivatedDomains.has(n)?this.autoInactivityMs:this.manualInactivityMs;i>=a&&(e.info(`[AutoPruner] Pruning domain "${n}" — inactive for ${Math.round(i/1e3)}s (threshold: ${Math.round(a/1e3)}s)`),this.onPrune(n),this.lastActivity.delete(n),this.autoActivatedDomains.delete(n),this.eventBus.emit(`activation:domain_pruned`,{domain:n,reason:`inactivity (${Math.round(i/1e3)}s)`,timestamp:new Date().toISOString()}))}}getLastActivity(e){return this.lastActivity.get(e)}isAutoActivated(e){return this.autoActivatedDomains.has(e)}dispose(){this.checkTimer&&=(clearInterval(this.checkTimer),null),this.lastActivity.clear(),this.autoActivatedDomains.clear()}};const Wt=[{eventPattern:`debugger:breakpoint_hit`,targetDomains:[`debugger`],threshold:1,windowMs:y,priority:10},{eventPattern:`browser:navigated`,targetDomains:[`browser`],threshold:1,windowMs:y,priority:10},{eventPattern:`memory:scan_completed`,targetDomains:[`memory`],threshold:1,windowMs:y,priority:10},{eventPattern:`network:intercept_started`,targetDomains:[`network`,`hooks`],threshold:1,windowMs:y,priority:9},{eventPattern:`v8:heap_captured`,targetDomains:[`v8-inspector`],threshold:1,windowMs:y,priority:10},{eventPattern:`tls:keylog_started`,targetDomains:[`boringssl-inspector`],threshold:1,windowMs:y,priority:10},{eventPattern:`skia:scene_captured`,targetDomains:[`skia-capture`],threshold:1,windowMs:y,priority:10},{eventPattern:`frida:attached`,targetDomains:[`binary-instrument`],threshold:1,windowMs:y,priority:10},{eventPattern:`adb:device_connected`,targetDomains:[`adb-bridge`],threshold:1,windowMs:y,priority:10},{eventPattern:`mojo:message_captured`,targetDomains:[`mojo-ipc`],threshold:1,windowMs:y,priority:10},{eventPattern:`syscall:trace_started`,targetDomains:[`syscall-hook`],threshold:1,windowMs:y,priority:10},{eventPattern:`protocol:pattern_detected`,targetDomains:[`protocol-analysis`],threshold:1,windowMs:y,priority:10}];var Gt=class{eventBus;ctx;cooldownMs;boostRules;unsubscribers=[];lastBoostTime=new Map;lastActivity=new Map;eventHistory=[];maxEventHistory;toolCallCount=0;compoundEvalEvery;compoundEngine;predictiveBooster;autoPruner;disposed=!1;constructor(t,n,r={}){this.eventBus=t,this.ctx=n,this.cooldownMs=r.cooldownMs??v,this.maxEventHistory=f,this.compoundEvalEvery=Math.max(1,h);let i=r.boostRules??[];this.boostRules=[...Wt,...i].toSorted((e,t)=>t.priority-e.priority),this.compoundEngine=new Vt,this.predictiveBooster=new Ht;let a=new Set(pe(n.baseTier));this.autoPruner=new Ut(t,a,t=>{e.info(`[ActivationController] Auto-pruning domain "${t}"`)}),this.subscribe(),e.info(`[ActivationController] Initialized with ${this.boostRules.length} boost rules, cooldown=${this.cooldownMs}ms, platform=${process.platform}, ${this.compoundEngine.conditionCount} compound conditions`)}subscribe(){this.unsubscribers.push(this.eventBus.on(`tool:called`,e=>{this.recordEvent(`tool:called`,e),e.domain&&(this.lastActivity.set(e.domain,Date.now()),this.autoPruner.recordActivity(e.domain)),this.predictiveBooster.recordCall(e.toolName);let t=this.predictiveBooster.predictNextDomains(e.toolName,e=>D(e)??null);for(let n of t)this.attemptBoost(n,`predictive: ${e.toolName} → ${n}`);this.toolCallCount++,this.toolCallCount%this.compoundEvalEvery===0&&this.evaluateCompoundConditions()}));let e=new Set;for(let t of this.boostRules){if(!t.eventPattern||e.has(t.eventPattern))continue;e.add(t.eventPattern);let n=t.eventPattern;this.unsubscribers.push(this.eventBus.on(n,e=>(this.recordEvent(t.eventPattern,e),this.evaluateBoostRules(t.eventPattern))))}}recordEvent(e,t){this.eventHistory.push({event:e,timestamp:Date.now(),payload:t}),this.eventHistory.length>this.maxEventHistory&&this.eventHistory.splice(0,this.eventHistory.length-this.maxEventHistory)}async evaluateBoostRules(e){let t=Date.now();for(let n of this.boostRules){if(!e.startsWith(n.eventPattern))continue;let r=t-n.windowMs,i=this.eventHistory.filter(e=>e.event.startsWith(n.eventPattern)&&e.timestamp>=r).length;i>=n.threshold&&await Promise.all(n.targetDomains.map(e=>this.attemptBoost(e,`rule:${n.eventPattern} (${i} events)`)))}}async attemptBoost(t,n){if(this.disposed)return;let r=Date.now();r-(this.lastBoostTime.get(t)??0)<this.cooldownMs||this.ctx.enabledDomains.has(t)||(this.lastBoostTime.set(t,r),e.info(`[ActivationController] Boosting domain "${t}" — reason: ${n}`),await A(this.ctx,{domain:t,ttlMinutes:a}),await this.eventBus.emit(`activation:domain_boosted`,{domain:t,reason:n,timestamp:new Date().toISOString()}))}evaluateCompoundConditions(){let e={platform:process.platform,activeDomains:this.ctx.enabledDomains,eventHistory:this.eventHistory,recentToolCalls:this.eventHistory.filter(e=>e.event===`tool:called`).map(e=>e.payload?.toolName??``)},t=this.compoundEngine.evaluate(e);for(let e of t)this.attemptBoost(e,`compound condition`)}getLastActivity(e){return this.lastActivity.get(e)}getEventHistory(){return this.eventHistory}getLastBoostTime(e){return this.lastBoostTime.get(e)}getPredictiveBooster(){return this.predictiveBooster}getAutoPruner(){return this.autoPruner}dispose(){this.disposed=!0;for(let e of this.unsubscribers)e();this.unsubscribers.length=0,this.lastBoostTime.clear(),this.lastActivity.clear(),this.eventHistory.length=0,this.autoPruner.dispose(),this.predictiveBooster.reset(),e.info(`[ActivationController] Disposed`)}};const Kt=new Set([`true`,`1`,`yes`,`on`]),qt=new Set([`false`,`0`,`no`,`off`]);function Jt(e){if(typeof e!=`string`)return e;let t=e.trim().toLowerCase();return Kt.has(t)?!0:qt.has(t)?!1:e}function Yt(e){if(typeof e!=`string`)return e;let t=e.trim();if(t===``)return e;let n=Number(t);return Number.isFinite(n)?n:e}function J(e){let t=e.type,n=typeof e.description==`string`?e.description:void 0;if(e.anyOf!==void 0||e.oneOf!==void 0){let t=(e.anyOf??e.oneOf).map(e=>J(e)),r=z.union([t[0],...t.slice(1)]);return n?r.describe(n):r}let r;switch(t){case`string`:if(Array.isArray(e.enum)){let t=e.enum;r=z.enum(t)}else{let t=z.string();typeof e.pattern==`string`&&(t=t.regex(new RegExp(e.pattern))),r=t}break;case`number`:case`integer`:{let n=z.number();typeof e.minimum==`number`&&(n=n.min(e.minimum)),typeof e.maximum==`number`&&(n=n.max(e.maximum)),t===`integer`&&(n=n.int()),r=z.preprocess(Yt,n);break}case`boolean`:r=z.preprocess(Jt,z.boolean());break;case`array`:r=e.items&&typeof e.items==`object`?z.array(J(e.items)):z.array(z.unknown());break;case`object`:if(e.properties&&typeof e.properties==`object`){let t={},n=new Set(Array.isArray(e.required)?e.required:[]);for(let[r,i]of Object.entries(e.properties)){let e=J(i);t[r]=n.has(r)?e:e.optional()}r=z.object(t)}else r=z.record(z.string(),z.unknown());break;default:r=z.unknown()}return n&&(r=r.describe(n)),r}function Xt(e){let t=e.properties??{},n=new Set(Array.isArray(e.required)?e.required:[]),r={};for(let[e,i]of Object.entries(t)){let t=J(i&&typeof i==`object`?i:{});r[e]=n.has(e)?t:t.optional()}return r}function Zt(e){switch(e){case`VALIDATION`:return I.InvalidParams;case`NOT_FOUND`:return-32002;case`TIMEOUT`:return I.RequestTimeout;case`CONNECTION`:return I.ConnectionClosed;case`PREREQUISITE`:case`PERMISSION`:return I.InvalidRequest;default:return I.InternalError}}function Qt(t,n){if(n instanceof it)throw e.error(`Tool validation failed: ${t}`,n),new L(I.InvalidParams,`Validation Error in ${t}: ${n.message}`);if(n instanceof L)throw n;if(n instanceof O){e.error(`Tool execution failed [${n.code}]: ${t} - ${n.message}`);let r=n.details?`\nDetails: ${JSON.stringify(n.details)}`:``;throw new L(Zt(n.code),`[${n.code}] ${n.message}${r}`)}throw e.error(`Tool execution failed: ${t}`,n),new L(I.InternalError,`Execution Failed in ${t}: ${n instanceof Error?n.message:String(n)}`)}function Y(e){let t={...e};if(t.properties){let e={};for(let[n,r]of Object.entries(t.properties)){let{description:t,...i}=r;e[n]=Y(i)}t.properties=e}if(t.items&&typeof t.items==`object`){let{description:e,...n}=t.items;t.items=Y(n)}return t.additionalProperties&&typeof t.additionalProperties==`object`&&!Array.isArray(t.additionalProperties)&&(t.additionalProperties=Y(t.additionalProperties)),t}function $t(e,t){let n=t;n.autocompleteHandlers&&e.toolAutocompleteHandlers.set(t.name,n.autocompleteHandlers);let r=s&&t.inputSchema?Y(t.inputSchema):t.inputSchema,i=r&&typeof r==`object`?Xt(r):{},a=t.description??t.name;if(Object.keys(i).length>0){let r=e.server.registerTool(t.name,{description:a,inputSchema:i},async(n,r)=>{try{let i={...n};return r?._meta&&(i._meta=r._meta),await e.executeToolWithTracking(t.name,i)}catch(e){return Qt(t.name,e)}});if(n.execution){let r=e.server.registeredTools;r&&r[t.name]&&(r[t.name].execution=n.execution)}return r}let o=e.server.registerTool(t.name,{description:a},async(n,r)=>{try{let n={};return r?._meta&&(n._meta=r._meta),await e.executeToolWithTracking(t.name,n)}catch(e){return Qt(t.name,e)}});if(n.execution){let r=e.server.registeredTools;r&&r[t.name]&&(r[t.name].execution=n.execution)}return o}function X(e){if(e?.type!==`object`||!e.properties)return{};let t={},n=new Set(Array.isArray(e.required)?e.required:[]);for(let[r,i]of Object.entries(e.properties)){let e=i;!n.has(r)&&e.default===void 0||(e.default===void 0?e.enum&&Array.isArray(e.enum)&&e.enum.length>0?t[r]=e.enum[0]:e.type===`string`?t[r]=`<${r}>`:e.type===`number`||e.type===`integer`?t[r]=0:e.type===`boolean`?t[r]=!1:e.type===`array`?t[r]=[]:e.type===`object`&&(t[r]={}):t[r]=e.default)}return t}function en(e,t){return`call_tool({ name: "${e}", args: ${JSON.stringify(X(t))} })`}function tn(e,t){let n=N(e),r=M(n,t);return r?{name:n,description:Be(n,t),inputSchema:r}:null}async function nn(t,n,r){let{task:i,context:a={}}=t,o=a.maxRecommendations||5;e.info(`[ToolRouter] Routing request`,{task:i,context:a}),await we(n);let s=Ee(i),c=k(n),l=_e(n),u=await Pe(n),d=ke(n),f=Ve(i,n),p=null,m=await r.search(i,o*2,c,l,ge(n)),h=!f&&!s?je(m.slice(0,10),d):null,g=[];if(h){let t=h.tools.filter(e=>d.has(e)).map((e,t)=>({name:e,domain:Ae(e,n),shortDescription:m.find(t=>t.name===e)?.shortDescription??n.extensionToolsByName.get(e)?.tool.description??``,score:h.priority-t*.01,isActive:P(e,n)})),r=new Set(h.tools),i=m.filter(e=>!r.has(e.name));g=[...t,...i],e.info(`[ToolRouter] Cross-domain workflow detected`,{pattern:h.id,domains:h.domains})}else if(f?.workflow.route.kind===`preset`){let e=ze(f,u,n,d);p=new Set(e.map(e=>e.name));let t=new Set(e.map(e=>e.name)),r=m.filter(e=>!t.has(e.name));g=[...e,...r]}else if(f?.workflow.route.kind===`workflow`){let e=Ne(f,n);g=[e,...m.filter(t=>t.name!==e.name)]}else if(s){let e=Oe(i),t=De(s,u,d),r=t.map((t,r)=>({name:t,domain:Ae(t,n),shortDescription:m.find(e=>e.name===t)?.shortDescription??n.extensionToolsByName.get(t)?.tool.description??``,score:(e?90:s.priority)-r*.01,isActive:P(t,n)})),a=new Set(t),o=m.filter(e=>!a.has(e.name));g=[...r,...o]}else if(i&&!F(i,s)&&!He(i)){let e=Le(i,n,d);if(e.length>0){let t=new Set(e.map(e=>e.name)),n=m.filter(e=>!t.has(e.name));g=[...e,...n]}else g=[...m]}else g=[...m];let _=[],v=new Set;for(let e of g)v.has(e.name)||(v.add(e.name),_.push(e));g=Re(_,i,s,u),a.preferredDomain&&g.length>0&&(g=g.map(e=>({...e,score:e.domain===a.preferredDomain?e.score*1.15:e.score})),g.sort((e,t)=>t.score-e.score));let y=Math.max(o,p?.size??0);g=g.slice(0,y);let b=f?Fe(f,n):void 0,x=g.map(e=>{let t=M(e.name,n),r=P(e.name,n),i={name:e.name,domain:e.domain,description:e.shortDescription,inputSchema:t||{type:`object`},score:e.score,isActive:r,callCommand:en(e.name,t||{type:`object`})};r||(i.activationCommand=`activate_tools with names: ["${e.name}"]`);let a=Ie()[e.name];return a&&a.length>0&&(i.prerequisites=a.map(e=>({condition:e.condition,satisfied:e.check(u),fix:e.fix}))),i}),S=[],C=p?x.filter(e=>p.has(e.name)):[],w=(C.length>0?C:x).filter(e=>!e.isActive),T=(()=>{if(C.length>0||!F(i,s)||He(i))return w;let e=w.filter(e=>e.domain!==`maintenance`);return e.length>0?e:w})();if(b?.kind===`preset`&&C.length>0){let e=1;T.length>0&&S.push({step:e++,action:`activate`,toolName:T.length===1?T[0].name:void 0,command:`activate_tools with names: [${T.map(e=>`"${e.name}"`).join(`, `)}]`,description:`Activate ${T.length} preset tool${T.length===1?``:`s`} for ${b.name}`});let t=x.filter(e=>e.name===`browser_launch`||e.name===`browser_attach`);for(let n of t)S.push({step:e++,action:`call`,toolName:n.name,command:n.name,exampleArgs:X(n.inputSchema),description:n.description});for(let t of b.steps){let r=C.find(e=>e.name===t.toolName);S.push({step:e++,action:`call`,toolName:t.toolName,command:t.toolName,exampleArgs:X(r?.inputSchema??M(t.toolName,n)??{type:`object`}),description:`${t.id}: ${t.description}`})}}else if(b?.kind===`workflow`){let e=x.find(e=>e.name===`run_extension_workflow`),t=1;e.isActive||S.push({step:t++,action:`activate`,toolName:e.name,command:`activate_tools with names: ["${e.name}"]`,description:`Activate workflow runner for ${b.name}`}),S.push({step:t,action:`call`,toolName:`run_extension_workflow`,command:`run_extension_workflow`,exampleArgs:{...X(e.inputSchema),workflowId:b.id},description:`Execute routed workflow ${b.name}`})}else if(x.length>0&&x[0]?.isActive)S.push({step:1,action:`call`,toolName:x[0].name,command:x[0].name,exampleArgs:X(x[0].inputSchema),description:`Call ${x[0].name}. Use describe_tool("${x[0].name}") only if you need the full schema.`});else if(T.length>0){let e=T[0];S.push({step:1,action:`activate`,toolName:T.length===1?e.name:void 0,command:`activate_tools with names: [${T.map(e=>`"${e.name}"`).join(`, `)}]`,description:`Activate ${T.length} recommended tool${T.length===1?``:`s`}`}),S.push({step:2,action:`call`,toolName:e.name,command:e.name,exampleArgs:X(e.inputSchema),description:`Call ${e.name}. Use describe_tool("${e.name}") only if you need the full schema.`})}return{recommendations:x,nextActions:S,workflowHint:b?`${b.kind===`preset`?`Preset`:`Workflow`} ${b.name}: ${b.description}`:s?.hint,routeMatch:b,autoActivated:!1}}async function rn(t,n){if(n)try{await t.server.sendToolListChanged()}catch(t){e.warn(`sendToolListChanged failed:`,t)}}async function Z(t,n){await se();let r=k(t),i=[],a=[],o=[];for(let e of n){let n=N(e);if(r.has(n)){a.push(n);continue}let s=(await be(t)).get(n);if(!s){o.push(n);continue}let c=t.registerSingleTool(s);t.activatedToolNames.add(n),t.activatedRegisteredTools.set(n,c);let l=t.extensionToolsByName.get(n);l&&(l.registeredTool=c);let u=D(n)??t.extensionToolsByName.get(n)?.domain;if(u&&t.enabledDomains.add(u),l?.handler)t.router.addHandlers({[n]:l.handler});else{let e=new Set([n]),r=xe(t.handlerDeps,e);t.router.addHandlers(r)}i.push(n),r.add(n)}return await rn(t,i.length>0),e.info(`activate_tools: activated ${i.length}, already_active ${a.length}, not_found ${o.length}`),{activated:i,alreadyActive:a,notFound:o,totalActive:r.size}}async function an(e,t){let n=t.names;if(typeof n==`string`&&n.trim().startsWith(`[`))try{let e=JSON.parse(n);Array.isArray(e)&&(n=e)}catch{}let{names:r,error:i}=Me({names:n});if(i)return E(JSON.stringify({success:!1,error:i}));let a=await Z(e,r);return E(JSON.stringify({success:!0,...a,hint:a.activated.length>0?`Tools activated. If they do not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke them.`:void 0}))}async function on(t,n){let{names:r,error:i}=Me(n);if(i)return E(JSON.stringify({success:!1,error:i}));let a=[],o=[];for(let n of r){let r=N(n);if(!t.activatedToolNames.has(r)){o.push(r);continue}let i=t.activatedRegisteredTools.get(r);if(i)try{i.remove()}catch(t){e.warn(`Failed to remove activated tool "${r}":`,t)}t.router.removeHandler(r),t.activatedToolNames.delete(r),t.activatedRegisteredTools.delete(r);let s=t.extensionToolsByName.get(r);s&&(s.registeredTool=void 0),a.push(r)}return await rn(t,a.length>0),e.info(`deactivate_tools: deactivated ${a.length}, not_activated ${o.length}`),E(JSON.stringify({success:!0,deactivated:a,notActivated:o,hint:`Deactivated tools are no longer available. Search again to find alternatives.`}))}async function sn(e,t){let n=t.query,r=t.top_k??10,i=t.auto_activate??!0,o=await j(e),s=k(e),c=_e(e),l=await o.search(n,r,s,c,ge(e));if(i&&r>0){let t=l.filter(e=>!e.isActive);if(t.length>0){let n=new Set,r=[];for(let i of t)i.domain&&!e.enabledDomains.has(i.domain)?n.add(i.domain):i.domain||r.push(i.name);let{handleActivateDomain:i}=await import(`./MCPServer.search.handlers.domain-DVbWL1bT.mjs`).then(e=>e.t);for(let t of n)try{await i(e,{domain:t,ttlMinutes:a})}catch{}let o=new Set(n),s=t.filter(e=>!o.has(e.domain??``)).map(e=>e.name),c=[...new Set([...s,...r])];c.length>0&&await Z(e,c)}}let u=i?k(e):s,d=l[0],f=d?tn(d.name,e):null,p=f?X(f.inputSchema):void 0,m=[];d&&(u.has(d.name)?m.push({step:1,action:`call`,command:d.name,exampleArgs:p,description:`Call ${d.name} directly. Use describe_tool("${d.name}") only if you need the full schema.`}):(m.push({step:1,action:`activate_tools`,command:`activate_tools({ names: ["${d.name}"] })`,description:`Activate ${d.name} before calling.`}),m.push({step:2,action:`call`,command:d.name,exampleArgs:p,description:`Call ${d.name}. Use describe_tool("${d.name}") only if you need the full schema.`})));let h=l.length<3?` Few results — try distilling your query to key concepts (e.g. "hook fetch" instead of "how to intercept fetch requests").`:``,g=l.map(e=>({...e,isActive:u.has(e.name)?!0:e.isActive})),_={query:n,resultCount:l.length,results:g,nextActions:m,hint:`For guided tool discovery with workflow detection, use route_tool instead. Tools are auto-activated. If a tool does not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke it directly.`+h,autoActivated:i&&l.some(e=>!e.isActive&&u.has(e.name))};return E(JSON.stringify(_,null,2))}function cn(e){return{...e,recommendations:e.recommendations.map(e=>({...e,callCommand:e.callCommand??en(e.name,e.inputSchema)}))}}async function ln(e,t){let n=t.task,r=t.context;if(typeof r==`string`&&r.trim().startsWith(`{`))try{let e=JSON.parse(r);e&&typeof e==`object`&&!Array.isArray(e)&&(r=e)}catch{}let i=r;if(!n||typeof n!=`string`)return E(JSON.stringify({success:!1,error:`task must be a non-empty string`}));let o=await j(e),s=i?.autoActivate===!0,c=cn(await nn({task:n,context:i},e,o));if(s){let t=c.recommendations.filter(e=>!e.isActive);if(t.length>0){let r=new Set,s=[];for(let n of t)n.domain&&!e.enabledDomains.has(n.domain)?r.add(n.domain):n.domain||s.push(n.name);let l=!1;for(let t of r)try{await A(e,{domain:t,ttlMinutes:a}),l=!0}catch{}let u=t.filter(e=>!r.has(e.domain??``)).map(e=>e.name);(u.length>0||s.length>0)&&(await Z(e,[...new Set([...u,...s])])).activated.length>0&&(l=!0),l&&(c=cn(await nn({task:n,context:{...i,autoActivate:!1}},e,o)),c.autoActivated=!0,c.activatedNames=t.map(e=>e.name).filter(t=>e.activatedToolNames.has(t)),c.callToolHint=`Tools were auto-activated but may not appear in your tool list. Use call_tool({ name: "<tool_name>", args: {...} }) to invoke them directly.`)}}return E(JSON.stringify(c,null,2))}async function un(e,t){let n=t.name;if(!n||typeof n!=`string`)return E(JSON.stringify({success:!1,error:`name must be a non-empty string`}));let r=tn(n,e);return E(r?JSON.stringify({success:!0,tool:r},null,2):JSON.stringify({success:!1,error:`Tool not found: ${n}`}))}function dn(e,t){return{wasAutoActivated:e,activatedTools:t}}function fn(e,t){return!e?.content||!Array.isArray(e.content)?e:{...e,content:e.content.map(e=>{if(e.type!==`text`||!(`text`in e)||typeof e.text!=`string`)return e;try{let n=JSON.parse(e.text);return!n||typeof n!=`object`||Array.isArray(n)?e:{...e,text:JSON.stringify({...n,...t},null,2)}}catch{return e}})}}async function pn(t,n){let r=typeof n.name==`string`?n.name:``,i=dn(!1,[]);if(!r)return E(JSON.stringify({success:!1,error:`name must be a non-empty string`,...i}));let a=N(r),o={},s=n.args??n.parameters??(typeof n.arguments==`string`?n.arguments:null);if(s&&typeof s==`object`&&!Array.isArray(s))o=s;else if(typeof s==`string`&&s.trim().length>0)try{let e=JSON.parse(s);e&&typeof e==`object`&&!Array.isArray(e)&&(o=e)}catch{}if(Object.keys(o).length===0&&!(`args`in n)&&!(`parameters`in n)&&!(`arguments`in n))for(let[e,t]of Object.entries(n))e!==`name`&&(o[e]=t);let c=i;if(!t.router.has(a))return E(JSON.stringify({success:!1,error:`Tool "${a}" is not currently active. Use activate_tools or activate_domain first, then call it directly.`,...c}));try{let e=await t.executeToolWithTracking(a,o);try{(await j(t)).recordToolCallFeedback(a,``)}catch{}return fn(e,c)}catch(t){let n=t instanceof Error?t.message:String(t);return e.error(`call_tool: execution of "${a}" failed`,t),E(JSON.stringify({success:!1,error:`Tool "${a}" failed: ${n}`,...c}))}}function mn(e){return[{name:`search_tools`,description:ye(e),inputSchema:{type:`object`,properties:{query:{type:`string`,description:`Before calling, distill your intent into 2-5 key concepts: what action, on what target, in which domain. Pass only those distilled keywords — not the original user request.`},top_k:{type:`number`,description:`Max results to return (default: 10, max: 30)`},auto_activate:{type:`boolean`,description:`Auto-activate found tools so they are immediately callable. Set false to only search without activating (default: true)`,default:!0}},required:[`query`]},handler:sn},{name:`route_tool`,description:`One-stop tool router: accepts a natural language task description, returns recommended tools and next actions. Automatically detects workflow patterns, recommends activation order, and provides example arguments. Use this instead of search_tools when you want guided tool discovery with actionable next steps.`,inputSchema:{type:`object`,properties:{task:{type:`string`,description:`Natural language description of the task you want to accomplish`},context:{type:`object`,description:`Optional context hints for routing`,properties:{preferredDomain:{type:`string`,description:`Domain preference (e.g., "browser", "network")`},autoActivate:{type:`boolean`,description:`Whether to auto-activate recommended tools (default: false)`},maxRecommendations:{type:`number`,description:`Maximum number of recommendations (default: 5)`}}}},required:[`task`]},handler:ln},{name:`describe_tool`,description:`Get detailed information about a specific tool, including its input schema. Use this to see the exact parameters a tool expects before calling it.`,inputSchema:{type:`object`,properties:{name:{type:`string`,description:`Tool name to describe`}},required:[`name`]},handler:un},{name:`activate_tools`,description:`Dynamically register specific tools by name, regardless of current base tier. Use after search_tools to enable exactly the tools you need. In search-tier sessions this is usually enough; you do not need boost_profile just to use a few exact tools. Activated tools appear in the tool list immediately. If tools do not appear after activation, use call_tool to invoke them directly.`,inputSchema:{type:`object`,properties:{names:{anyOf:[{type:`array`,items:{type:`string`}},{type:`string`,description:`JSON stringified array for MCP clients that serialize arrays as strings`}],description:`Array of tool names to activate (from search_tools results). Also accepts a JSON stringified array for clients that serialize arrays as strings.`}},required:[`names`]},handler:an},{name:`deactivate_tools`,description:`Remove previously activated tools to free context. Only affects tools added via activate_tools, not base profile tools.`,inputSchema:{type:`object`,properties:{names:{anyOf:[{type:`array`,items:{type:`string`}},{type:`string`,description:`JSON stringified array`}],description:`Array of tool names to deactivate`}},required:[`names`]},handler:on},{name:`activate_domain`,description:`Activate all tools in a domain at once. Domains: ${[...he()].join(`, `)}. Use reload_extensions first to include external plugin/workflow domains.`,inputSchema:{type:`object`,properties:{domain:{type:`string`,description:`Domain name to activate (e.g. "debugger", "network")`},ttlMinutes:{type:`number`,description:`Auto-deactivate after N minutes (default: 30, set 0 for no expiry)`}},required:[`domain`]},handler:A},{name:`call_tool`,description:`Execute an already-active tool by name. Use this when activate_tools/activate_domain registered a tool but your client did not refresh its tool list. Does not auto-activate inactive tools.`,inputSchema:{type:`object`,properties:{name:{type:`string`,description:`The tool name to execute (from search_tools or describe_tool results)`},args:{type:`object`,description:`Arguments object to pass to the tool`,additionalProperties:!0},parameters:{type:`string`,description:`Alternative: JSON-serialized arguments string. Some MCP clients serialize the nested arguments as a single stringified-JSON field.`},arguments:{type:`string`,description:`Another alternative: MCP clients that stringify the entire arguments wrapper. Carries the same nested {name, args/parameters} payload as a JSON string.`}},required:[`name`]},handler:pn}]}function hn(t){let n=mn(t);for(let r of n){let n=Xt(r.inputSchema);t.server.registerTool(r.name,{description:r.description,inputSchema:n},async n=>{try{return await r.handler(t,n)}catch(t){return e.error(`${r.name} failed`,t),ae(t)}}),t.metaToolsByName.set(r.name,{name:r.name,description:r.description.split(`
5
- `)[0]||r.description,inputSchema:r.inputSchema})}}function Q(e,t){return{contents:[{uri:e,mimeType:`application/json`,text:JSON.stringify(t,null,2)}]}}function gn(e,t,n){return{contents:[{uri:e,mimeType:n,text:t}]}}function _n(e){return e.getDomainInstance(`evidenceGraph`)}function $(e){return e.getDomainInstance(`instrumentationSessionManager`)}function vn(e){e.server.registerResource(`evidence_graph_json`,`jshook://evidence/graph`,{title:`Evidence Graph JSON`,description:`Serializable snapshot of the current reverse evidence graph.`,mimeType:`application/json`},async t=>{let n=_n(e);return Q(t.toString(),n?n.exportJson():{version:1,nodes:[],edges:[],exportedAt:new Date().toISOString()})}),e.server.registerResource(`evidence_graph_markdown`,`jshook://evidence/graph.md`,{title:`Evidence Graph Markdown`,description:`Markdown report for the current reverse evidence graph.`,mimeType:`text/markdown`},async t=>{let n=_n(e);return gn(t.toString(),n?n.exportMarkdown():`# Reverse Evidence Graph Report
2
+ import{t as e}from"./logger-sBC6IdRT.mjs";import{Bn as t,Bt as n,Cn as r,D as i,Dt as a,Et as o,Gt as s,Ht as c,O as l,Rr as u,Rt as d,Sn as f,Ut as p,Vn as m,Vt as h,Wt as g,a as _,bn as v,d as ee,i as y,l as b,n as x,r as S,t as C,u as w,xn as te,zt as ne}from"./constants-BYj8Xek8.mjs";import{a as re,i as ie,n as ae,r as oe,t as se}from"./artifactRetention-BCPQASm7.mjs";import{t as ce}from"./DetailedDataManager-DmQ1LT-W.mjs";import{r as T,t as le}from"./response-C7rKQst4.mjs";import{a as ue,c as de,d as fe,f as pe,h as me,i as he,l as ge,m as _e,n as ve,o as ye,p as E,r as D,u as be}from"./ToolCatalog-CYdD9F5f.mjs";import{t as O}from"./ToolError-DWU_z7gp.mjs";import{a as xe,c as Se,i as k,l as Ce,n as A,o as j,r as we,s as Te,u as Ee}from"./MCPServer.search.handlers.domain-BbS-6LnX.mjs";import{n as M,r as De,t as Oe}from"./ServerRuntimeState-D2bWHqEE.mjs";import{a as ke,r as Ae,t as je}from"./ExtensionManager.tools-oVMJgPcN.mjs";import{t as Me}from"./ProcessRegistry-C-bN48oR.mjs";import{i as Ne,n as Pe,r as Fe}from"./ExtensionManager-BD724zkO.mjs";import{_ as Ie,a as Le,b as Re,c as ze,d as Be,f as N,g as Ve,h as He,i as Ue,l as We,m as P,n as Ge,o as Ke,p as F,r as qe,s as Je,t as Ye,u as Xe,v as Ze,x as Qe,y as $e}from"./ToolRouter.policy-CfhJczkt.mjs";import{i as et,r as tt}from"./HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs";import{n as nt}from"./EventBus-DL8iLA09.mjs";import{n as rt,t as it}from"./BrowserSessionCoordinator-BJ-HOxo0.mjs";import{d as at,l as ot}from"./outputPaths-B4Ic4RZh.mjs";import{McpServer as st,ResourceTemplate as ct}from"@modelcontextprotocol/sdk/server/mcp.js";import{CompleteRequestSchema as lt,ErrorCode as I,McpError as L,isJSONRPCErrorResponse as R,isJSONRPCNotification as ut,isJSONRPCRequest as dt,isJSONRPCResultResponse as z}from"@modelcontextprotocol/sdk/types.js";import{promises as B}from"fs";import{join as ft}from"path";import{createHash as pt}from"crypto";import{homedir as mt}from"node:os";import{createServer as ht}from"node:http";import{StdioServerTransport as gt}from"@modelcontextprotocol/sdk/server/stdio.js";import{randomUUID as _t,timingSafeEqual as vt}from"node:crypto";import{StreamableHTTPServerTransport as yt}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{appendFileSync as bt,mkdirSync as xt,readFileSync as St}from"node:fs";import{dirname as Ct,join as wt,resolve as Tt}from"node:path";import{ZodError as Et,z as V}from"zod";import{fileURLToPath as Dt}from"node:url";import{mkdir as Ot,readFile as kt,rename as At,writeFile as jt}from"node:fs/promises";var Mt=class{config;constructor(e){this.config=e}async init(){if(this.config.enabled)try{await B.mkdir(this.config.dir,{recursive:!0}),e.debug(`Cache directory initialized: ${this.config.dir}`)}catch(t){e.error(`Failed to initialize cache directory`,t)}}generateKey(e){return pt(`md5`).update(e).digest(`hex`)}getCachePath(e){let t=this.generateKey(e);return ft(this.config.dir,`${t}.json`)}async get(t){if(!this.config.enabled)return null;try{let n=this.getCachePath(t),r=await B.readFile(n,`utf-8`),i=JSON.parse(r);return Date.now()-i.timestamp>this.config.ttl*1e3?(await this.delete(t),null):(e.debug(`Cache hit: ${t}`),i.value)}catch{return e.debug(`Cache miss: ${t}`),null}}async set(t,n){if(this.config.enabled)try{let r=this.getCachePath(t),i={timestamp:Date.now(),value:n};await B.writeFile(r,JSON.stringify(i),`utf-8`),e.debug(`Cache set: ${t}`)}catch(t){e.error(`Failed to set cache`,t)}}async delete(t){if(this.config.enabled)try{let n=this.getCachePath(t);await B.unlink(n),e.debug(`Cache deleted: ${t}`)}catch(t){t.code!==`ENOENT`&&e.warn(`Cache delete failed:`,t)}}async clear(){if(this.config.enabled)try{let t=await B.readdir(this.config.dir);await Promise.all(t.map(e=>B.unlink(ft(this.config.dir,e)))),e.info(`Cache cleared`)}catch(t){if(t.code===`ENOENT`)return;e.error(`Failed to clear cache`,t)}}},Nt=class{mcpServer;constructor(e){this.mcpServer=e}isSamplingSupported(){try{return!!this.mcpServer.server.getClientCapabilities()?.sampling}catch{return!1}}async sampleText(t){if(!this.isSamplingSupported())return e.debug(`Sampling not supported by connected client, skipping LLM delegation`),null;try{let n=(await this.mcpServer.server.createMessage({messages:[{role:`user`,content:{type:`text`,text:t.userMessage}}],systemPrompt:t.systemPrompt,maxTokens:t.maxTokens??512,...t.temperature===void 0?{}:{temperature:t.temperature},...t.modelHint?{modelPreferences:{hints:[{name:t.modelHint}],intelligencePriority:.8,speedPriority:.7,costPriority:.3}}:{}})).content;if(Array.isArray(n)){let e=n.filter(e=>e.type===`text`).map(e=>e.text);return e.length>0?e.join(``):null}return n&&typeof n==`object`&&`type`in n&&n.type===`text`?n.text:(e.warn(`sampling/createMessage returned non-text content`),null)}catch(t){return e.warn(`LLM sampling request failed:`,t),null}}},Pt=class{mcpServer;constructor(e){this.mcpServer=e}isElicitationSupported(){try{return!!this.mcpServer.server.getClientCapabilities()?.elicitation}catch{return!1}}async requestFormInput(t){if(!this.isElicitationSupported())return e.debug(`Elicitation not supported by connected client`),null;try{let e=await this.mcpServer.server.elicitInput(t);return{action:e.action,content:e.content}}catch(t){return e.warn(`Elicitation request failed:`,t),null}}async requestConfirmation(e){let t=await this.requestFormInput({message:e,requestedSchema:{type:`object`,properties:{confirmed:{type:`boolean`,description:`Confirm this action`,title:`Confirm`,default:!0}},required:[`confirmed`]}});return t?.action===`accept`&&t.content?.confirmed===!0}async requestCaptchaSolution(e,t){let n=await this.requestFormInput({message:[`🛡️ CAPTCHA detected: **${t}**`,``,`Page: ${e}`,``,`Please solve the CAPTCHA in your browser, then confirm completion below.`,`If a token/response was generated, paste it in the token field.`].join(`
3
+ `),requestedSchema:{type:`object`,properties:{solved:{type:`boolean`,description:`Have you solved the CAPTCHA?`,title:`CAPTCHA Solved`,default:!1},token:{type:`string`,description:`CAPTCHA response token (if available)`,title:`Response Token`}},required:[`solved`]}});return!n||n.action!==`accept`?null:{solved:n.content?.solved===!0,token:typeof n.content?.token==`string`?n.content.token:void 0}}},Ft=class{handlers;constructor(e){this.handlers=new Map(Object.entries(e))}has(e){return this.handlers.has(e)}listToolNames(){return Array.from(this.handlers.keys())}addHandlers(e){for(let[t,n]of Object.entries(e))this.handlers.set(t,n)}removeHandler(e){this.handlers.delete(e)}async execute(e,t){let n=this.handlers.get(e);if(!n)throw new O(`NOT_FOUND`,`Unknown tool: ${e}`,{toolName:e});return n(t)}};const It=[`page_`,`console_`,`debugger_`,`network_`,`dom_`,`stealth_`,`framework_`,`indexeddb_`,`js_heap_`,`script_`,`captcha_`,`ai_hook_`,`instrumentation_`,`hook_preset_`,`ws_`,`evidence_`],Lt=new Set([`network_icmp_probe`,`network_traceroute`,`network_rtt_measure`,`http_request_build`,`http_plain_request`,`http2_probe`,`http2_frame_build`,`dns_resolve`,`dns_reverse`]),Rt=new Set([`search_tools`,`route_tool`,`describe_tool`,`call_tool`,`activate_tools`,`deactivate_tools`,`activate_domain`]),zt=new Map([[`stealth`,[`page_navigate`,`page_evaluate`,`stealth_verify`,`page_screenshot`]],[`page`,[`browser_jsdom_parse`,`js_bundle_search`,`network_get_requests`,`page_screenshot`]],[`console`,[`page_evaluate`,`console_get_logs`,`page_screenshot`]],[`network`,[`network_get_requests`,`page_navigate`]],[`captcha`,[`captcha_wait`,`page_screenshot`]],[`ai_hook`,[`manage_hooks`,`page_evaluate`,`ai_hook_inject`]],[`instrumentation`,[`instrumentation_session`,`instrumentation_artifact`]],[`evidence`,[`evidence_query`,`evidence_chain`]]]);var Bt=class{getProvider;contextSensitiveCache=new Map;lastToolName=null;consecutiveCount=0;constructor(e){this.getProvider=e}isContextSensitive(e){let t=this.contextSensitiveCache.get(e);if(t!==void 0)return t;if(Lt.has(e))return this.contextSensitiveCache.set(e,!1),!1;let n=It.some(t=>e.startsWith(t));return this.contextSensitiveCache.set(e,n),n}recordCall(e){return Rt.has(e)?0:(e===this.lastToolName?this.consecutiveCount++:(this.lastToolName=e,this.consecutiveCount=1),this.consecutiveCount)}isRepeatLoop(){return this.consecutiveCount>=3}enrichResponse(t,n){if(this.isRepeatLoop()&&!Rt.has(t)&&this.injectRepeatWarning(t,n),!this.isContextSensitive(t)||n.isError)return n;let r=this.getProvider();if(!r||typeof r.getContextMeta!=`function`)return n;let i=r.getContextMeta();if(!i.pageId&&i.tabIndex===null)return n;let a=n.content;if(!Array.isArray(a))return n;let o=a.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(!o)return n;let s=o.text,c=s.trimStart();if(c.startsWith(`{`)&&c.trimEnd().endsWith(`}`))try{let e=JSON.parse(s);if(typeof e==`object`&&e&&!Array.isArray(e))return`_tabContext`in e||(o.text=this.spliceTabContext(s,i)),n}catch{return e.debug(`[ContextGuard] Skipped non-JSON response enrichment for ${t}`),n}return n}spliceTabContext(e,t){let n={url:t.url,title:t.title,tabIndex:t.tabIndex,pageId:t.pageId};if(/\n\}\s*$/.test(e)){let t=JSON.stringify(n,null,2).replace(/\n/g,`
4
+ `);return e.replace(/\n\}\s*$/,`,\n "_tabContext": ${t}\n}`)}let r=JSON.stringify(n);return/^\{\s*\}\s*$/.test(e)?e.replace(/\{\s*\}\s*$/,`{"_tabContext":${r}}`):e.replace(/\}\s*$/,`,"_tabContext":${r}}`)}injectRepeatWarning(e,t){let n=e.split(`_`)[0]??``,r=(e===`page_evaluate`?[`browser_jsdom_parse`,`js_bundle_search`,`network_get_requests`,`page_screenshot`]:zt.get(n)??[`page_navigate`,`page_evaluate`]).filter(t=>t!==e),i={detected:!0,consecutiveCount:this.consecutiveCount,message:`⚠ You have called "${e}" ${this.consecutiveCount} times in a row. This is likely a loop — consider what you actually need to do next.`,suggestedTools:r,hint:r.length>0?`Try calling ${r[0]} instead.`:`Re-evaluate your task objective before making another tool call.`},a=t.content;if(!Array.isArray(a))return;let o=a.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(o){let e=o.text;try{let t=JSON.parse(e);if(typeof t==`object`&&t&&!Array.isArray(t)){t.repeatWarning=i,o.text=JSON.stringify(t,null,2);return}}catch{}}a.push({type:`text`,text:JSON.stringify({repeatWarning:i},null,2)})}};const Vt=3e4;var Ht=class{states=new Map;halfOpenCalls=new Map;listeners=new Set;onChange(e){this.listeners.add(e)}emit(e,t){for(let n of this.listeners)try{n(e,t)}catch{}}getState(e){return this.states.get(e)}shouldBlock(t){let n=this.states.get(t);if(!n||n.state===`closed`)return!1;if(n.state===`open`)return Date.now()-n.lastFailureTime>=Vt?(n.state=`half-open`,this.halfOpenCalls.set(t,1),e.info(`[CircuitBreaker] ${t}: open → half-open`),!1):!0;if(n.state===`half-open`){let e=this.halfOpenCalls.get(t)??0;return e>=1?!0:(this.halfOpenCalls.set(t,e+1),!1)}return!1}recordSuccess(t){let n=this.states.get(t);if(n){if(n.state===`half-open`){n.state=`closed`,n.failureCount=0,this.halfOpenCalls.delete(t),e.info(`[CircuitBreaker] ${t}: half-open → closed`),this.emit(`recovered`,t);return}n.failureCount=0}}recordFailure(t){let n=this.states.get(t);if(n||(n={toolName:t,failureCount:0,lastFailureTime:0,state:`closed`},this.states.set(t,n)),n.failureCount++,n.lastFailureTime=Date.now(),n.state===`half-open`){n.state=`open`,this.halfOpenCalls.delete(t),e.warn(`[CircuitBreaker] ${t}: half-open → open (probe failed)`),this.emit(`opened`,t);return}n.state===`closed`&&n.failureCount>=3&&(n.state=`open`,e.warn(`[CircuitBreaker] ${t}: closed → open (${n.failureCount} consecutive failures)`),this.emit(`opened`,t))}getStates(){return Array.from(this.states.values())}reset(e){this.states.delete(e),this.halfOpenCalls.delete(e)}getRecoveryMs(){return Vt}};const H=/^data:([a-zA-Z0-9/+-]+);base64,/,Ut=/"_?offload"|detailId|_filePath/;var Wt=class{detailedData;detailThreshold;fileThreshold;excludeTools;constructor(e,t={}){this.detailedData=e,this.detailThreshold=t.detailThreshold??512*1024,this.fileThreshold=t.fileThreshold??4*1024*1024,this.excludeTools=t.excludeTools??new Set}formatSize(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(1)}MB`}storeInDetailManager(t,n,r){let i=this.detailedData.store(t),a=this.detailedData.cache.get(i)?.size??0;return e.info(`[Offloader] Stored in DetailDataManager (${this.formatSize(a)}) → detailId=${i}`),{_offload:{type:`detailId`,detailId:i,size:this.formatSize(a)}}}tryParseJson(e){try{let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))return JSON.parse(t)}catch{}return null}offload(t,n){if(n.isError||this.excludeTools.has(t))return n;let r=n.content;if(!Array.isArray(r))return n;let i=!1;for(let e=0;e<r.length;e++){let n=r[e];if(typeof n!=`object`||!n)continue;let a=n;if(a.type!==`text`&&a.type!==`resource`)continue;let o=a.text;if(typeof o!=`string`||o.length<this.detailThreshold||Ut.test(o))continue;if(H.test(o)){r[e]={...a,text:JSON.stringify({_offload:{type:`file`,pending:!0,dataUriLength:o.length,hint:`Use get_detailed_data() or read file after async offload completes`,size:this.formatSize(o.length),mimeType:o.match(H)?.[1]??`application/octet-stream`}},null,2)},i=!0;continue}let s=this.tryParseJson(o);if(s!==null){r[e]={...a,text:JSON.stringify(this.storeInDetailManager(s,t,e),null,2)},i=!0;continue}if(o.length>=this.fileThreshold){r[e]={...a,text:JSON.stringify({_offload:{type:`file`,pending:!0,hint:`Large raw string — use get_detailed_data() or await async offload`,size:this.formatSize(o.length)}},null,2)},i=!0;continue}}return i&&e.debug(`[Offloader] Offloaded large data from ${t}`),n}async offloadAsync(t,n){if(n.isError||this.excludeTools.has(t))return n;let r=n.content;if(!Array.isArray(r))return n;for(let t=0;t<r.length;t++){let n=r[t];if(typeof n!=`object`||!n)continue;let i=n;if(i.type!==`text`)continue;let a=i.text;if(typeof a==`string`)try{let n=JSON.parse(a);n?._offload?.pending&&H.test(n._offload.mimeType?`data:${n._offload.mimeType};base64,`:``)&&e.debug(`[Offloader] Skipping async write for already-placeholdered entry ${t}`)}catch{}}return n}};function Gt(){let t=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),n=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase(),r=ye(process.env.MCP_TOOL_DOMAINS);if(r&&r.length>0){let t=he(r);return e.info(`Tool registration mode=domains [${r.join(`,`)}], count=${t.length}`),{tools:t,profile:n===`full`||n===`workflow`||n===`search`?n:`search`}}let i;i=n===`full`||n===`workflow`||n===`search`?n:`search`;let a=ue(i);return i===`search`?e.info(`Tool registration mode=search bootstrap, transport=${t}, baseCount=${a.length}. Meta-tools remain available for domain activation and call_tool bridging.`):e.info(`Tool registration mode=${i}, transport=${t}, count=${a.length}`),{tools:a,profile:i}}function U(e){return(typeof e==`object`||typeof e==`function`)&&e!==null&&typeof e.then==`function`}function Kt(e){let t=new Set;for(let n of e){let e=D(n.name);e&&t.add(e)}return t}function W(t,n,r,i){let a={domain:n,label:r},o,s,c=`unknown`,l=0;function u(e,t){let n=e[t];return typeof n==`function`?n.bind(e):n}function d(){if(s)return s;if(o)return o;if(l>0)throw new O(`RUNTIME`,`${r}: circular initialization detected for domain "${n}"`,{details:a});e.info(`Lazy-initializing ${r} for domain "${n}"`),l++;try{let e=i();return U(e)?(c=`async`,o=Promise.resolve(e).then(e=>(s=e,e)),o):(c=`sync`,s=e,o=Promise.resolve(e),e)}finally{l--}}async function f(){let e=d();return U(e)?await e:e}function p(e){let t=()=>f().then(t=>u(t,e));return new Proxy((...t)=>f().then(n=>{let r=n[e];return typeof r==`function`?r.call(n,...t):r}),{get:(e,n,r)=>n===`then`?(...e)=>t().then(...e):n===`catch`?(...e)=>t().catch(...e):n===`finally`?(...e)=>t().finally(...e):Reflect.get(e,n,r)})}return new Proxy({},{get:(e,i)=>{if(!t.enabledDomains.has(n))return()=>{throw new O(`PREREQUISITE`,`${r} is unavailable: domain "${n}" not enabled by current tool profile`,{details:a})};if(i===`then`||i===`catch`||i===Symbol.toStringTag)return;if(s&&c===`sync`)return u(s,i);let o=d();return U(o)?p(i):u(o,i)}})}const qt=new Set([`http://127.0.0.1`,`http://localhost`,`http://[::1]`]);function Jt(e,t){let n=e.headers.origin;if(!n)return!0;let r;try{let e=new URL(n);r=`${e.protocol}//${e.hostname}`}catch{return t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – invalid Origin header`),!1}return qt.has(r)||process.env.MCP_AUTH_TOKEN?!0:(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – cross-origin requests require MCP_AUTH_TOKEN`),!1)}function Yt(e,t){let n=process.env.MCP_AUTH_TOKEN;if(!n){let e=process.env.MCP_HOST??`127.0.0.1`;return!new Set([`127.0.0.1`,`localhost`,`::1`]).has(e)&&![`1`,`true`].includes((process.env.MCP_ALLOW_INSECURE??``).toLowerCase())?(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – MCP_AUTH_TOKEN is required when binding to non-localhost. Set MCP_ALLOW_INSECURE=1 to override.`),!1):!0}let r=e.headers.authorization;if(!r?.startsWith(`Bearer `))return t.writeHead(401,{"Content-Type":`text/plain`}),t.end(`Unauthorized – missing or malformed Authorization header`),!1;let i=r.slice(7),a=Buffer.from(i),o=Buffer.from(n);return a.length!==o.length||!vt(a,o)?(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – invalid token`),!1):!0}const Xt=(()=>{let e=parseInt(process.env.MCP_MAX_BODY_BYTES??``,10);return Number.isFinite(e)&&e>0?e:10*1024*1024})();function Zt(e,t,n=Xt){return new Promise((r,i)=>{let a=[],o=0,s=parseInt(e.headers[`content-length`]??``,10);if(!isNaN(s)&&s>n){t.writeHead(413,{"Content-Type":`text/plain`}),t.end(`Payload Too Large – limit is ${n} bytes`),i(Error(`body_too_large`));return}let c=!1;e.on(`data`,r=>{if(!c){if(o+=r.length,o>n){c=!0,t.writeHead(413,{"Content-Type":`text/plain`}),t.end(`Payload Too Large – limit is ${n} bytes`,()=>{e.destroy()}),i(Error(`body_too_large`));return}a.push(r)}}),e.on(`end`,()=>{if(!c)try{r(JSON.parse(Buffer.concat(a).toString(`utf8`)))}catch{t.writeHead(400,{"Content-Type":`text/plain`}),t.end(`Bad Request – invalid JSON body`),i(Error(`invalid_json`))}}),e.on(`error`,e=>i(e))})}const G=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_WINDOW_MS??``,10);return Number.isFinite(e)&&e>0?e:6e4})(),Qt=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_MAX??``,10);return Number.isFinite(e)&&e>0?e:60})(),K=new Map,$t=a,en=o;let tn=Date.now();function nn(e){if(e-tn<en)return;tn=e;let t=e-G;for(let[e,n]of K)n.timestamps=n.timestamps.filter(e=>e>t),n.timestamps.length===0&&K.delete(e)}function rn(){if(K.size<=$t)return;let e=Math.ceil($t*.1),t=0;for(let n of K.keys()){if(t>=e)break;K.delete(n),t++}}function an(e){if([`1`,`true`].includes((process.env.MCP_TRUST_PROXY??``).toLowerCase())){let t=e.headers[`x-forwarded-for`];if(t)return(Array.isArray(t)?t[0]:t.split(`,`)[0]).trim()}return e.socket.remoteAddress??`unknown`}function on(e,t,n=!1){if([`0`,`false`].includes((process.env.MCP_RATE_LIMIT_ENABLED??``).toLowerCase()))return!0;let r=n?Qt*3:Qt,i=Date.now();nn(i),rn();let a=an(e),o=K.get(a);o||(o={timestamps:[]},K.set(a,o));let s=i-G;if(o.timestamps=o.timestamps.filter(e=>e>s),o.timestamps.length>=r){let e=Math.ceil(G/1e3);return t.writeHead(429,{"Content-Type":`text/plain`,"Retry-After":String(e)}),t.end(`Too Many Requests – limit is ${r} per ${e}s window`),!1}return o.timestamps.push(i),!0}function sn(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?typeof t[0]==`string`&&t[0].trim().length>0?t[0].trim():null:typeof t==`string`&&t.trim().length>0?t.trim():null}function q(e){return typeof e==`string`?`s:${e}`:`n:${String(e)}`}var cn=class{onclose;onerror;onmessage;sessionId;started=!1;sessions=new Map;requestRoutes=new Map;sessionOriginalToInternal=new Map;requestSequence=0;async start(){if(this.started)throw Error(`MultiplexedStreamableHttpTransport already started`);this.started=!0}async close(){let e=[...this.sessions.values()];this.sessions.clear(),this.requestRoutes.clear(),this.sessionOriginalToInternal.clear(),await Promise.allSettled(e.map(e=>e.transport.close())),this.onclose?.()}async send(e,t){let n=this.resolveRouteKey(e,t);if(n){let r=this.requestRoutes.get(n);if(r){let i=z(e)||R(e)?{...e,id:r.originalId}:e,a=t?.relatedRequestId===void 0?t:{...t,relatedRequestId:r.originalId};await r.transport.send(i,a),(z(e)||R(e))&&this.releaseRequestRoute(n,r);return}}let r=[...this.sessions.values()];if(r.length!==0){if(ut(e)){await Promise.allSettled(r.map(n=>n.transport.send(e,t)));return}if(r.length===1){await r[0].transport.send(e,t);return}throw Error(`Ambiguous HTTP session for outbound request/response routing.`)}}async handleRequest(e,t,n){let r=sn(e);if(r){let i=this.sessions.get(r);if(!i){t.writeHead(404,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,error:{code:-32e3,message:`Unknown MCP session: ${r}`},id:null}));return}await i.transport.handleRequest(e,t,n);return}let i=this.createInnerTransport();await i.handleRequest(e,t,n),i.sessionId&&!this.sessions.has(i.sessionId)&&this.sessions.set(i.sessionId,{sessionId:i.sessionId,transport:i})}createInnerTransport(){let e=new yt({sessionIdGenerator:()=>_t()});return e.onmessage=(t,n)=>{let r=e.sessionId,i=r?this.rewriteInboundMessage(r,e,t):t;this.onmessage?.(i,{...n})},e.onerror=e=>{this.onerror?.(e)},e.onclose=()=>{e.sessionId&&this.dropSession(e.sessionId)},e}rewriteInboundMessage(e,t,n){if(dt(n)){let r=`http:${e}:${++this.requestSequence}`;this.requestRoutes.set(r,{sessionId:e,originalId:n.id,transport:t});let i=this.sessionOriginalToInternal.get(e);return i||(i=new Map,this.sessionOriginalToInternal.set(e,i)),i.set(q(n.id),r),{...n,id:r}}if(ut(n)&&n.method===`notifications/cancelled`){let t=typeof n.params==`object`&&n.params!==null?n.params:null,r=t?.requestId;if(typeof r==`string`||typeof r==`number`){let i=this.sessionOriginalToInternal.get(e)?.get(q(r));if(i)return{...n,params:{...t,requestId:i}}}}return n}resolveRouteKey(e,t){return t?.relatedRequestId===void 0?z(e)||R(e)?String(e.id):null:String(t.relatedRequestId)}releaseRequestRoute(e,t){this.requestRoutes.delete(e);let n=this.sessionOriginalToInternal.get(t.sessionId);n&&(n.delete(q(t.originalId)),n.size===0&&this.sessionOriginalToInternal.delete(t.sessionId))}dropSession(t){this.sessions.delete(t),this.sessionOriginalToInternal.delete(t);for(let[e,n]of this.requestRoutes)n.sessionId===t&&this.requestRoutes.delete(e);e.info(`[http] MCP session closed: ${t}`)}};async function ln(t){let n=new gt;if(typeof n.send==`function`){let t=n.send.bind(n);n.send=n=>new Promise(r=>{let i=setTimeout(()=>{e.warn(`transport.send() timed out — stdout broken, skipping write`),r()},500);t(n).then(()=>clearTimeout(i)).catch(()=>clearTimeout(i)).finally(r)})}n.onclose=()=>{t.shutdownStarted||(e.info(`stdio transport closed — running cleanup...`),J(t).catch(t=>e.warn(`cleanup after transport close failed:`,t)))},await t.server.connect(n);let r=!1,i=()=>{r||(r=!0,e.info(`stdin EOF — parent disconnected, shutting down...`),J(t).catch(t=>e.warn(`stdin EOF cleanup failed:`,t)).finally(()=>process.exit(0)))};process.stdin.on(`end`,i),process.stdin.on(`close`,i),e.success(`MCP stdio server started`)}async function un(t){let r=parseInt(process.env.MCP_PORT??`3000`,10),i=process.env.MCP_HOST??`127.0.0.1`,a=new cn;await t.server.connect(a),t.httpServer=ht((e,n)=>{let i=new URL(e.url??`/`,`http://localhost:${r}`);if(i.pathname===`/health`&&e.method===`GET`){dn(t,n);return}if(i.pathname!==`/mcp`){n.writeHead(404,{"Content-Type":`text/plain`}),n.end(`Not Found – use POST /mcp or GET /health`);return}if(!Jt(e,n))return;let o=Yt(e,n);if(o&&on(e,n,o)){if(e.method===`GET`||e.method===`DELETE`){a.handleRequest(e,n);return}if(e.method===`POST`){Zt(e,n).then(t=>a.handleRequest(e,n,t)).catch(()=>{});return}n.writeHead(405,{"Content-Type":`text/plain`}),n.end(`Method Not Allowed`)}});let o=t.httpServer;if(!o)throw Error(`HTTP server initialization failed`);o.requestTimeout=c,o.headersTimeout=n,o.keepAliveTimeout=h,o.on(`connection`,e=>{t.httpSockets.add(e),e.on(`close`,()=>t.httpSockets.delete(e))}),await new Promise((t,n)=>{o.listen(r,i,()=>{e.success(`MCP Streamable HTTP server listening on http://${i}:${r}/mcp`),t()}),o.on(`error`,n)})}function dn(e,t){let n=[`1`,`true`].includes((process.env.MCP_HEALTH_VERBOSE??``).toLowerCase()),r={status:`ok`,uptime:process.uptime()};if(n){let t=e.tokenBudget.getStats();r.tier=e.baseTier,r.baseTier=e.baseTier,r.enabledDomains=[...e.enabledDomains],r.registeredTools=e.selectedTools.length,r.activatedTools=e.activatedToolNames.size,r.tokenBudget={usagePercentage:t.usagePercentage,currentUsage:t.currentUsage,maxTokens:t.maxTokens}}t.writeHead(200,{"Content-Type":`application/json`}),t.end(JSON.stringify(r))}async function J(t){return t.shutdownStarted?t.shutdownPromise??Promise.resolve():(t.shutdownStarted=!0,t.shutdownPromise=(async()=>{let n=typeof t.getDomainInstance==`function`?t.getDomainInstance.bind(t):null;if(n){let t=n(`snapshotScheduler`);if(t)try{await t.flushAll(),t.dispose()}catch(t){e.warn(`snapshot flush on shutdown failed:`,t)}}for(let[,e]of t.domainTtlEntries)clearTimeout(e.timer);t.domainTtlEntries.clear(),t.detailedData.shutdown();let r=typeof t.getDomainInstance==`function`?t.getDomainInstance(`activationController`):t.activationController??void 0;if(r&&typeof r.dispose==`function`)try{r.dispose()}catch(t){e.warn(`activationController cleanup failed:`,t)}if(t.httpServer){let e=t.httpServer,n=new Promise(t=>e.close(()=>t())),r=setTimeout(()=>{for(let e of t.httpSockets)e.destroy()},ne);await n,clearTimeout(r),t.httpSockets.clear(),t.httpServer=void 0}let i=[[`consoleMonitor`,t.consoleMonitor,`disable`],[`runtimeInspector`,t.runtimeInspector,`close`],[`debuggerManager`,t.debuggerManager,`close`],[`scriptManager`,t.scriptManager,`close`],[`transformHandlers`,t.transformHandlers,`close`]];for(let[t,n,r]of i)if(n)try{let e=n[r];typeof e==`function`&&await e.call(n)}catch(n){e.warn(`${t} cleanup failed:`,n)}if(t.consoleMonitor=void 0,t.runtimeInspector=void 0,t.debuggerManager=void 0,t.scriptManager=void 0,t.collector){try{await t.collector.close()}catch(t){e.warn(`collector cleanup failed:`,t)}t.collector=void 0}try{await t.server.close()}catch(t){e.warn(`MCP server close failed:`,t)}try{await Me.terminateAll()}catch(t){e.warn(`ProcessRegistry cleanup failed:`,t)}e.success(`MCP server closed`)})(),t.shutdownPromise)}const fn={debug:0,info:1,warning:2,error:3},pn={debug:`debug`,info:`info`,warning:`warning`,error:`error`};var mn=class{server=null;minLevel=`info`;enabled=!1;filePath;attach(e,t){this.server=e,this.enabled=t}setEnabled(e){this.enabled=e}setLevel(e){this.minLevel=e}enableFileLogging(e){try{xt(e,{recursive:!0});let t=new Date().toISOString().replace(/[:.]/g,`-`);this.filePath=wt(e,`jshookmcp-${t}.log`)}catch{}}getFilePath(){return this.filePath}log(e,t,n){!this.enabled||!this.server||fn[e]<fn[this.minLevel]||(this.server.server.sendLoggingMessage({level:pn[e],logger:t,data:JSON.stringify(n)}).catch(()=>void 0),this.writeToFile(e,t,n))}writeToFile(e,t,n){if(this.filePath)try{let r=JSON.stringify({timestamp:new Date().toISOString(),level:e,logger:t,...n})+`
5
+ `;bt(this.filePath,r,`utf8`)}catch{}}debug(e,t){this.log(`debug`,e,t)}info(e,t){this.log(`info`,e,t)}warning(e,t){this.log(`warning`,e,t)}error(e,t){this.log(`error`,e,t)}};const hn=[{id:`wasm-chrome-macos`,name:`WASM inside Chrome on macOS`,conditions:[{type:`platform`,value:`darwin`},{type:`domain_active`,domain:`browser`},{type:`event_count`,event:`tool:called`,minCount:2,windowMs:i}],boostDomains:[`wasm`,`transform`],priority:20},{id:`debug-memory`,name:`Debug + Memory inspection`,conditions:[{type:`domain_active`,domain:`debugger`},{type:`event_count`,event:`debugger:breakpoint_hit`,minCount:1,windowMs:i}],boostDomains:[`memory`],priority:15},{id:`network-intercept-flow`,name:`Network interception workflow`,conditions:[{type:`domain_active`,domain:`network`},{type:`domain_active`,domain:`browser`}],boostDomains:[`hooks`],priority:10},{id:`skia-to-v8-correlation`,name:`Skia scene + V8 heap correlation`,conditions:[{type:`domain_active`,domain:`skia-capture`},{type:`event_count`,event:`v8:heap_captured`,minCount:1,windowMs:l}],boostDomains:[`cross-domain`,`v8-inspector`],priority:22},{id:`mojo-browser-network`,name:`Mojo IPC inside Chromium with active browser`,conditions:[{type:`domain_active`,domain:`mojo-ipc`},{type:`domain_active`,domain:`browser`}],boostDomains:[`network`,`cross-domain`],priority:18},{id:`frida-binary-trace`,name:`Frida attached → trace + cross-domain`,conditions:[{type:`tool_called_recently`,toolName:`frida_attach`,withinMs:l}],boostDomains:[`binary-instrument`,`trace`,`cross-domain`],priority:16},{id:`tls-capture-to-network`,name:`TLS keylog captured → network replay prep`,conditions:[{type:`domain_active`,domain:`boringssl-inspector`}],boostDomains:[`network`],priority:12},{id:`syscall-js-correlation`,name:`Syscall trace live → JS correlation`,conditions:[{type:`domain_active`,domain:`syscall-hook`},{type:`event_count`,event:`tool:called`,minCount:1,windowMs:l}],boostDomains:[`cross-domain`],priority:14}];var gn=class{conditions;constructor(e=[]){this.conditions=[...hn,...e].toSorted((e,t)=>t.priority-e.priority)}evaluate(e){let t=new Set;for(let n of this.conditions)if(this.allConditionsMet(n,e))for(let e of n.boostDomains)t.add(e);return[...t]}allConditionsMet(e,t){return e.conditions.every(e=>this.evaluatePredicate(e,t))}evaluatePredicate(e,t){let n=Date.now();switch(e.type){case`platform`:return t.platform===e.value;case`domain_active`:return t.activeDomains.has(e.domain);case`event_count`:{let r=n-e.windowMs;return t.eventHistory.filter(t=>t.event.startsWith(e.event)&&t.timestamp>=r).length>=e.minCount}case`tool_called_recently`:{let r=n-e.withinMs;return t.eventHistory.some(t=>t.event===`tool:called`&&t.timestamp>=r&&t.payload?.toolName===e.toolName)}default:return!1}}get conditionCount(){return this.conditions.length}},_n=class{callHistory=[];maxHistory;confidenceThreshold;decayFactor;transitions=new Map;transitions2=new Map;maxSecondOrderKeys;constructor(e={}){this.maxHistory=e.maxHistory??f,this.confidenceThreshold=e.confidenceThreshold??v,this.decayFactor=e.decayFactor??te,this.maxSecondOrderKeys=e.maxSecondOrderKeys??r}recordCall(e){let t=this.callHistory.length>0?this.callHistory[this.callHistory.length-1]:null,n=this.callHistory.length>1?this.callHistory[this.callHistory.length-2]:null;if(this.callHistory.push(e),this.callHistory.length>this.maxHistory&&this.callHistory.splice(0,this.callHistory.length-this.maxHistory),this.applyDecay(this.transitions),this.applyDecay(this.transitions2),t&&this.bumpTransition(this.transitions,t,e),n&&t){let r=`${n}\u0001${t}`;this.bumpTransition(this.transitions2,r,e),this.enforceSecondOrderCap()}}predictNext(e){let t=this.callHistory.length>1?this.callHistory[this.callHistory.length-2]:null;if(t){let n=`${t}\u0001${e}`,r=this.transitions2.get(n),i=this.pickPredictions(r);if(i.length>0)return i}return this.pickPredictions(this.transitions.get(e))}predictNextDomains(e,t){let n=this.predictNext(e),r=new Set;for(let e of n){let n=t(e);n&&r.add(n)}return[...r]}get historyLength(){return this.callHistory.length}get transitionCount(){return this.transitions.size}get secondOrderTransitionCount(){return this.transitions2.size}reset(){this.callHistory.length=0,this.transitions.clear(),this.transitions2.clear()}applyDecay(e){if(!(this.decayFactor>=1))for(let[,t]of e)for(let[e,n]of t){let r=n*this.decayFactor;r<.01?t.delete(e):t.set(e,r)}}bumpTransition(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r)),r.set(n,(r.get(n)??0)+1)}enforceSecondOrderCap(){if(this.transitions2.size<=this.maxSecondOrderKeys)return;let e=this.transitions2.size-this.maxSecondOrderKeys,t=this.transitions2.keys();for(let n=0;n<e;n++){let{value:e,done:n}=t.next();if(n||!e)break;this.transitions2.delete(e)}}pickPredictions(e){if(!e||e.size===0)return[];let t=0;for(let n of e.values())t+=n;if(t===0)return[];let n=[];for(let[r,i]of e){let e=i/t;e>=this.confidenceThreshold&&n.push({tool:r,confidence:e})}return n.sort((e,t)=>t.confidence-e.confidence),n.map(e=>e.tool)}},vn=class{lastActivity=new Map;baseDomains;autoActivatedDomains=new Set;autoInactivityMs;manualInactivityMs;checkIntervalMs;checkTimer=null;eventBus;onPrune;constructor(e,t,n,r={}){this.eventBus=e,this.baseDomains=t,this.onPrune=n,this.autoInactivityMs=r.autoActivatedInactivityMs??b,this.manualInactivityMs=r.manualActivatedInactivityMs??ee,this.checkIntervalMs=r.checkIntervalMs??w,this.startCheckTimer()}recordActivity(e){this.lastActivity.set(e,Date.now())}markAutoActivated(e){this.autoActivatedDomains.add(e),this.lastActivity.set(e,Date.now())}startCheckTimer(){this.checkTimer=setInterval(()=>{this.checkAndPrune()},this.checkIntervalMs),this.checkTimer.unref&&this.checkTimer.unref()}checkAndPrune(){let t=Date.now();for(let[n,r]of this.lastActivity.entries()){if(this.baseDomains.has(n))continue;let i=t-r,a=this.autoActivatedDomains.has(n)?this.autoInactivityMs:this.manualInactivityMs;i>=a&&(e.info(`[AutoPruner] Pruning domain "${n}" — inactive for ${Math.round(i/1e3)}s (threshold: ${Math.round(a/1e3)}s)`),this.onPrune(n),this.lastActivity.delete(n),this.autoActivatedDomains.delete(n),this.eventBus.emit(`activation:domain_pruned`,{domain:n,reason:`inactivity (${Math.round(i/1e3)}s)`,timestamp:new Date().toISOString()}))}}getLastActivity(e){return this.lastActivity.get(e)}isAutoActivated(e){return this.autoActivatedDomains.has(e)}dispose(){this.checkTimer&&=(clearInterval(this.checkTimer),null),this.lastActivity.clear(),this.autoActivatedDomains.clear()}};const yn=[{eventPattern:`debugger:breakpoint_hit`,targetDomains:[`debugger`],threshold:1,windowMs:C,priority:10},{eventPattern:`browser:navigated`,targetDomains:[`browser`],threshold:1,windowMs:C,priority:10},{eventPattern:`memory:scan_completed`,targetDomains:[`memory`],threshold:1,windowMs:C,priority:10},{eventPattern:`network:intercept_started`,targetDomains:[`network`,`hooks`],threshold:1,windowMs:C,priority:9},{eventPattern:`v8:heap_captured`,targetDomains:[`v8-inspector`],threshold:1,windowMs:C,priority:10},{eventPattern:`tls:keylog_started`,targetDomains:[`boringssl-inspector`],threshold:1,windowMs:C,priority:10},{eventPattern:`skia:scene_captured`,targetDomains:[`skia-capture`],threshold:1,windowMs:C,priority:10},{eventPattern:`frida:attached`,targetDomains:[`binary-instrument`],threshold:1,windowMs:C,priority:10},{eventPattern:`adb:device_connected`,targetDomains:[`adb-bridge`],threshold:1,windowMs:C,priority:10},{eventPattern:`mojo:message_captured`,targetDomains:[`mojo-ipc`],threshold:1,windowMs:C,priority:10},{eventPattern:`syscall:trace_started`,targetDomains:[`syscall-hook`],threshold:1,windowMs:C,priority:10},{eventPattern:`protocol:pattern_detected`,targetDomains:[`protocol-analysis`],threshold:1,windowMs:C,priority:10}];var bn=class{eventBus;ctx;cooldownMs;boostRules;unsubscribers=[];lastBoostTime=new Map;lastActivity=new Map;eventHistory=[];maxEventHistory;toolCallCount=0;compoundEvalEvery;compoundEngine;predictiveBooster;autoPruner;disposed=!1;constructor(t,n,r={}){this.eventBus=t,this.ctx=n,this.cooldownMs=r.cooldownMs??S,this.maxEventHistory=y,this.compoundEvalEvery=Math.max(1,x);let i=r.boostRules??[];this.boostRules=[...yn,...i].toSorted((e,t)=>t.priority-e.priority),this.compoundEngine=new gn,this.predictiveBooster=new _n;let a=new Set(ve(n.baseTier));this.autoPruner=new vn(t,a,t=>{e.info(`[ActivationController] Auto-pruning domain "${t}"`)}),this.subscribe(),e.info(`[ActivationController] Initialized with ${this.boostRules.length} boost rules, cooldown=${this.cooldownMs}ms, platform=${process.platform}, ${this.compoundEngine.conditionCount} compound conditions`)}subscribe(){this.unsubscribers.push(this.eventBus.on(`tool:called`,e=>{this.recordEvent(`tool:called`,e),e.domain&&(this.lastActivity.set(e.domain,Date.now()),this.autoPruner.recordActivity(e.domain)),this.predictiveBooster.recordCall(e.toolName);let t=this.predictiveBooster.predictNextDomains(e.toolName,e=>D(e)??null);for(let n of t)this.attemptBoost(n,`predictive: ${e.toolName} → ${n}`);this.toolCallCount++,this.toolCallCount%this.compoundEvalEvery===0&&this.evaluateCompoundConditions()}));let e=new Set;for(let t of this.boostRules){if(!t.eventPattern||e.has(t.eventPattern))continue;e.add(t.eventPattern);let n=t.eventPattern;this.unsubscribers.push(this.eventBus.on(n,e=>(this.recordEvent(t.eventPattern,e),this.evaluateBoostRules(t.eventPattern))))}}recordEvent(e,t){this.eventHistory.push({event:e,timestamp:Date.now(),payload:t}),this.eventHistory.length>this.maxEventHistory&&this.eventHistory.splice(0,this.eventHistory.length-this.maxEventHistory)}async evaluateBoostRules(e){let t=Date.now();for(let n of this.boostRules){if(!e.startsWith(n.eventPattern))continue;let r=t-n.windowMs,i=this.eventHistory.filter(e=>e.event.startsWith(n.eventPattern)&&e.timestamp>=r).length;i>=n.threshold&&await Promise.all(n.targetDomains.map(e=>this.attemptBoost(e,`rule:${n.eventPattern} (${i} events)`)))}}async attemptBoost(t,n){if(this.disposed)return;let r=Date.now();r-(this.lastBoostTime.get(t)??0)<this.cooldownMs||this.ctx.enabledDomains.has(t)||(this.lastBoostTime.set(t,r),e.info(`[ActivationController] Boosting domain "${t}" — reason: ${n}`),await A(this.ctx,{domain:t,ttlMinutes:_}),await this.eventBus.emit(`activation:domain_boosted`,{domain:t,reason:n,timestamp:new Date().toISOString()}))}evaluateCompoundConditions(){let e={platform:process.platform,activeDomains:this.ctx.enabledDomains,eventHistory:this.eventHistory,recentToolCalls:this.eventHistory.filter(e=>e.event===`tool:called`).map(e=>e.payload?.toolName??``)},t=this.compoundEngine.evaluate(e);for(let e of t)this.attemptBoost(e,`compound condition`)}getLastActivity(e){return this.lastActivity.get(e)}getEventHistory(){return this.eventHistory}getLastBoostTime(e){return this.lastBoostTime.get(e)}getPredictiveBooster(){return this.predictiveBooster}getAutoPruner(){return this.autoPruner}dispose(){this.disposed=!0;for(let e of this.unsubscribers)e();this.unsubscribers.length=0,this.lastBoostTime.clear(),this.lastActivity.clear(),this.eventHistory.length=0,this.autoPruner.dispose(),this.predictiveBooster.reset(),e.info(`[ActivationController] Disposed`)}};const xn=new Set([`true`,`1`,`yes`,`on`]),Sn=new Set([`false`,`0`,`no`,`off`]);function Cn(e){if(typeof e!=`string`)return e;let t=e.trim().toLowerCase();return xn.has(t)?!0:Sn.has(t)?!1:e}function wn(e){if(typeof e!=`string`)return e;let t=e.trim();if(t===``)return e;let n=Number(t);return Number.isFinite(n)?n:e}function Y(e){let t=e.type,n=typeof e.description==`string`?e.description:void 0;if(e.anyOf!==void 0||e.oneOf!==void 0){let t=(e.anyOf??e.oneOf).map(e=>Y(e)),r=V.union([t[0],...t.slice(1)]);return n?r.describe(n):r}let r;switch(t){case`string`:if(Array.isArray(e.enum)){let t=e.enum;r=V.enum(t)}else{let t=V.string();typeof e.pattern==`string`&&(t=t.regex(new RegExp(e.pattern))),r=t}break;case`number`:case`integer`:{let n=V.number();typeof e.minimum==`number`&&(n=n.min(e.minimum)),typeof e.maximum==`number`&&(n=n.max(e.maximum)),t===`integer`&&(n=n.int()),r=V.preprocess(wn,n);break}case`boolean`:r=V.preprocess(Cn,V.boolean());break;case`array`:r=e.items&&typeof e.items==`object`?V.array(Y(e.items)):V.array(V.unknown());break;case`object`:if(e.properties&&typeof e.properties==`object`){let t={},n=new Set(Array.isArray(e.required)?e.required:[]);for(let[r,i]of Object.entries(e.properties)){let e=Y(i);t[r]=n.has(r)?e:e.optional()}r=V.object(t)}else r=V.record(V.string(),V.unknown());break;default:r=V.unknown()}return n&&(r=r.describe(n)),r}function Tn(e){let t=e.properties??{},n=new Set(Array.isArray(e.required)?e.required:[]),r={};for(let[e,i]of Object.entries(t)){let t=Y(i&&typeof i==`object`?i:{});r[e]=n.has(e)?t:t.optional()}return r}function En(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Dn(e){let t=e._meta;return En(t)?t:null}function On(e,t){let n={...e},r={},i=Dn(e);return i&&Object.assign(r,i),En(t?._meta)&&Object.assign(r,t?._meta),typeof t?.sessionId==`string`&&t.sessionId.trim().length>0&&(r.sessionId=t.sessionId),Object.keys(r).length>0&&(n._meta=r),n}function kn(e){switch(e){case`VALIDATION`:return I.InvalidParams;case`NOT_FOUND`:return-32002;case`TIMEOUT`:return I.RequestTimeout;case`CONNECTION`:return I.ConnectionClosed;case`PREREQUISITE`:case`PERMISSION`:return I.InvalidRequest;default:return I.InternalError}}function An(t,n){if(n instanceof Et)throw e.error(`Tool validation failed: ${t}`,n),new L(I.InvalidParams,`Validation Error in ${t}: ${n.message}`);if(n instanceof L)throw n;if(n instanceof O){e.error(`Tool execution failed [${n.code}]: ${t} - ${n.message}`);let r=n.details?`\nDetails: ${JSON.stringify(n.details)}`:``;throw new L(kn(n.code),`[${n.code}] ${n.message}${r}`)}throw e.error(`Tool execution failed: ${t}`,n),new L(I.InternalError,`Execution Failed in ${t}: ${n instanceof Error?n.message:String(n)}`)}function X(e){let t={...e};if(t.properties){let e={};for(let[n,r]of Object.entries(t.properties)){let{description:t,...i}=r;e[n]=X(i)}t.properties=e}if(t.items&&typeof t.items==`object`){let{description:e,...n}=t.items;t.items=X(n)}return t.additionalProperties&&typeof t.additionalProperties==`object`&&!Array.isArray(t.additionalProperties)&&(t.additionalProperties=X(t.additionalProperties)),t}function jn(e,t){let n=t;n.autocompleteHandlers&&e.toolAutocompleteHandlers.set(t.name,n.autocompleteHandlers);let r=d&&t.inputSchema?X(t.inputSchema):t.inputSchema,i=r&&typeof r==`object`?Tn(r):{},a=t.description??t.name;if(Object.keys(i).length>0){let r=e.server.registerTool(t.name,{description:a,inputSchema:i},async(n,r)=>{try{let i=On(n,r);return await e.executeToolWithTracking(t.name,i)}catch(e){return An(t.name,e)}});if(n.execution){let r=e.server.registeredTools;r&&r[t.name]&&(r[t.name].execution=n.execution)}return r}let o=e.server.registerTool(t.name,{description:a},async(n,r)=>{try{let n=On({},r);return await e.executeToolWithTracking(t.name,n)}catch(e){return An(t.name,e)}});if(n.execution){let r=e.server.registeredTools;r&&r[t.name]&&(r[t.name].execution=n.execution)}return o}function Z(e){if(e?.type!==`object`||!e.properties)return{};let t={},n=new Set(Array.isArray(e.required)?e.required:[]);for(let[r,i]of Object.entries(e.properties)){let e=i;!n.has(r)&&e.default===void 0||(e.default===void 0?e.enum&&Array.isArray(e.enum)&&e.enum.length>0?t[r]=e.enum[0]:e.type===`string`?t[r]=`<${r}>`:e.type===`number`||e.type===`integer`?t[r]=0:e.type===`boolean`?t[r]=!1:e.type===`array`?t[r]=[]:e.type===`object`&&(t[r]={}):t[r]=e.default)}return t}function Mn(e,t){return`call_tool({ name: "${e}", args: ${JSON.stringify(Z(t))} })`}function Nn(e,t){let n=P(e),r=N(n,t);return r?{name:n,description:Xe(n,t),inputSchema:r}:null}async function Pn(t,n,r){let{task:i,context:a={}}=t,o=a.maxRecommendations||5;e.info(`[ToolRouter] Routing request`,{task:i,context:a}),await Pe(n);let s=Ie(i),c=k(n),l=Se(n),u=await We(n),d=ze(n),f=Qe(i,n),p=null,m=await r.search(i,o*2,c,l,xe(n)),h=!f&&!s?Ve(m.slice(0,10),d):null,g=[];if(h){let t=h.tools.filter(e=>d.has(e)).map((e,t)=>({name:e,domain:Be(e,n),shortDescription:m.find(t=>t.name===e)?.shortDescription??n.extensionToolsByName.get(e)?.tool.description??``,score:h.priority-t*.01,isActive:F(e,n)})),r=new Set(h.tools),i=m.filter(e=>!r.has(e.name));g=[...t,...i],e.info(`[ToolRouter] Cross-domain workflow detected`,{pattern:h.id,domains:h.domains})}else if(f?.workflow.route.kind===`preset`){let e=Ye(f,u,n,d);p=new Set(e.map(e=>e.name));let t=new Set(e.map(e=>e.name)),r=m.filter(e=>!t.has(e.name));g=[...e,...r]}else if(f?.workflow.route.kind===`workflow`){let e=Ue(f,n);g=[e,...m.filter(t=>t.name!==e.name)]}else if(s){let e=Re(i),t=Le(s,u,d),r=t.map((t,r)=>({name:t,domain:Be(t,n),shortDescription:m.find(e=>e.name===t)?.shortDescription??n.extensionToolsByName.get(t)?.tool.description??``,score:(e?90:s.priority)-r*.01,isActive:F(t,n)})),a=new Set(t),o=m.filter(e=>!a.has(e.name));g=[...r,...o]}else if(i&&!Ze(i,s)&&!$e(i)){let e=qe(i,n,d);if(e.length>0){let t=new Set(e.map(e=>e.name)),n=m.filter(e=>!t.has(e.name));g=[...e,...n]}else g=[...m]}else g=[...m];let _=[],v=new Set;for(let e of g)v.has(e.name)||(v.add(e.name),_.push(e));g=Je(_,i,s,u),a.preferredDomain&&g.length>0&&(g=g.map(e=>({...e,score:e.domain===a.preferredDomain?e.score*1.15:e.score})),g.sort((e,t)=>t.score-e.score));let ee=Math.max(o,p?.size??0);g=g.slice(0,ee);let y=f?Ge(f,n):void 0,b=g.map(e=>{let t=N(e.name,n),r=F(e.name,n),i={name:e.name,domain:e.domain,description:e.shortDescription,inputSchema:t||{type:`object`},score:e.score,isActive:r,callCommand:Mn(e.name,t||{type:`object`})};r||(i.activationCommand=`activate_tools with names: ["${e.name}"]`);let a=Ke()[e.name];return a&&a.length>0&&(i.prerequisites=a.map(e=>({condition:e.condition,satisfied:e.check(u),fix:e.fix}))),i}),x=[],S=p?b.filter(e=>p.has(e.name)):[],C=(S.length>0?S:b).filter(e=>!e.isActive),w=(()=>{if(S.length>0||!Ze(i,s)||$e(i))return C;let e=C.filter(e=>e.domain!==`maintenance`);return e.length>0?e:C})();if(y?.kind===`preset`&&S.length>0){let e=1;w.length>0&&x.push({step:e++,action:`activate`,toolName:w.length===1?w[0].name:void 0,command:`activate_tools with names: [${w.map(e=>`"${e.name}"`).join(`, `)}]`,description:`Activate ${w.length} preset tool${w.length===1?``:`s`} for ${y.name}`});let t=b.filter(e=>e.name===`browser_launch`||e.name===`browser_attach`);for(let n of t)x.push({step:e++,action:`call`,toolName:n.name,command:n.name,exampleArgs:Z(n.inputSchema),description:n.description});for(let t of y.steps){let r=S.find(e=>e.name===t.toolName);x.push({step:e++,action:`call`,toolName:t.toolName,command:t.toolName,exampleArgs:Z(r?.inputSchema??N(t.toolName,n)??{type:`object`}),description:`${t.id}: ${t.description}`})}}else if(y?.kind===`workflow`){let e=b.find(e=>e.name===`run_extension_workflow`),t=1;e.isActive||x.push({step:t++,action:`activate`,toolName:e.name,command:`activate_tools with names: ["${e.name}"]`,description:`Activate workflow runner for ${y.name}`}),x.push({step:t,action:`call`,toolName:`run_extension_workflow`,command:`run_extension_workflow`,exampleArgs:{...Z(e.inputSchema),workflowId:y.id},description:`Execute routed workflow ${y.name}`})}else if(b.length>0&&b[0]?.isActive)x.push({step:1,action:`call`,toolName:b[0].name,command:b[0].name,exampleArgs:Z(b[0].inputSchema),description:`Call ${b[0].name}. Use describe_tool("${b[0].name}") only if you need the full schema.`});else if(w.length>0){let e=w[0];x.push({step:1,action:`activate`,toolName:w.length===1?e.name:void 0,command:`activate_tools with names: [${w.map(e=>`"${e.name}"`).join(`, `)}]`,description:`Activate ${w.length} recommended tool${w.length===1?``:`s`}`}),x.push({step:2,action:`call`,toolName:e.name,command:e.name,exampleArgs:Z(e.inputSchema),description:`Call ${e.name}. Use describe_tool("${e.name}") only if you need the full schema.`})}return{recommendations:b,nextActions:x,workflowHint:y?`${y.kind===`preset`?`Preset`:`Workflow`} ${y.name}: ${y.description}`:s?.hint,routeMatch:y,autoActivated:!1}}async function Fn(t,n){if(n)try{await t.server.sendToolListChanged()}catch(t){e.warn(`sendToolListChanged failed:`,t)}}async function In(t,n){await de();let r=k(t),i=[],a=[],o=[];for(let e of n){let n=P(e);if(r.has(n)){a.push(n);continue}let s=(await Te(t)).get(n);if(!s){o.push(n);continue}let c=t.extensionToolsByName.get(n);if(c)je(t,c,`activate_tools`);else{let e=t.registerSingleTool(s);t.activatedToolNames.add(n),t.activatedRegisteredTools.set(n,e);let r=D(n);r&&t.enabledDomains.add(r);let i=new Set([n]),a=Ee(t.handlerDeps,i);t.router.addHandlers(a)}i.push(n),r.add(n)}return await Fn(t,i.length>0),e.info(`activate_tools: activated ${i.length}, already_active ${a.length}, not_found ${o.length}`),{activated:i,alreadyActive:a,notFound:o,totalActive:r.size}}async function Ln(e,t){let n=t.names;if(typeof n==`string`&&n.trim().startsWith(`[`))try{let e=JSON.parse(n);Array.isArray(e)&&(n=e)}catch{}let{names:r,error:i}=He({names:n});if(i)return T(JSON.stringify({success:!1,error:i}));let a=await In(e,r);return T(JSON.stringify({success:!0,...a,hint:a.activated.length>0?`Tools activated. If they do not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke them.`:void 0}))}async function Rn(t,n){let{names:r,error:i}=He(n);if(i)return T(JSON.stringify({success:!1,error:i}));let a=[],o=[];for(let n of r){let r=P(n);if(!t.activatedToolNames.has(r)){o.push(r);continue}let i=t.activatedRegisteredTools.get(r);if(i&&!t.extensionToolsByName.has(r))try{i.remove()}catch(t){e.warn(`Failed to remove activated tool "${r}":`,t)}let s=t.extensionToolsByName.get(r);s?Ae(t,s,{onRemoveError:t=>{e.warn(`Failed to remove activated tool "${r}":`,t)}}):(t.router.removeHandler(r),t.activatedToolNames.delete(r),t.activatedRegisteredTools.delete(r)),a.push(r)}return await Fn(t,a.length>0),e.info(`deactivate_tools: deactivated ${a.length}, not_activated ${o.length}`),T(JSON.stringify({success:!0,deactivated:a,notActivated:o,hint:`Deactivated tools are no longer available. Search again to find alternatives.`}))}async function zn(e,t){let n=t.query,r=t.top_k??10,i=t.auto_activate??!0,a=performance.now(),o=await j(e),s=k(e),c=Se(e),l=await o.search(n,r,s,c,xe(e)),u=Math.round(performance.now()-a);if(e.mcpLog.info(`jshookmcp`,{event:`search_executed`,query:n,resultCount:l.length,latencyMs:u}),i&&r>0){let t=l.filter(e=>!e.isActive);if(t.length>0){let n=new Set,r=[];for(let i of t)i.domain&&!e.enabledDomains.has(i.domain)?n.add(i.domain):i.domain||r.push(i.name);let{handleActivateDomain:i}=await import(`./MCPServer.search.handlers.domain-BbS-6LnX.mjs`).then(e=>e.t);for(let t of n)try{await i(e,{domain:t,ttlMinutes:_})}catch{}let a=new Set(n),o=t.filter(e=>!a.has(e.domain??``)).map(e=>e.name),s=[...new Set([...o,...r])];s.length>0&&await In(e,s)}}let d=i?k(e):s,f=l[0],p=f?Nn(f.name,e):null,m=p?Z(p.inputSchema):void 0,h=[];f&&(d.has(f.name)?h.push({step:1,action:`call`,command:f.name,exampleArgs:m,description:`Call ${f.name} directly. Use describe_tool("${f.name}") only if you need the full schema.`}):(h.push({step:1,action:`activate_tools`,command:`activate_tools({ names: ["${f.name}"] })`,description:`Activate ${f.name} before calling.`}),h.push({step:2,action:`call`,command:f.name,exampleArgs:m,description:`Call ${f.name}. Use describe_tool("${f.name}") only if you need the full schema.`})));let g=l.length<3?` Few results — try distilling your query to key concepts (e.g. "hook fetch" instead of "how to intercept fetch requests").`:``,v=l.map(e=>({...e,isActive:d.has(e.name)?!0:e.isActive})),ee={query:n,resultCount:l.length,results:v,nextActions:h,hint:`For guided tool discovery with workflow detection, use route_tool instead. Tools are auto-activated. If a tool does not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke it directly.`+g,autoActivated:i&&l.some(e=>!e.isActive&&d.has(e.name))},y=JSON.stringify(ee,null,2),b=o.getSearchQualityTracker().getEnhancementSuggestions(n,l.length,l[0]?.score??0);return b&&b.length>0&&(y+=`\n\n---\n**Search Enhancement Suggestions:**\n${b.map(e=>`- ${e}`).join(`
6
+ `)}`),T(y)}function Bn(e){return{...e,recommendations:e.recommendations.map(e=>({...e,callCommand:e.callCommand??Mn(e.name,e.inputSchema)}))}}async function Vn(e,t){let n=t.task,r=t.context;if(typeof r==`string`&&r.trim().startsWith(`{`))try{let e=JSON.parse(r);e&&typeof e==`object`&&!Array.isArray(e)&&(r=e)}catch{}let i=r;if(!n||typeof n!=`string`)return T(JSON.stringify({success:!1,error:`task must be a non-empty string`}));let a=await j(e),o=i?.autoActivate===!0,s=Bn(await Pn({task:n,context:i},e,a));if(o){let t=s.recommendations.filter(e=>!e.isActive);if(t.length>0){let r=new Set,o=[];for(let n of t)n.domain&&!e.enabledDomains.has(n.domain)?r.add(n.domain):n.domain||o.push(n.name);let c=!1;for(let t of r)try{await A(e,{domain:t,ttlMinutes:_}),c=!0}catch{}let l=t.filter(e=>!r.has(e.domain??``)).map(e=>e.name);(l.length>0||o.length>0)&&(await In(e,[...new Set([...l,...o])])).activated.length>0&&(c=!0),c&&(s=Bn(await Pn({task:n,context:{...i,autoActivate:!1}},e,a)),s.autoActivated=!0,s.activatedNames=t.map(e=>e.name).filter(t=>e.activatedToolNames.has(t)),s.callToolHint=`Tools were auto-activated but may not appear in your tool list. Use call_tool({ name: "<tool_name>", args: {...} }) to invoke them directly.`)}}return T(JSON.stringify(s,null,2))}async function Hn(e,t){let n=t.name;if(!n||typeof n!=`string`)return T(JSON.stringify({success:!1,error:`name must be a non-empty string`}));let r=Nn(n,e);return T(r?JSON.stringify({success:!0,tool:r},null,2):JSON.stringify({success:!1,error:`Tool not found: ${n}`}))}function Un(e){return e.issues.map(e=>`${e.path.length>0?e.path.join(`.`):`(root)`}: ${e.message}`).join(`; `)}function Wn(e,t,n){if(!t||typeof t!=`object`)return n;let r=Tn(t);if(Object.keys(r).length===0)return n;try{return V.object(r).parse(n)}catch(t){throw t instanceof Et?Error(`Invalid arguments for "${e}": ${Un(t)}`,{cause:t}):t}}function Gn(e,t){return{wasAutoActivated:e,activatedTools:t}}function Kn(e,t){return!e?.content||!Array.isArray(e.content)?e:{...e,content:e.content.map(e=>{if(e.type!==`text`||!(`text`in e)||typeof e.text!=`string`)return e;try{let n=JSON.parse(e.text);return!n||typeof n!=`object`||Array.isArray(n)?e:{...e,text:JSON.stringify({...n,...t},null,2)}}catch{return e}})}}async function qn(t,n){let r=typeof n.name==`string`?n.name:``,i=Gn(!1,[]);if(!r)return T(JSON.stringify({success:!1,error:`name must be a non-empty string`,...i}));let a=P(r),o={},s=n.args??n.parameters??(typeof n.arguments==`string`?n.arguments:null);if(s&&typeof s==`object`&&!Array.isArray(s))o=s;else if(typeof s==`string`&&s.trim().length>0)try{let e=JSON.parse(s);e&&typeof e==`object`&&!Array.isArray(e)&&(o=e)}catch{}if(Object.keys(o).length===0&&!(`args`in n)&&!(`parameters`in n)&&!(`arguments`in n))for(let[e,t]of Object.entries(n))e!==`name`&&(o[e]=t);let c=i;if(!t.router.has(a))return T(JSON.stringify({success:!1,error:`Tool "${a}" is not currently active. Use activate_tools or activate_domain first, then call it directly.`,...c}));try{let e=Wn(a,N(a,t),o),n=await t.executeToolWithTracking(a,e);try{(await j(t)).recordToolCallFeedback(a,``)}catch{}return Kn(n,c)}catch(t){let n=t instanceof Error?t.message:String(t);return e.error(`call_tool: execution of "${a}" failed`,t),T(JSON.stringify({success:!1,error:`Tool "${a}" failed: ${n}`,...c}))}}async function Jn(e,t){await de();let n=M(e)?.getCoverageSummary(e)??{called:{},calledCount:0,uncataloguedCalls:[],uncataloguedCallCount:0,totalKnownTools:0,uncalled:[],uncalledCount:0};return{content:[{type:`text`,text:JSON.stringify({success:!0,...n},null,2)}]}}function Yn(e){return[{name:`search_tools`,description:we(e),inputSchema:{type:`object`,properties:{query:{type:`string`,description:`Before calling, distill your intent into 2-5 key concepts: what action, on what target, in which domain. Pass only those distilled keywords — not the original user request.`},top_k:{type:`number`,description:`Max results to return (default: 10, max: 30)`},auto_activate:{type:`boolean`,description:`Auto-activate found tools so they are immediately callable. Set false to only search without activating (default: true)`,default:!0}},required:[`query`]},handler:zn},{name:`route_tool`,description:`One-stop tool router: accepts a natural language task description, returns recommended tools and next actions. Automatically detects workflow patterns, recommends activation order, and provides example arguments. Use this instead of search_tools when you want guided tool discovery with actionable next steps.`,inputSchema:{type:`object`,properties:{task:{type:`string`,description:`Natural language description of the task you want to accomplish`},context:{type:`object`,description:`Optional context hints for routing`,properties:{preferredDomain:{type:`string`,description:`Domain preference (e.g., "browser", "network")`},autoActivate:{type:`boolean`,description:`Whether to auto-activate recommended tools (default: false)`},maxRecommendations:{type:`number`,description:`Maximum number of recommendations (default: 5)`}}}},required:[`task`]},handler:Vn},{name:`describe_tool`,description:`Get detailed information about a specific tool, including its input schema. Use this to see the exact parameters a tool expects before calling it.`,inputSchema:{type:`object`,properties:{name:{type:`string`,description:`Tool name to describe`}},required:[`name`]},handler:Hn},{name:`activate_tools`,description:`Dynamically register specific tools by name, regardless of current base tier. Use after search_tools to enable exactly the tools you need. In search-tier sessions this is usually enough; you do not need boost_profile just to use a few exact tools. Activated tools appear in the tool list immediately. If tools do not appear after activation, use call_tool to invoke them directly.`,inputSchema:{type:`object`,properties:{names:{anyOf:[{type:`array`,items:{type:`string`}},{type:`string`,description:`JSON stringified array for MCP clients that serialize arrays as strings`}],description:`Array of tool names to activate (from search_tools results). Also accepts a JSON stringified array for clients that serialize arrays as strings.`}},required:[`names`]},handler:Ln},{name:`deactivate_tools`,description:`Remove previously activated tools to free context. Only affects tools added via activate_tools, not base profile tools.`,inputSchema:{type:`object`,properties:{names:{anyOf:[{type:`array`,items:{type:`string`}},{type:`string`,description:`JSON stringified array`}],description:`Array of tool names to deactivate`}},required:[`names`]},handler:Rn},{name:`activate_domain`,description:`Activate all tools in a domain at once. Domains: ${[...be()].join(`, `)}. Use reload_extensions first to include external plugin/workflow domains.`,inputSchema:{type:`object`,properties:{domain:{type:`string`,description:`Domain name to activate (e.g. "debugger", "network")`},ttlMinutes:{type:`number`,description:`Auto-deactivate after N minutes (default: 30, set 0 for no expiry)`}},required:[`domain`]},handler:A},{name:`call_tool`,description:`Execute an already-active tool by name. Use this when activate_tools/activate_domain registered a tool but your client did not refresh its tool list. Does not auto-activate inactive tools.`,inputSchema:{type:`object`,properties:{name:{type:`string`,description:`The tool name to execute (from search_tools or describe_tool results)`},args:{type:`object`,description:`Arguments object to pass to the tool`,additionalProperties:!0},parameters:{type:`string`,description:`Alternative: JSON-serialized arguments string. Some MCP clients serialize the nested arguments as a single stringified-JSON field.`},arguments:{type:`string`,description:`Another alternative: MCP clients that stringify the entire arguments wrapper. Carries the same nested {name, args/parameters} payload as a JSON string.`}},required:[`name`]},handler:qn},{name:`coverage_report`,description:`Report which tools have been called in the current runtime and which known tools remain uncalled. Loads all domains first so the uncalled list reflects the full tool catalog, not just currently active tools.`,inputSchema:{type:`object`,properties:{}},handler:Jn}]}function Xn(t){let n=Yn(t);for(let r of n){let n=Tn(r.inputSchema);t.server.registerTool(r.name,{description:r.description,inputSchema:n},async(n,i)=>{try{let e=On(n,i),a=await r.handler(t,e);return M(t)?.recordToolCall(r.name,e),a}catch(t){return e.error(`${r.name} failed`,t),le(t)}}),t.metaToolsByName.set(r.name,{name:r.name,description:r.description.split(`
7
+ `)[0]||r.description,inputSchema:r.inputSchema})}}function Q(e,t){return{contents:[{uri:e,mimeType:`application/json`,text:JSON.stringify(t,null,2)}]}}function Zn(e,t,n){return{contents:[{uri:e,mimeType:n,text:t}]}}function Qn(e){return e.getDomainInstance(`evidenceGraph`)}function $(e){return e.getDomainInstance(`instrumentationSessionManager`)}function $n(e){e.server.registerResource(`evidence_graph_json`,`jshook://evidence/graph`,{title:`Evidence Graph JSON`,description:`Serializable snapshot of the current reverse evidence graph.`,mimeType:`application/json`},async t=>{let n=Qn(e);return Q(t.toString(),n?n.exportJson():{version:1,nodes:[],edges:[],exportedAt:new Date().toISOString()})}),e.server.registerResource(`evidence_graph_markdown`,`jshook://evidence/graph.md`,{title:`Evidence Graph Markdown`,description:`Markdown report for the current reverse evidence graph.`,mimeType:`text/markdown`},async t=>{let n=Qn(e);return Zn(t.toString(),n?n.exportMarkdown():`# Reverse Evidence Graph Report
6
8
 
7
9
  No evidence graph is available.
8
- `,`text/markdown`)}),e.server.registerResource(`instrumentation_sessions`,`jshook://instrumentation/sessions`,{title:`Instrumentation Sessions`,description:`Expanded snapshots for all active instrumentation sessions.`,mimeType:`application/json`},async t=>{let n=$(e);return Q(t.toString(),n?n.listSessionSnapshots():[])});let t=new Ye(`jshook://instrumentation/session/{sessionId}`,{list:async()=>({resources:($(e)?.listSessions()??[]).map(e=>({name:e.name||`Instrumentation Session ${e.id}`,uri:`jshook://instrumentation/session/${e.id}`,mimeType:`application/json`,description:`operations=${e.operationCount}, artifacts=${e.artifactCount}, status=${e.status}`}))})});e.server.registerResource(`instrumentation_session_snapshot`,t,{title:`Instrumentation Session Snapshot`,description:`Expanded snapshot for a single instrumentation session.`,mimeType:`application/json`},async(t,n)=>{let r=String(n.sessionId??``),i=$(e)?.getSessionSnapshot(r);return Q(t.toString(),i??{success:!1,error:`Instrumentation session "${r}" not found`})})}function yn(e){e.server.prompt(`reverse_engineering_assistant`,`System prompt and guidelines for using jshookmcp tools effectively.`,()=>({messages:[{role:`assistant`,content:{type:`text`,text:`I am a JS reverse engineer assistant equipped with the jshookmcp toolkit.
9
- I have access to instrumentation tools, AST flattening engines, and memory scanners.
10
- When analyzing a target:
11
- 1. I will use the browser domains to attach to pages and locate heavily obfuscated scripts.
12
- 2. I will use the transform and deobfuscate tools to simplify JSVMP or Obfuscator.io structures before making assumptions.
13
- 3. If I encounter debugger traps, I will recommend the anti-debug bypass prompt or tools.
14
- How can I help you reverse engineer your target today?`}}]})),e.server.prompt(`analyze_anti_debug`,`Runbook and scripts for defeating debugger protections and traps.`,()=>({messages:[{role:`user`,content:{type:`text`,text:`I am encountering infinite debugger loops and anti-tamper traps. What should I do?`}},{role:`assistant`,content:{type:`text`,text:`To defeat common anti-debugging techniques, inject the following bypass script prior to page load (using page_evaluateOnNewDocument if possible):
10
+ `,`text/markdown`)}),e.server.registerResource(`instrumentation_sessions`,`jshook://instrumentation/sessions`,{title:`Instrumentation Sessions`,description:`Expanded snapshots for all active instrumentation sessions.`,mimeType:`application/json`},async t=>{let n=$(e);return Q(t.toString(),n?n.listSessionSnapshots():[])});let t=new ct(`jshook://instrumentation/session/{sessionId}`,{list:async()=>({resources:($(e)?.listSessions()??[]).map(e=>({name:e.name||`Instrumentation Session ${e.id}`,uri:`jshook://instrumentation/session/${e.id}`,mimeType:`application/json`,description:`operations=${e.operationCount}, artifacts=${e.artifactCount}, status=${e.status}`}))})});e.server.registerResource(`instrumentation_session_snapshot`,t,{title:`Instrumentation Session Snapshot`,description:`Expanded snapshot for a single instrumentation session.`,mimeType:`application/json`},async(t,n)=>{let r=String(n.sessionId??``),i=$(e)?.getSessionSnapshot(r);return Q(t.toString(),i??{success:!1,error:`Instrumentation session "${r}" not found`})}),e.server.registerResource(`search_engine_status`,`jshook://search/status`,{title:`Search Engine Status`,description:`Current status of the multi-signal tool search engine.`,mimeType:`application/json`},async t=>{let n=e.extensionToolsByName.size;try{n+=E().length}catch{}let r=0,i=0,a=!1,o=!1,s=!1,c=null;try{r=(await j(e)).getDomainSummary().reduce((e,t)=>e+t.count,0),a=!0,o=!0,s=e.config.search.vectorEnabled??!1,s&&(i=384),c=new Date().toISOString()}catch{}return Q(t.toString(),{totalTools:n,indexedTools:r,embeddingDimension:i,lastIndexedAt:c,bm25Available:a,trigramAvailable:o,embeddingAvailable:s})}),e.server.registerResource(`token_budget_stats`,`jshook://token-budget/stats`,{title:`Token Budget Statistics`,description:`Current token budget usage, top-10 tool distribution, and optimization suggestions.`,mimeType:`application/json`},async t=>Q(t.toString(),e.tokenBudget.getStats())),e.server.registerResource(`activation_state`,`jshook://activation/state`,{title:`Activation State`,description:`Currently activated tools, per-domain TTL remaining, and auto-pruner predictions.`,mimeType:`application/json`},async t=>{let n=[...e.activatedToolNames],r=[];for(let[t,n]of e.domainTtlEntries)r.push({domain:t,ttlMs:n.ttlMs,toolCount:n.toolNames.size,toolNames:[...n.toolNames]});let i=[...e.enabledDomains];return Q(t.toString(),{baseTier:e.baseTier,enabledDomains:i,activatedTools:n,activatedToolCount:n.length,domainTtls:r,clientSupportsListChanged:e.clientSupportsListChanged})}),e.server.registerResource(`tool_coverage`,`jshook://tools/coverage`,{title:`Tool Coverage`,description:`Called vs uncalled tools in the current runtime, with last-call metadata.`,mimeType:`application/json`},async t=>{let n=M(e)?.getCoverageSummary(e)??{called:{},calledCount:0,uncataloguedCalls:[],uncataloguedCallCount:0,totalKnownTools:0,uncalled:[],uncalledCount:0};return Q(t.toString(),n)}),e.server.registerResource(`cache_stats`,`jshook://cache/stats`,{title:`Cache Statistics`,description:`Global cache entry count, total size, and per-cache-instance hit rates.`,mimeType:`application/json`},async t=>Q(t.toString(),await e.unifiedCache.getGlobalStats())),e.server.registerResource(`browser_tabs`,`jshook://browser/tabs`,{title:`Browser Tabs`,description:`List of currently open browser tabs with URL, title, and tabIndex.`,mimeType:`application/json`},async t=>{let n=e.getDomainInstance(`browserHandlers`)?.getTabRegistry?.();if(!n)return Q(t.toString(),{tabs:[],currentTabId:null,message:`Browser domain not initialized`});let r=n.listTabs().map(e=>({pageId:e.pageId,index:e.index,url:e.url,title:e.title,aliases:e.aliases})),i=n.getContextMeta();return Q(t.toString(),{tabs:r,currentTabId:i.pageId,totalTabs:r.length})});let n=new ct(`jshook://domains/{domainName}`,{list:async()=>{let t=new Map;try{let e=E();for(let n of e){let e=n.domain??`unknown`;t.set(e,(t.get(e)??0)+1)}}catch{}for(let n of e.extensionToolsByName.values())t.set(n.domain,(t.get(n.domain)??0)+1);let n;try{n=fe()}catch{n=new Set(t.keys())}return{resources:[...n].map(e=>({name:`Domain: ${e}`,uri:`jshook://domains/${e}`,mimeType:`application/json`,description:`${t.get(e)??0} tools`}))}}});e.server.registerResource(`domain_status_template`,n,{title:`Domain Status`,description:`Per-domain tool listing and activation state.`,mimeType:`application/json`},async(t,n)=>{let r=String(n.domainName??``),i=[];try{i=E().filter(e=>(e.domain??`unknown`)===r).map(e=>e.tool.name)}catch{}let a=[];for(let t of e.extensionToolsByName.values())t.domain===r&&a.push(t.name);let o=[...i,...a],s=o.filter(t=>e.activatedToolNames.has(t)),c=e.domainTtlEntries.get(r),l=e.enabledDomains.has(r);return Q(t.toString(),{domain:r,totalTools:o.length,tools:o,enabled:l,activatedTools:s,activatedCount:s.length,ttl:c?{ttlMs:c.ttlMs,toolCount:c.toolNames.size}:null})});let r=e.mcpLog?.getFilePath?.();r&&e.server.registerResource(`mcp_log_file`,`jshook://logs/file`,{title:`MCP Log File Path`,description:`Path to the current MCP log file.`,mimeType:`text/plain`},async e=>({contents:[{uri:e.toString(),mimeType:`text/plain`,text:r}]}))}function er(e){e.server.prompt(`analyze_anti_debug`,`Runbook and scripts for defeating debugger protections and traps.`,()=>({messages:[{role:`user`,content:{type:`text`,text:`I am encountering infinite debugger loops and anti-tamper traps. What should I do?`}},{role:`assistant`,content:{type:`text`,text:`To defeat common anti-debugging techniques, inject the following bypass script prior to page load (using page_evaluateOnNewDocument if possible):
15
11
 
16
12
  \`\`\`javascript
17
- ${Ue()}
13
+ ${et()}
18
14
  \`\`\`
19
15
 
20
- If execution still halts, use the 'memory_scan' tool with pattern 'debugger' or use the AST flattening tools on the suspected control-flow-flattened script.`}}]})),e.server.prompt(`hook_generation_guide`,`Instructions on how to deploy and use hooks generated by the hook builder.`,()=>({messages:[{role:`user`,content:{type:`text`,text:`How do I use generated function or storage hooks?`}},{role:`assistant`,content:{type:`text`,text:`${We(`function`)}
16
+ If execution still halts, use the 'memory_scan' tool with pattern 'debugger' or use the AST flattening tools on the suspected control-flow-flattened script.`}}]})),e.server.prompt(`hook_generation_guide`,`Instructions on how to deploy and use hooks generated by the hook builder.`,()=>({messages:[{role:`user`,content:{type:`text`,text:`How do I use generated function or storage hooks?`}},{role:`assistant`,content:{type:`text`,text:`${tt(`function`)}
21
17
 
22
18
  Generally, you have three options to deploy hooks:
23
19
  1. **Immediate Execution**: Use the \`console_execute\` tool in the browser domain to run the generated hook script immediately on the active page.
24
20
  2. **Early Injection**: Use \`page_evaluateOnNewDocument\` to ensure the hook is installed before any target website scripts execute.
25
- 3. **Local Overrides**: Save the hook script via \`write_file\` and use browser overrides (or proxy mapping) to serve it in place of the original file.`}}]}))}var bn=class{sources=[];debounceTimer=null;periodicTimer=null;debounceMs;periodicMs;disposed=!1;started=!1;constructor(e){this.debounceMs=e?.debounceMs??2e3,this.periodicMs=e?.periodicMs??3e4}register(t,n){let r=this.sources.find(e=>e.filePath===t||e.source===n);if(r){(r.filePath!==t||r.source!==n)&&e.warn(`skipping conflicting snapshot registration for ${t}`);return}let i={source:n,filePath:t};this.sources.push(i),this.started&&this.restoreOne(i).catch(t=>e.warn(`snapshot restore failed for ${i.filePath}:`,t))}async start(){this.started||this.disposed||(this.started=!0,await this.restoreAll(),!(this.disposed||this.periodicTimer)&&(this.periodicTimer=setInterval(()=>{this.scheduleFlush().catch(t=>e.warn(`periodic snapshot failed:`,t))},this.periodicMs)))}notifyDirty(){this.disposed||(this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.scheduleFlush().catch(t=>e.warn(`debounce snapshot failed:`,t))},this.debounceMs))}async flushAll(){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),await this.writeDirtySources()}dispose(){this.disposed=!0,this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),this.periodicTimer&&=(clearInterval(this.periodicTimer),null)}async restoreAll(){for(let e of this.sources)await this.restoreOne(e)}async restoreOne(t){try{let n=await ut(t.filePath,`utf-8`),r=JSON.parse(n);t.source.restoreSnapshot(r),e.info(`restored snapshot from ${t.filePath}`)}catch{}}async scheduleFlush(){await this.writeDirtySources()}async writeDirtySources(){for(let t of this.sources)if(t.source.isPersistDirty())try{await this.writeSnapshot(t)}catch(n){e.warn(`snapshot write failed for ${t.filePath}:`,n)}}async writeSnapshot(e){await lt(ot(e.filePath),{recursive:!0});let t=JSON.stringify(e.source.exportSnapshot()),n=e.filePath+`.tmp`;await ft(n,t,`utf-8`),await dt(n,e.filePath),e.source.markPersisted()}};function xn(e){return st(e,`.jshookmcp`,`state`)}function Sn(){return process.env.E2E_COLLECT_PERFORMANCE===`1`}function Cn(){let e=process.memoryUsage();return{source:`server`,rssBytes:e.rss,privateBytes:null,virtualBytes:null,heapUsedBytes:e.heapUsed,heapTotalBytes:e.heapTotal,externalBytes:e.external,arrayBuffersBytes:e.arrayBuffers}}function wn(e,t,n,r,i){let a=new Date().toISOString(),o=process.cpuUsage(r),s=Cn();return{source:`server`,startedAt:e,finishedAt:a,elapsedMs:Number((performance.now()-t).toFixed(2)),timeoutMs:n,serverPid:process.pid,cpuUserMicros:o.user,cpuSystemMicros:o.system,memoryBefore:i,memoryAfter:s,memoryDelta:{rssBytes:s.rssBytes-i.rssBytes,privateBytes:null,virtualBytes:null,heapUsedBytes:s.heapUsedBytes-i.heapUsedBytes,heapTotalBytes:s.heapTotalBytes-i.heapTotalBytes,externalBytes:s.externalBytes-i.externalBytes,arrayBuffersBytes:s.arrayBuffersBytes-i.arrayBuffersBytes}}}function Tn(e,t){let n=e.content;if(!Array.isArray(n))return e;let r=n.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(!r)return e;try{let n=JSON.parse(r.text);if(typeof n!=`object`||!n||Array.isArray(n))return e;let i=n;`_executionMetrics`in i||(i._executionMetrics=t,r.text=JSON.stringify(i))}catch{return e}return e}var En=class{config;server;cache;tokenBudget;unifiedCache;detailedData;eventBus;samplingBridge;elicitationBridge;selectedTools;enabledDomains;router;contextGuard;largeDataOffloader;handlerDeps;toolAutocompleteHandlers=new Map;degradedMode=!1;clientInitialized=!1;cacheAdaptersRegistered=!1;cacheRegistrationPromise;baseTier;activatedToolNames=new Set;activatedRegisteredTools=new Map;domainTtlEntries=new Map;metaToolsByName=new Map;clientSupportsListChanged=!0;extensionToolsByName=new Map;extensionPluginsById=new Map;extensionPluginRuntimeById=new Map;extensionWorkflowsById=new Map;extensionWorkflowRuntimeById=new Map;lastExtensionReloadAt;httpServer;httpSockets=new Set;domainInstanceMap=new Map;getDomainInstance(e){return this.domainInstanceMap.get(e)}setDomainInstance(e,t){this.domainInstanceMap.set(e,t)}constructor(t){this.config=t,this.cache=new pt(t.cache),this.tokenBudget=new T,this.unifiedCache=new ee,this.detailedData=new ie,this.eventBus=Ge(),this.tokenBudget.setExternalCleanup(()=>this.detailedData.clear());let{tools:n,profile:r}=wt();this.selectedTools=n,this.baseTier=r,this.enabledDomains=this.resolveEnabledDomains(this.selectedTools);let i=[],a=ce(),o=new Map(a.map(e=>[e.domain,e])),s=le();if(!Array.isArray(s))e.warn(`[MCPServer] getLoaderMetadata returned non-array, skipping domain proxy setup`);else for(let e of s){let t=o.get(e.domain);if(t){if(i.push([e.depKey,H(this,e.domain,`${e.domain}:${e.depKey}`,()=>t.ensure(this))]),t.secondaryDepKeys)for(let n of t.secondaryDepKeys)i.some(([e])=>e===n)||i.push([n,H(this,e.domain,`${e.domain}:${n}`,async()=>(await t.ensure(this),this[n]))])}else{i.push([e.depKey,H(this,e.domain,`${e.domain}:${e.depKey}`,async()=>{let t=await de(e.domain);if(!t)throw Error(`Failed to load domain ${e.domain}`);return t.ensure(this)})]);for(let t of e.secondaryDepKeys)i.some(([e])=>e===t)||i.push([t,H(this,e.domain,`${e.domain}:${t}`,async()=>{let n=await de(e.domain);if(!n)throw Error(`Failed to load domain ${e.domain}`);return await n.ensure(this),this[t]})])}}this.handlerDeps=Object.fromEntries(i);let c=new Set(this.selectedTools.map(e=>e.name));this.router=new gt(xe(this.handlerDeps,c)),this.contextGuard=new xt(()=>{let e=this.handlerDeps.browserHandlers;return e&&typeof e.getTabRegistry==`function`?e.getTabRegistry():null}),this.largeDataOffloader=new Ct(this.detailedData),this.server=new Je({name:t.mcp.name,version:t.mcp.version},{capabilities:{tools:{listChanged:!0},logging:{},completions:{},prompts:{listChanged:!0}}}),this.server.server.oninitialized=()=>{this.clientInitialized=!0},e.onLog((e,t,n)=>{if(this.clientInitialized)try{let r=e===`warn`?`Warning`:e===`error`?`Error`:e===`debug`?`Debug`:`Info`,i=n.length>0?` `+JSON.stringify(n):``;this.server.server.sendLoggingMessage({level:r,data:`${t}${i}`,logger:`jshookmcp`}).catch(()=>void 0)}catch{}}),this.samplingBridge=new mt(this.server),this.elicitationBridge=new ht(this.server),this.setDomainInstance(`activationController`,new Gt(this.eventBus,this));let l=xn(process.cwd()),u=new bn;this.setDomainInstance(`snapshotScheduler`,u),this.setDomainInstance(`snapshotStateDir`,l),u.start().catch(t=>e.warn(`snapshot scheduler start failed:`,t)),this.eventBus.on(`tool:progress`,async e=>{try{await this.server.server.notification({method:`notifications/progress`,params:{progressToken:e.progressToken,progress:e.progress,total:e.total}})}catch{}}),this.eventBus.on(`evidence:updated`,()=>{try{this.server.server.sendResourceUpdated({uri:`jshook://evidence/graph`})}catch{}}),this.server.server.setRequestHandler(Xe,async t=>{try{let e=t.params.ref.name;if(!e)return{completion:{values:[],total:0,hasMore:!1}};let n=t.params.argument.name,r=t.params.argument.value,i=this.toolAutocompleteHandlers.get(e);if(!i)return{completion:{values:[],total:0,hasMore:!1}};let a=i[n];if(!a)return{completion:{values:[],total:0,hasMore:!1}};let o=await a(r);return{completion:{values:o.slice(0,100),total:o.length,hasMore:o.length>100}}}catch(t){return e.error(`Autocomplete failed:`,t),{completion:{values:[],total:0,hasMore:!1}}}}),this.registerTools()}resolveEnabledDomains(e){return Tt(e)}registerSingleTool(e){return $t(this,e)}async reloadExtensions(){return Ce(this)}listExtensions(){return Te(this)}async registerCaches(){if(!this.cacheAdaptersRegistered&&this.collector){if(this.cacheRegistrationPromise){await this.cacheRegistrationPromise;return}this.cacheRegistrationPromise=(async()=>{try{let{createCacheAdapters:t}=await import(`./CacheAdapters-CdAxBmVW.mjs`),n=this.collector.getCache(),r=this.collector.getCompressor(),i=t(this.detailedData,n,r);for(let e of i)this.unifiedCache.registerCache(e);this.cacheAdaptersRegistered=!0,e.info(`Registered ${i.length} cache adapters.`)}catch(t){e.error(`Cache registration failed:`,t)}finally{this.cacheRegistrationPromise=void 0}})();try{await this.cacheRegistrationPromise}catch(t){e.error(`Cache registration failed:`,t)}}}async executeToolWithTracking(t,n){let r,i=3e4,a=Sn(),o=a?new Date().toISOString():null,s=a?performance.now():0,c=a?process.cpuUsage():null,l=a?Cn():null;try{r=setTimeout(()=>{try{let r=JSON.stringify(n).slice(0,500);e.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${t}'. Args preview: ${r}...`)}catch{e.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${t}'.`)}},i),r.unref();let u;try{u=await this.router.execute(t,n)}finally{r&&clearTimeout(r)}this.largeDataOffloader.offload(t,u),this.contextGuard.recordCall(t);let d=this.contextGuard.enrichResponse(t,u);a&&o&&c&&l&&(d=Tn(d,wn(o,s,i,c,l)));try{this.tokenBudget.recordToolCall(t,n,d)}catch(t){e.warn(`Token tracking failed, continuing without tracking this call:`,t)}this.activatedToolNames.has(t)&&ve(this,t);let f=!d.isError;if(d?.structuredContent&&typeof d.structuredContent==`object`)f=d.structuredContent.success!==!1;else if(d?.content?.[0]?.type===`text`&&`text`in d.content[0])try{f=JSON.parse(d.content[0].text).success!==!1}catch{f=!d.isError}return this.eventBus.emit(`tool:called`,{toolName:t,domain:D(t)??null,timestamp:new Date().toISOString(),success:f,args:n,result:{success:f,isError:d.isError===!0}}),this.getDomainInstance(`evidenceGraph`)?.commit(),d}catch(r){let i=ae(r);try{this.tokenBudget.recordToolCall(t,n,i)}catch(t){e.warn(`Token tracking failed on error path:`,t)}throw this.getDomainInstance(`evidenceGraph`)?.commit(),r}}enterDegradedMode(t){this.degradedMode||(this.degradedMode=!0,e.warn(`Entering degraded mode: ${t}`),this.tokenBudget.setTrackingEnabled(!1),e.setLevel(`warn`))}async start(){await this.registerCaches(),await this.cache.init(),(process.env.MCP_TRANSPORT??`stdio`).toLowerCase()===`http`?await Rt(this):await Lt(this)}async close(){return q(this)}registerTools(){for(let e of this.selectedTools)this.registerSingleTool(e);hn(this),vn(this),yn(this),e.info(`Registered ${this.selectedTools.length} tools + meta tools with McpServer`)}};for(let e of`collector.pageController.domInspector.scriptManager.debuggerManager.runtimeInspector.consoleMonitor.browserHandlers.v8InspectorHandlers.boringsslInspectorHandlers.skiaCaptureHandlers.binaryInstrumentHandlers.adbBridgeHandlers.mojoIpcHandlers.syscallHookHandlers.protocolAnalysisHandlers.extensionRegistryHandlers.crossDomainHandlers.debuggerHandlers.advancedHandlers.aiHookHandlers.hookPresetHandlers.deobfuscator.advancedDeobfuscator.astOptimizer.obfuscationDetector.analyzer.cryptoDetector.hookManager.coreAnalysisHandlers.coreMaintenanceHandlers.extensionManagementHandlers.processHandlers.workflowHandlers.wasmHandlers.streamingHandlers.encodingHandlers.antidebugHandlers.graphqlHandlers.platformHandlers.sourcemapHandlers.transformHandlers.coordinationHandlers.evidenceHandlers.instrumentationHandlers`.split(`.`))e===`domainInstanceMap`||e===`getDomainInstance`||e===`setDomainInstance`||Object.defineProperty(En.prototype,e,{get(){return this.domainInstanceMap.get(e)},set(t){t===void 0?this.domainInstanceMap.delete(e):this.domainInstanceMap.set(e,t)},enumerable:!0,configurable:!0});function Dn(e){try{let t=new URL(`.`,e);for(let e=0;e<5;e++){try{let e=ct(new URL(`package.json`,t)),n=JSON.parse(at(e,`utf8`));if(n.version)return n.version}catch{}let e=new URL(`../`,t);if(e.href===t.href)break;t=e}}catch{}return process.env.npm_package_version??`0.0.0`}function On(e){return[`@jshookmcp/jshook ${e}`,``,`Usage:`,` jshook [--help] [--version]`,` jshookmcp [--help] [--version]`,``,`Behavior:`,` Starts the MCP server by default.`,``,`Common environment variables:`,` MCP_TRANSPORT=stdio|http`,` MCP_TOOL_PROFILE=search|workflow|full`,``].join(`
26
- `)}function kn(e,t){let n=e.map(e=>e.trim()).filter(Boolean),r=n.includes(`--help`)||n.includes(`-h`)||n[0]===`help`,i=n.includes(`--version`)||n.includes(`-v`)||n.includes(`-V`)||n[0]===`version`;return r?{handled:!0,exitCode:0,output:On(Dn(t))}:i?{handled:!0,exitCode:0,output:`${Dn(t)}\n`}:{handled:!1,exitCode:0}}const An=new Set([`ERR_WORKER_OUT_OF_MEMORY`,`ERR_MEMORY_ALLOCATION_FAILED`]),jn=new Set([`ENOMEM`,`ENOSPC`,`EMFILE`,`ENFILE`]);function Mn(e){if(!(e instanceof Error))return!1;let t=`code`in e&&typeof e.code==`string`?e.code:void 0;return!!(t&&An.has(t)||t&&jn.has(t)||e instanceof RangeError&&e.message.includes(`allocation`))}function Nn(e){if(e instanceof Error)return`${e.name}: ${e.message}`;try{return typeof e==`string`?e:JSON.stringify(e)}catch{return String(e)}}async function Pn(){try{let t=kn(process.argv.slice(2),import.meta.url);if(t.handled){t.output&&process.stdout.write(t.output),process.exit(t.exitCode);return}let n=qe();e.debug(`Configuration loaded:`,n);let r=Ke(n);if(!r.valid){e.error(`Configuration validation failed:`),r.errors.forEach(t=>e.error(` - ${t}`)),process.exit(1);return}let i=te();if(i.cleanupOnStart&&i.enabled){let t=await re();t.removedFiles>0&&e.info(`[artifacts] Startup cleanup removed ${t.removedFiles} files (${t.removedBytes} bytes)`)}e.info(`Creating MCP server instance...`);let a=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase();await fe(a===`full`||a===`workflow`||a===`search`?a:`search`);let s=new En(n),c=ne(),l=Math.max(1e3,o),d=Math.max(1,w),f={windowStart:Date.now(),errorCount:0,degradedMode:!1},p=(t,n)=>{Mn(n)&&(e.error(`[${t}] FATAL unrecoverable error — forcing exit: ${Nn(n)}`),process.exit(1));let r=Date.now();r-f.windowStart>l&&(f.windowStart=r,f.errorCount=0),f.errorCount+=1,e.error(`[${t}] Runtime failure captured (${f.errorCount}/${d}): ${Nn(n)}`),!f.degradedMode&&f.errorCount>=d&&(f.degradedMode=!0,s.enterDegradedMode(`Runtime failures reached ${f.errorCount} within ${l}ms`),e.warn(`Degraded mode enabled. Server keeps running without forced process exit.`))};process.on(`SIGINT`,async()=>{e.info(`Received SIGINT, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out, forcing exit`),process.exit(1)},u);t.unref();try{c?.(),await s.close()}catch(t){e.error(`Error during SIGINT shutdown:`,t)}clearTimeout(t),process.exit(0)}),process.on(`SIGTERM`,async()=>{e.info(`Received SIGTERM, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out, forcing exit`),process.exit(1)},u);t.unref();try{c?.(),await s.close()}catch(t){e.error(`Error during SIGTERM shutdown:`,t)}clearTimeout(t),process.exit(0)}),process.on(`uncaughtException`,e=>{p(`uncaughtException`,e)}),process.on(`unhandledRejection`,e=>{p(`unhandledRejection`,e)}),e.info(`Starting MCP server...`),await s.start(),e.info(`MCP server started successfully`),process.stdin.resume(),process.stdin.on(`end`,async()=>{e.info(`stdin EOF — parent disconnected, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out after stdin EOF, forcing exit`),process.exit(1)},u);t.unref();try{c?.(),await s.close()}catch(t){e.error(`Error during stdin EOF shutdown:`,t)}clearTimeout(t),process.exit(0)}),e.info(`MCP server is running. Press Ctrl+C to stop.`)}catch(t){e.error(`Failed to start MCP server:`),t instanceof Error&&(e.error(`Error name:`,t.name),e.error(`Error message:`,t.message),e.error(`Error stack:`,t.stack)),e.error(`Full error object:`,JSON.stringify(t,null,2));let n=t?.code,r=t instanceof Error?t.message:String(t);n===`EADDRINUSE`&&e.error(`Port is already in use. Please check if another instance is running.`),r?.includes(`credentials`)&&e.error(`Authentication failed. Please check your API keys or credentials.`),process.exit(1)}}Pn();export{Pn as main};
21
+ 3. **Local Overrides**: Save the hook script via \`write_file\` and use browser overrides (or proxy mapping) to serve it in place of the original file.`}}]}))}var tr=class{sources=[];debounceTimer=null;periodicTimer=null;debounceMs;periodicMs;disposed=!1;started=!1;constructor(e){this.debounceMs=e?.debounceMs??2e3,this.periodicMs=e?.periodicMs??3e4}register(t,n){let r=this.sources.find(e=>e.filePath===t||e.source===n);if(r){(r.filePath!==t||r.source!==n)&&e.warn(`skipping conflicting snapshot registration for ${t}`);return}let i={source:n,filePath:t};this.sources.push(i),this.started&&this.restoreOne(i).catch(t=>e.warn(`snapshot restore failed for ${i.filePath}:`,t))}async start(){this.started||this.disposed||(this.started=!0,await this.restoreAll(),!(this.disposed||this.periodicTimer)&&(this.periodicTimer=setInterval(()=>{this.scheduleFlush().catch(t=>e.warn(`periodic snapshot failed:`,t))},this.periodicMs)))}notifyDirty(){this.disposed||(this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.scheduleFlush().catch(t=>e.warn(`debounce snapshot failed:`,t))},this.debounceMs))}async flushAll(){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),await this.writeDirtySources()}dispose(){this.disposed=!0,this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),this.periodicTimer&&=(clearInterval(this.periodicTimer),null)}async restoreAll(){for(let e of this.sources)await this.restoreOne(e)}async restoreOne(t){try{let n=await kt(t.filePath,`utf-8`),r=JSON.parse(n);t.source.restoreSnapshot(r),e.info(`restored snapshot from ${t.filePath}`)}catch{}}async scheduleFlush(){await this.writeDirtySources()}async writeDirtySources(){for(let t of this.sources)if(t.source.isPersistDirty())try{await this.writeSnapshot(t)}catch(n){e.warn(`snapshot write failed for ${t.filePath}:`,n)}}async writeSnapshot(e){await Ot(Ct(e.filePath),{recursive:!0});let t=JSON.stringify(e.source.exportSnapshot()),n=e.filePath+`.tmp`;await jt(n,t,`utf-8`),await At(n,e.filePath),e.source.markPersisted()}};function nr(){let e=process.env.JSHOOK_STATE_DIR;return typeof e==`string`&&e.trim().length>0?Tt(mt(),e):Tt(mt(),`.jshookmcp`,`state`)}function rr(){return process.env.E2E_COLLECT_PERFORMANCE===`1`}function ir(){let e=process.memoryUsage();return{source:`server`,rssBytes:e.rss,privateBytes:null,virtualBytes:null,heapUsedBytes:e.heapUsed,heapTotalBytes:e.heapTotal,externalBytes:e.external,arrayBuffersBytes:e.arrayBuffers}}function ar(e,t,n,r,i){let a=new Date().toISOString(),o=process.cpuUsage(r),s=ir();return{source:`server`,startedAt:e,finishedAt:a,elapsedMs:Number((performance.now()-t).toFixed(2)),timeoutMs:n,serverPid:process.pid,cpuUserMicros:o.user,cpuSystemMicros:o.system,memoryBefore:i,memoryAfter:s,memoryDelta:{rssBytes:s.rssBytes-i.rssBytes,privateBytes:null,virtualBytes:null,heapUsedBytes:s.heapUsedBytes-i.heapUsedBytes,heapTotalBytes:s.heapTotalBytes-i.heapTotalBytes,externalBytes:s.externalBytes-i.externalBytes,arrayBuffersBytes:s.arrayBuffersBytes-i.arrayBuffersBytes}}}function or(e,t){let n=e.content;if(!Array.isArray(n))return e;let r=n.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(!r)return e;try{let n=JSON.parse(r.text);if(typeof n!=`object`||!n||Array.isArray(n))return e;let i=n;`_executionMetrics`in i||(i._executionMetrics=t,r.text=JSON.stringify(i))}catch{return e}return e}var sr=class{config;server;cache;tokenBudget;unifiedCache;detailedData;eventBus;samplingBridge;elicitationBridge;selectedTools;enabledDomains;router;contextGuard;circuitBreaker=new Ht;circuitBrokenTools=new Set;searchQualityTracker=new Ce;largeDataOffloader;handlerDeps;toolAutocompleteHandlers=new Map;degradedMode=!1;clientInitialized=!1;cacheAdaptersRegistered=!1;cacheRegistrationPromise;mcpLog=new mn;baseTier;activatedToolNames=new Set;activatedRegisteredTools=new Map;domainTtlEntries=new Map;metaToolsByName=new Map;clientSupportsListChanged=!0;extensionToolsByName=new Map;extensionPluginsById=new Map;extensionPluginRuntimeById=new Map;extensionWorkflowsById=new Map;extensionWorkflowRuntimeById=new Map;lastExtensionReloadAt;httpServer;httpSockets=new Set;domainInstanceMap=new Map;getDomainInstance(e){return this.domainInstanceMap.get(e)}setDomainInstance(e,t){this.domainInstanceMap.set(e,t)}constructor(t){this.config=t,this.cache=new Mt(t.cache),this.tokenBudget=new re,this.unifiedCache=new ie,this.detailedData=new ce,this.eventBus=nt(),this.tokenBudget.setExternalCleanup(()=>this.detailedData.clear());let{tools:n,profile:r}=Gt();this.selectedTools=n,this.baseTier=r,this.enabledDomains=this.resolveEnabledDomains(this.selectedTools);let i=[],a=pe(),o=new Map(a.map(e=>[e.domain,e])),c=me();if(!Array.isArray(c))e.warn(`[MCPServer] getLoaderMetadata returned non-array, skipping domain proxy setup`);else for(let e of c){let t=o.get(e.domain);if(t){if(i.push([e.depKey,W(this,e.domain,`${e.domain}:${e.depKey}`,()=>t.ensure(this))]),t.secondaryDepKeys)for(let n of t.secondaryDepKeys)i.some(([e])=>e===n)||i.push([n,W(this,e.domain,`${e.domain}:${n}`,async()=>(await t.ensure(this),this[n]))])}else{i.push([e.depKey,W(this,e.domain,`${e.domain}:${e.depKey}`,async()=>{let t=await ge(e.domain);if(!t)throw Error(`Failed to load domain ${e.domain}`);return t.ensure(this)})]);for(let t of e.secondaryDepKeys)i.some(([e])=>e===t)||i.push([t,W(this,e.domain,`${e.domain}:${t}`,async()=>{let n=await ge(e.domain);if(!n)throw Error(`Failed to load domain ${e.domain}`);return await n.ensure(this),this[t]})])}}this.handlerDeps=Object.fromEntries(i);let l=new Set(this.selectedTools.map(e=>e.name));this.router=new Ft(Ee(this.handlerDeps,l)),this.contextGuard=new Bt(()=>{let e=this.handlerDeps.browserHandlers;return e&&typeof e.getTabRegistry==`function`?e.getTabRegistry():null}),this.largeDataOffloader=new Wt(this.detailedData),this.server=new st({name:t.mcp.name,version:t.mcp.version},{capabilities:{tools:{listChanged:!0},logging:{},completions:{},prompts:{listChanged:!0}}}),this.mcpLog.attach(this.server,p),new Set([`debug`,`info`,`warning`,`error`]).has(s)&&this.mcpLog.setLevel(s),g&&this.mcpLog.enableFileLogging(g),this.circuitBreaker.onChange((e,t)=>{e===`opened`?this.circuitBreakerDeactivate(t):this.circuitBreakerReactivate(t)}),this.server.server.oninitialized=()=>{this.clientInitialized=!0},e.onLog((e,t,n)=>{if(this.clientInitialized)try{let r=e===`warn`?`Warning`:e===`error`?`Error`:e===`debug`?`Debug`:`Info`,i=n.length>0?` `+JSON.stringify(n):``;this.server.server.sendLoggingMessage({level:r,data:`${t}${i}`,logger:`jshookmcp`}).catch(()=>void 0)}catch{}}),this.samplingBridge=new Nt(this.server),this.elicitationBridge=new Pt(this.server),this.setDomainInstance(`activationController`,new bn(this.eventBus,this));let u=nr(),d=new tr,f=new Oe,m=new it(()=>this.collector);this.setDomainInstance(`snapshotScheduler`,d),this.setDomainInstance(`snapshotStateDir`,u),this.setDomainInstance(`serverRuntimeState`,f),this.setDomainInstance(`browserSessionCoordinator`,m),d.register(`${u}/runtime-state.json`,f),d.start().then(async()=>{await De(this)}).catch(t=>e.warn(`snapshot scheduler start failed:`,t)),this.eventBus.on(`tool:progress`,async e=>{try{await this.server.server.notification({method:`notifications/progress`,params:{progressToken:e.progressToken,progress:e.progress,total:e.total}})}catch{}}),this.eventBus.on(`evidence:updated`,()=>{try{this.server.server.sendResourceUpdated({uri:`jshook://evidence/graph`})}catch{}}),this.eventBus.on(`activation:domain_pruned`,e=>{this.mcpLog.info(`jshookmcp`,{event:`domain_pruned`,domain:e.domain,reason:e.reason})}),this.server.server.setRequestHandler(lt,async t=>{try{let e=t.params.ref.name;if(!e)return{completion:{values:[],total:0,hasMore:!1}};let n=t.params.argument.name,r=t.params.argument.value,i=this.toolAutocompleteHandlers.get(e);if(!i)return{completion:{values:[],total:0,hasMore:!1}};let a=i[n];if(!a)return{completion:{values:[],total:0,hasMore:!1}};let o=await a(r);return{completion:{values:o.slice(0,100),total:o.length,hasMore:o.length>100}}}catch(t){return e.error(`Autocomplete failed:`,t),{completion:{values:[],total:0,hasMore:!1}}}}),this.registerTools()}resolveEnabledDomains(e){return Kt(e)}registerSingleTool(e){return jn(this,e)}async reloadExtensions(){return Ne(this)}listExtensions(){return Fe(this)}async registerCaches(){if(!this.cacheAdaptersRegistered&&this.collector){if(this.cacheRegistrationPromise){await this.cacheRegistrationPromise;return}this.cacheRegistrationPromise=(async()=>{try{let{createCacheAdapters:t}=await import(`./CacheAdapters-CsNtQIR8.mjs`),n=this.collector.getCache(),r=this.collector.getCompressor(),i=t(this.detailedData,n,r);for(let e of i)this.unifiedCache.registerCache(e);this.cacheAdaptersRegistered=!0,e.info(`Registered ${i.length} cache adapters.`)}catch(t){e.error(`Cache registration failed:`,t)}finally{this.cacheRegistrationPromise=void 0}})();try{await this.cacheRegistrationPromise}catch(t){e.error(`Cache registration failed:`,t)}}}async executeToolWithTracking(t,n){let r,i=3e4,a=rr(),o=a?new Date().toISOString():null,s=a?performance.now():0,c=a?process.cpuUsage():null,l=a?ir():null;try{if(this.setDomainInstance(`activeToolArgs`,n),r=setTimeout(()=>{try{let r=JSON.stringify(n).slice(0,500);e.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${t}'. Args preview: ${r}...`)}catch{e.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${t}'.`)}},i),r.unref(),this.circuitBreaker.shouldBlock(t)){let e=this.circuitBreaker.getState(t),n=e?Math.ceil((this.circuitBreaker.getRecoveryMs()-(Date.now()-e.lastFailureTime))/1e3):30;return r&&clearTimeout(r),{content:[{type:`text`,text:JSON.stringify({success:!1,error:`Circuit breaker open for tool "${t}"`,reason:`Tool has failed consecutively ${e?.failureCount??0} times`,retryAfterSeconds:n})}],isError:!0}}let u;try{let e=D(t)===`browser`?this.getDomainInstance(`browserSessionCoordinator`):null,r=n._meta?.sessionId??null;u=e?await e.runExclusive(r,async()=>(await e.restoreSessionContext(r),await this.router.execute(t,n))):await this.router.execute(t,n)}finally{r&&clearTimeout(r)}if(this.largeDataOffloader.offload(t,u),D(t)===`browser`){let e=this.getDomainInstance(`browserSessionCoordinator`),r=n._meta?.sessionId??null;e?.noteToolResult(r,t,rt(u))}this.contextGuard.recordCall(t),this.getDomainInstance(`serverRuntimeState`)?.recordToolCall(t,n);let d=this.contextGuard.enrichResponse(t,u);a&&o&&c&&l&&(d=or(d,ar(o,s,i,c,l)));try{this.tokenBudget.recordToolCall(t,n,d)}catch(t){e.warn(`Token tracking failed, continuing without tracking this call:`,t)}this.activatedToolNames.has(t)&&ke(this,t);let f=!d.isError;if(d?.structuredContent&&typeof d.structuredContent==`object`)f=d.structuredContent.success!==!1;else if(d?.content?.[0]?.type===`text`&&`text`in d.content[0])try{f=JSON.parse(d.content[0].text).success!==!1}catch{f=!d.isError}return f?this.circuitBreaker.recordSuccess(t):this.circuitBreaker.recordFailure(t),this.eventBus.emit(`tool:called`,{toolName:t,domain:D(t)??null,timestamp:new Date().toISOString(),success:f,args:n,result:{success:f,isError:d.isError===!0}}),this.searchQualityTracker.associateLastSearch(t),this.mcpLog.info(`jshookmcp`,{event:`tool_called`,toolName:t,domain:D(t)??null,success:f}),this.getDomainInstance(`evidenceGraph`)?.commit(),d}catch(r){this.circuitBreaker.recordFailure(t);let i=le(r);try{this.tokenBudget.recordToolCall(t,n,i)}catch(t){e.warn(`Token tracking failed on error path:`,t)}throw this.getDomainInstance(`evidenceGraph`)?.commit(),r}finally{this.setDomainInstance(`activeToolArgs`,void 0)}}enterDegradedMode(t){this.degradedMode||(this.degradedMode=!0,e.warn(`Entering degraded mode: ${t}`),this.tokenBudget.setTrackingEnabled(!1),e.setLevel(`warn`))}circuitBreakerDeactivate(t){if(this.circuitBrokenTools.has(t))return;let n=this.activatedRegisteredTools.get(t);if(n)try{n.remove()}catch(n){e.warn(`CircuitBreaker: failed to remove tool "${t}":`,n);return}else if(!this.activatedToolNames.has(t))return;this.router.removeHandler(t),this.activatedToolNames.delete(t),this.activatedRegisteredTools.delete(t),this.circuitBrokenTools.add(t);let r=this.extensionToolsByName.get(t);r&&(r.registeredTool=void 0),this.clientSupportsListChanged&&this.server.sendToolListChanged(),e.info(`CircuitBreaker: deactivated "${t}" from tool list`)}circuitBreakerReactivate(t){if(!this.circuitBrokenTools.has(t))return;this.circuitBrokenTools.delete(t);let n=this.selectedTools.find(e=>e.name===t);if(!n){e.warn(`CircuitBreaker: cannot reactivate "${t}" — no tool definition found`);return}let r=this.registerSingleTool(n);this.activatedRegisteredTools.set(t,r),this.activatedToolNames.add(t),this.clientSupportsListChanged&&this.server.sendToolListChanged(),e.info(`CircuitBreaker: reactivated "${t}" in tool list`)}async start(){await this.registerCaches(),await this.cache.init(),(process.env.MCP_TRANSPORT??`stdio`).toLowerCase()===`http`?await un(this):await ln(this)}async close(){return J(this)}registerTools(){for(let e of this.selectedTools)this.registerSingleTool(e);Xn(this),$n(this),er(this);let t=this.metaToolsByName.size;e.info(`Registered ${this.selectedTools.length} base tools + ${t} meta tools with McpServer`),this.mcpLog.info(`jshookmcp`,{event:`registry_discovered`,domainCount:this.enabledDomains.size,toolCount:this.selectedTools.length})}};for(let e of`collector.pageController.domInspector.scriptManager.debuggerManager.runtimeInspector.consoleMonitor.browserHandlers.v8InspectorHandlers.boringsslInspectorHandlers.skiaCaptureHandlers.binaryInstrumentHandlers.adbBridgeHandlers.mojoIpcHandlers.syscallHookHandlers.protocolAnalysisHandlers.extensionRegistryHandlers.crossDomainHandlers.debuggerHandlers.advancedHandlers.aiHookHandlers.hookPresetHandlers.deobfuscator.advancedDeobfuscator.astOptimizer.obfuscationDetector.analyzer.cryptoDetector.hookManager.coreAnalysisHandlers.coreMaintenanceHandlers.extensionManagementHandlers.processHandlers.workflowHandlers.wasmHandlers.streamingHandlers.encodingHandlers.antidebugHandlers.graphqlHandlers.platformHandlers.sourcemapHandlers.transformHandlers.coordinationHandlers.evidenceHandlers.instrumentationHandlers`.split(`.`))e===`domainInstanceMap`||e===`getDomainInstance`||e===`setDomainInstance`||Object.defineProperty(sr.prototype,e,{get(){return this.domainInstanceMap.get(e)},set(t){t===void 0?this.domainInstanceMap.delete(e):this.domainInstanceMap.set(e,t)},enumerable:!0,configurable:!0});function cr(e){try{let t=new URL(`.`,e);for(let e=0;e<5;e++){try{let e=Dt(new URL(`package.json`,t)),n=JSON.parse(St(e,`utf8`));if(n.version)return n.version}catch{}let e=new URL(`../`,t);if(e.href===t.href)break;t=e}}catch{}return process.env.npm_package_version??`0.0.0`}function lr(e){return[`@jshookmcp/jshook ${e}`,``,`Usage:`,` jshook [--help] [--version]`,` jshookmcp [--help] [--version]`,``,`Behavior:`,` Starts the MCP server by default.`,``,`Common environment variables:`,` MCP_TRANSPORT=stdio|http`,` MCP_TOOL_PROFILE=search|workflow|full`,``].join(`
22
+ `)}function ur(e,t){let n=e.map(e=>e.trim()).filter(Boolean),r=n.includes(`--help`)||n.includes(`-h`)||n[0]===`help`,i=n.includes(`--version`)||n.includes(`-v`)||n.includes(`-V`)||n[0]===`version`;return r?{handled:!0,exitCode:0,output:lr(cr(t))}:i?{handled:!0,exitCode:0,output:`${cr(t)}\n`}:{handled:!1,exitCode:0}}const dr=new Set([`ERR_WORKER_OUT_OF_MEMORY`,`ERR_MEMORY_ALLOCATION_FAILED`]),fr=new Set([`ENOMEM`,`ENOSPC`,`EMFILE`,`ENFILE`]);function pr(e){if(!(e instanceof Error))return!1;let t=`code`in e&&typeof e.code==`string`?e.code:void 0;return!!(t&&dr.has(t)||t&&fr.has(t)||e instanceof RangeError&&e.message.includes(`allocation`))}function mr(e){if(e instanceof Error)return`${e.name}: ${e.message}`;try{return typeof e==`string`?e:JSON.stringify(e)}catch{return String(e)}}async function hr(){try{let n=ur(process.argv.slice(2),import.meta.url);if(n.handled){n.output&&process.stdout.write(n.output),process.exit(n.exitCode);return}let r=ot();e.debug(`Configuration loaded:`,r);let i=at(r);if(!i.valid){e.error(`Configuration validation failed:`),i.errors.forEach(t=>e.error(` - ${t}`)),process.exit(1);return}let a=ae();if(a.cleanupOnStart&&a.enabled){let t=await se();t.removedFiles>0&&e.info(`[artifacts] Startup cleanup removed ${t.removedFiles} files (${t.removedBytes} bytes)`)}e.info(`Creating MCP server instance...`);let o=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),s=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase();await _e(s===`full`||s===`workflow`||s===`search`?s:`search`);let c=new sr(r),l=oe(),d=Math.max(1e3,m),f=Math.max(1,t),p={windowStart:Date.now(),errorCount:0,degradedMode:!1},h=(t,n)=>{pr(n)&&(e.error(`[${t}] FATAL unrecoverable error — forcing exit: ${mr(n)}`),process.exit(1));let r=Date.now();r-p.windowStart>d&&(p.windowStart=r,p.errorCount=0),p.errorCount+=1,e.error(`[${t}] Runtime failure captured (${p.errorCount}/${f}): ${mr(n)}`),!p.degradedMode&&p.errorCount>=f&&(p.degradedMode=!0,c.enterDegradedMode(`Runtime failures reached ${p.errorCount} within ${d}ms`),e.warn(`Degraded mode enabled. Server keeps running without forced process exit.`))};process.on(`SIGINT`,async()=>{e.info(`Received SIGINT, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out, forcing exit`),process.exit(1)},u);t.unref();try{l?.(),await c.close()}catch(t){e.error(`Error during SIGINT shutdown:`,t)}clearTimeout(t),process.exit(0)}),process.on(`SIGTERM`,async()=>{e.info(`Received SIGTERM, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out, forcing exit`),process.exit(1)},u);t.unref();try{l?.(),await c.close()}catch(t){e.error(`Error during SIGTERM shutdown:`,t)}clearTimeout(t),process.exit(0)}),process.on(`uncaughtException`,e=>{h(`uncaughtException`,e)}),process.on(`unhandledRejection`,e=>{h(`unhandledRejection`,e)}),e.info(`Starting MCP server...`),await c.start(),e.info(`MCP server started successfully`),o===`stdio`&&(process.stdin.resume(),process.stdin.on(`end`,async()=>{e.info(`stdin EOF — parent disconnected, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out after stdin EOF, forcing exit`),process.exit(1)},u);t.unref();try{l?.(),await c.close()}catch(t){e.error(`Error during stdin EOF shutdown:`,t)}clearTimeout(t),process.exit(0)})),e.info(`MCP server is running. Press Ctrl+C to stop.`)}catch(t){e.error(`Failed to start MCP server:`),t instanceof Error&&(e.error(`Error name:`,t.name),e.error(`Error message:`,t.message),e.error(`Error stack:`,t.stack)),e.error(`Full error object:`,JSON.stringify(t,null,2));let n=t?.code,r=t instanceof Error?t.message:String(t);n===`EADDRINUSE`&&e.error(`Port is already in use. Please check if another instance is running.`),r?.includes(`credentials`)&&e.error(`Authentication failed. Please check your API keys or credentials.`),process.exit(1)}}hr();export{hr as main};