@jshookmcp/jshook 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) 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-CUpZBh5O.mjs} +1 -1
  5. package/dist/BrowserSessionCoordinator-QIt3tetp.mjs +1 -0
  6. package/dist/CodeInjector-Btj9upnf.mjs +1 -0
  7. package/dist/ConsoleMonitor-DIjN5Afa.mjs +306 -0
  8. package/dist/{DarwinAPI-DC4HGGLl.mjs → DarwinAPI-BuMPGzHm.mjs} +1 -1
  9. package/dist/DetailedDataManager-Z77fDl9Z.mjs +5 -0
  10. package/dist/ExtensionManager.tools-CIGOWViz.mjs +1 -0
  11. package/dist/{FingerprintManager-N7BZqjxP.mjs → FingerprintManager-BkDSsjjP.mjs} +1 -1
  12. package/dist/{HardwareBreakpoint-OcJqNFVc.mjs → HardwareBreakpoint-DMAMcPyB.mjs} +1 -1
  13. package/dist/{HeapAnalyzer-CqAxZzeS.mjs → HeapAnalyzer-Yj348FYt.mjs} +1 -1
  14. package/dist/MCPServer.activation.ttl-CEGNBycZ.mjs +1 -0
  15. package/dist/MCPServer.search.helpers-Cs1JpKbu.mjs +1 -0
  16. package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
  17. package/dist/MemoryController-DjtgiING.mjs +2 -0
  18. package/dist/{MemoryScanSession-CaxAjZJf.mjs → MemoryScanSession-zfoVZJB0.mjs} +1 -1
  19. package/dist/MemoryScanner-Dxd657li.mjs +1 -0
  20. package/dist/{NativeMemoryManager.utils-DM4NC3FE.mjs → NativeMemoryManager.utils-Bu8srMEF.mjs} +1 -1
  21. package/dist/{PEAnalyzer-DJyaJTQJ.mjs → PEAnalyzer-CMu9Ua9T.mjs} +1 -1
  22. package/dist/PointerChainEngine-CaSC1Mry.mjs +1 -0
  23. package/dist/ProcessRegistry-D5y1yuP2.mjs +1 -0
  24. package/dist/{ResponseBuilder-B2lu4KEl.mjs → ResponseBuilder-nPXl_khE.mjs} +1 -1
  25. package/dist/{ReverseEvidenceGraph-B931HeoW.mjs → ReverseEvidenceGraph-BksOpsPs.mjs} +1 -1
  26. package/dist/RingBuffer-B6RTHmij.mjs +1 -0
  27. package/dist/ServerRuntimeState-CgqBBwfd.mjs +1 -0
  28. package/dist/{Speedhack-l6s8L2Qw.mjs → Speedhack-pwXTHxOY.mjs} +1 -1
  29. package/dist/{StructureAnalyzer-A-WamfYE.mjs → StructureAnalyzer-BseGzsSl.mjs} +2 -2
  30. package/dist/ToolCatalog-DgmQXdsm.mjs +1 -0
  31. package/dist/ToolHandlerMap-7HWoIgQO.mjs +1 -0
  32. package/dist/ToolProbe-DQiREmNp.mjs +1 -0
  33. package/dist/ToolRegistry-eMZEBiR1.mjs +1 -0
  34. package/dist/ToolRouter.policy-UKBlFlbh.mjs +4 -0
  35. package/dist/{TraceRecorder-Dd8jLXpi.mjs → TraceRecorder-B5ktv3nP.mjs} +2 -2
  36. package/dist/VersionDetector-CmPJmaJg.mjs +1 -0
  37. package/dist/{Win32API-Bhi5xFBe.mjs → Win32API-DoP3MMHS.mjs} +1 -1
  38. package/dist/{Win32Debug-CQteFL4F.mjs → Win32Debug-DwF8mQGm.mjs} +1 -1
  39. package/dist/{WorkflowEngine-CxEp2WXH.mjs → WorkflowEngine-CldHG5b4.mjs} +1 -1
  40. package/dist/analysis-C-ln0Brh.mjs +6 -0
  41. package/dist/antidebug-CsnpOR9z.mjs +1 -0
  42. package/dist/{artifactRetention-NBdncOEW.mjs → artifactRetention-DkYKLOvi.mjs} +1 -1
  43. package/dist/{artifacts-B5xQuEa_.mjs → artifacts-D-4pSS_N.mjs} +1 -1
  44. package/dist/betterSqlite3-Bdo_ifuJ.mjs +1 -0
  45. package/dist/binary-instrument-BeZ224mZ.mjs +9 -0
  46. package/dist/{boringssl-inspector-BST5vtKx.mjs → boringssl-inspector-ZOCkaipa.mjs} +2 -2
  47. package/dist/browser-BUaB25bk.mjs +11 -0
  48. package/dist/{handlers-pVNpaw4A.mjs → canvas-396ieNv5.mjs} +22 -22
  49. package/dist/collector-CB2syQEg.mjs +1 -0
  50. package/dist/constants-DMv3svps.mjs +2 -0
  51. package/dist/coordination-Dbohmj6D.mjs +1 -0
  52. package/dist/dart-inspector-LhEqRITQ.mjs +0 -0
  53. package/dist/debugger-CLzkObIO.mjs +1 -0
  54. package/dist/{definitions-CCP9gphV.mjs → definitions-0hxnrDU72.mjs} +1 -1
  55. package/dist/definitions-B3a9QC2t.mjs +1 -0
  56. package/dist/{definitions-DtE0XLrT.mjs → definitions-BOvju5t2.mjs} +1 -1
  57. package/dist/definitions-CXj_cEVt.mjs +1 -0
  58. package/dist/definitions-Co6AvTjH.mjs +1 -0
  59. package/dist/{definitions-Dds_zrWx.mjs → definitions-Cv5r8xwq.mjs} +1 -1
  60. package/dist/definitions-DBYSxChX.mjs +1 -0
  61. package/dist/{definitions-DI9YXsJk.mjs → definitions-D_dTDX9B.mjs} +1 -1
  62. package/dist/{definitions-Dgrg7f3D.mjs → definitions-Db9t2ddh.mjs} +1 -1
  63. package/dist/{definitions-DZ8uKusP.mjs → definitions-DbN2CjI2.mjs} +1 -1
  64. package/dist/{definitions-jXPaVy4P.mjs → definitions-DlmmHmZc.mjs} +1 -1
  65. package/dist/definitions-DnYpoGig.mjs +1 -0
  66. package/dist/{definitions-CYFbewnd.mjs → definitions-DtZ6Ktx2.mjs} +1 -1
  67. package/dist/{definitions-CuJRsJ6N.mjs → definitions-DuIPS8gq.mjs} +1 -1
  68. package/dist/{definitions-BbxOUiP-.mjs → definitions-DywfwPMb.mjs} +1 -1
  69. package/dist/definitions-EGmqr85H.mjs +1 -0
  70. package/dist/{definitions-LaYTuwQd.mjs → definitions-Fetw_Cge.mjs} +3 -3
  71. package/dist/{definitions-NoVp_9Pm.mjs → definitions-LdkeuOeA.mjs} +1 -1
  72. package/dist/{definitions-DJklW2sS.mjs → definitions-Ym8niHDb.mjs} +1 -1
  73. package/dist/{definitions-BGwNSkVm.mjs → definitions-aeRd5DAR.mjs} +1 -1
  74. package/dist/{definitions-CIO9O-Sw.mjs → definitions-cnG6tj17.mjs} +1 -1
  75. package/dist/{encoding-DGcr6Aj_.mjs → encoding-B4xZWErf.mjs} +2 -2
  76. package/dist/ensure-browser-core-JHwDo5ql.mjs +285 -0
  77. package/dist/{factory-Cx_1LorX.mjs → factory-BxNdBiZa.mjs} +1 -1
  78. package/dist/{graphql-HLf3MS8H.mjs → graphql-GBWsZ9xC.mjs} +4 -4
  79. package/dist/{handlers-DW5AbYs5.mjs → handlers-5nzR8B0a.mjs} +3 -3
  80. package/dist/handlers-6iNsXOVT.mjs +7 -0
  81. package/dist/{handlers-BZoPla6E.mjs → handlers-BZ8n6Hvf.mjs} +1 -1
  82. package/dist/{handlers-Dv_runVv.mjs → handlers-BbLxNbbT.mjs} +1 -1
  83. package/dist/{handlers-BP12ZsWc.mjs → handlers-BbS4hssc.mjs} +2 -2
  84. package/dist/{handlers-BggKiVx9.mjs → handlers-CIKOP4aI.mjs} +2 -2
  85. package/dist/handlers-CWKBBjai.mjs +1 -0
  86. package/dist/handlers-Cmb6SoRC.mjs +1 -0
  87. package/dist/handlers-CrJsKnEI.mjs +1 -0
  88. package/dist/{antidebug-BOTZH6-0.mjs → handlers-DB6xVVWq.mjs} +4 -4
  89. package/dist/{handlers-DmQzIc44.mjs → handlers-DOOCWUNR.mjs} +3 -3
  90. package/dist/{handlers-BLMa4X7l.mjs → handlers-Z_B5aVaU.mjs} +2 -2
  91. package/dist/handlers-gVscChvl.mjs +1 -0
  92. package/dist/handlers-xFvI9P_y.mjs +1 -0
  93. package/dist/handlers.impl-BsFTW6SD.mjs +1 -0
  94. package/dist/{hooks-DDKppogd.mjs → hooks-DPouiS7I.mjs} +9 -9
  95. package/dist/index.mjs +11 -15
  96. package/dist/macro-p8kuJVcm.mjs +2 -0
  97. package/dist/maintenance-DAqADb6Z.mjs +302 -0
  98. package/dist/manifest-4lmM6MZR.mjs +1 -0
  99. package/dist/{manifest-D610kxZr.mjs → manifest-AxaxRSt6.mjs} +2 -2
  100. package/dist/{manifest-CDeUZGUZ.mjs → manifest-BIqRE1Qz.mjs} +1 -1
  101. package/dist/{manifest-Dm0o3i2U.mjs → manifest-Box-jWfr.mjs} +1 -1
  102. package/dist/manifest-Bp33di0Q.mjs +1 -0
  103. package/dist/{manifest-CGq4NpqH2.mjs → manifest-BvRX4nRP.mjs} +1 -1
  104. package/dist/{manifest-yu2xiQqe.mjs → manifest-C6KoB1XE.mjs} +1 -1
  105. package/dist/manifest-C7TdXCWY.mjs +1 -0
  106. package/dist/manifest-CM-n64K0.mjs +1 -0
  107. package/dist/{manifest-DWUUWBz0.mjs → manifest-CUokxCUN.mjs} +1 -1
  108. package/dist/manifest-CWJS45iO.mjs +1 -0
  109. package/dist/{manifest-D44TaRJU.mjs → manifest-Cdxdgo-D.mjs} +1 -1
  110. package/dist/{manifest-DKUorv5M.mjs → manifest-Cf6SmamD.mjs} +1 -1
  111. package/dist/manifest-Cgxu2qdv.mjs +1 -0
  112. package/dist/manifest-CowGSURa2.mjs +1 -0
  113. package/dist/manifest-CsGIrh34.mjs +1 -0
  114. package/dist/manifest-CvDpVToN.mjs +1 -0
  115. package/dist/manifest-D8TL9RLE.mjs +1 -0
  116. package/dist/{manifest-C7qV1z7F.mjs → manifest-DIhtCBe6.mjs} +1 -1
  117. package/dist/{manifest-CeQmtQOY.mjs → manifest-DJbruNOg.mjs} +1 -1
  118. package/dist/manifest-DLGtZH-0.mjs +1 -0
  119. package/dist/manifest-DXHdPt2T.mjs +1 -0
  120. package/dist/{manifest-DMJlcsTR.mjs → manifest-Dg5ScOyW.mjs} +1 -1
  121. package/dist/{manifest-C1nZkTkO.mjs → manifest-DzGoTS0R.mjs} +1 -1
  122. package/dist/manifest-G2H52LKz.mjs +131 -0
  123. package/dist/manifest-P0Futrgb.mjs +1 -0
  124. package/dist/{manifest-CDiCtaQT.mjs → manifest-Qw7xgvjv.mjs} +1 -1
  125. package/dist/{manifest-Dgh0uDW-.mjs → manifest-W3qvVrP2.mjs} +1 -1
  126. package/dist/manifest-dG6MuR1U.mjs +1 -0
  127. package/dist/manifest-nWXtgq5Y2.mjs +1 -0
  128. package/dist/{manifest-BPuE6oH2.mjs → manifest-vp1upSSq.mjs} +1 -1
  129. package/dist/modules-DO3jXCgj.mjs +333 -0
  130. package/dist/{mojo-ipc-VGlv3Qyp.mjs → mojo-ipc-Be-ccWrc.mjs} +1 -1
  131. package/dist/native/scripts/linux/enum-windows.sh +12 -12
  132. package/dist/native/scripts/macos/enum-windows.applescript +22 -22
  133. package/dist/native-g095qhpK.mjs +961 -0
  134. package/dist/network-Dvxm7eEI.mjs +7 -0
  135. package/dist/outputPaths-D2ddHrOJ.mjs +2 -0
  136. package/dist/{parse-args-Cuk7-xUt.mjs → parse-args-ngRrvF9e.mjs} +1 -1
  137. package/dist/platform-DjWbuiF8.mjs +93 -0
  138. package/dist/process-Dq5I-KZW.mjs +2 -0
  139. package/dist/proxy-DPNgM7TE.mjs +2 -0
  140. package/dist/{registry-DUHIPE-v.mjs → registry-xB8Wgmyj.mjs} +1 -1
  141. package/dist/renderer-pid-7jbTR8f5.mjs +1 -0
  142. package/dist/search-defaults-CJik67or.mjs +1 -0
  143. package/dist/server/plugin-api.d.mts +19 -36
  144. package/dist/server/plugin-api.mjs +1 -1
  145. package/dist/sourcemap-DqEW15Ao.mjs +1 -0
  146. package/dist/streaming-Dbk4eStJ.mjs +1 -0
  147. package/dist/transform-D-peM3aO.mjs +103 -0
  148. package/dist/wasm-CZajRaad.mjs +174 -0
  149. package/dist/{webcrack-CsLLJIs9.mjs → webcrack-phEfVt5y.mjs} +3 -3
  150. package/dist/{workflow-CYIXtrWD.mjs → workflow-wkXb3x-U.mjs} +4 -4
  151. package/package.json +16 -15
  152. package/src/native/scripts/linux/enum-windows.sh +12 -12
  153. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  154. package/dist/CodeInjector-BlgyqTOk.mjs +0 -1
  155. package/dist/ConsoleMonitor-Dkqc0HNi.mjs +0 -490
  156. package/dist/DOMInspector-BYY_EJ0C.mjs +0 -95
  157. package/dist/DetailedDataManager-BniBJlVv.mjs +0 -1
  158. package/dist/ExtensionManager-erMpqcLk.mjs +0 -1
  159. package/dist/MCPServer.search.handlers.domain-DVbWL1bT.mjs +0 -1
  160. package/dist/MemoryController-BaqstM5w.mjs +0 -2
  161. package/dist/MemoryScanner-BLYnMJy6.mjs +0 -1
  162. package/dist/NativeMemoryManager.impl-CI554XbY.mjs +0 -1
  163. package/dist/PageController-D9jVkH0i.mjs +0 -1
  164. package/dist/PointerChainEngine-5nF9eNlu.mjs +0 -1
  165. package/dist/PrerequisiteError-Bl3dK8XA.mjs +0 -1
  166. package/dist/ProcessRegistry-Hf12LlR9.mjs +0 -1
  167. package/dist/ScriptManager-fgqiALgj.mjs +0 -7
  168. package/dist/ToolCatalog-D_IKl1Hu.mjs +0 -1
  169. package/dist/ToolProbe-xsfALmN3.mjs +0 -1
  170. package/dist/ToolRegistry-B0Zs-phN.mjs +0 -1
  171. package/dist/ToolRouter.policy-CFHoN_Lw.mjs +0 -4
  172. package/dist/VersionDetector-DMoUWyNm.mjs +0 -9
  173. package/dist/analysis-BuR-NgX8.mjs +0 -5
  174. package/dist/betterSqlite3-CGaxz4AX.mjs +0 -1
  175. package/dist/binary-instrument-Cf9qqLlM.mjs +0 -7
  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/coordination-BbijHEHH.mjs +0 -1
  180. package/dist/debugger-CRJq_krh.mjs +0 -1
  181. package/dist/definitions-BGobEDQa.mjs +0 -1
  182. package/dist/definitions-CdWEuIkI.mjs +0 -1
  183. package/dist/definitions-CoQFbggH.mjs +0 -1
  184. package/dist/definitions-OvGsfxdt.mjs +0 -1
  185. package/dist/ensure-browser-core-Buls24LQ.mjs +0 -1
  186. package/dist/flat-target-session-CO5g78k3.mjs +0 -1
  187. package/dist/handlers-D3iev8g1.mjs +0 -1
  188. package/dist/handlers-D49r1-1P.mjs +0 -1
  189. package/dist/handlers-DCE45Ww8.mjs +0 -2
  190. package/dist/handlers-De5u62Ga2.mjs +0 -1
  191. package/dist/handlers-DnJRGp7t.mjs +0 -302
  192. package/dist/handlers-S9Ws0IGy.mjs +0 -2
  193. package/dist/handlers.impl-CD2_kOcC.mjs +0 -1
  194. package/dist/maintenance-CutEO84j.mjs +0 -1
  195. package/dist/manifest-BFGxlDRh.mjs +0 -123
  196. package/dist/manifest-BXry5N09.mjs +0 -1
  197. package/dist/manifest-BeP_zJGb2.mjs +0 -1
  198. package/dist/manifest-C0g67k6U.mjs +0 -1
  199. package/dist/manifest-CFn0359q2.mjs +0 -1
  200. package/dist/manifest-CJMGt7Qy.mjs +0 -1
  201. package/dist/manifest-CRIJq4Hs.mjs +0 -1
  202. package/dist/manifest-C_hEIjSx.mjs +0 -1
  203. package/dist/manifest-Cq0j7GZt.mjs +0 -1
  204. package/dist/manifest-CtPmHAdn.mjs +0 -1
  205. package/dist/manifest-Cx2IVMUY.mjs +0 -1
  206. package/dist/manifest-D16xPXro.mjs +0 -1
  207. package/dist/manifest-DC-SMF6b.mjs +0 -1
  208. package/dist/manifest-DD3rtxvV.mjs +0 -1
  209. package/dist/manifest-De-6Wf2R.mjs +0 -1
  210. package/dist/manifest-DsVh7Y4U.mjs +0 -1
  211. package/dist/manifest-DtEFSRaq.mjs +0 -1
  212. package/dist/manifest-H-EpAyZQ.mjs +0 -1
  213. package/dist/manifest-ais9Afrw.mjs +0 -1
  214. package/dist/manifest-tmb54wmA.mjs +0 -1
  215. package/dist/manifest-zrbrpKCC.mjs +0 -1
  216. package/dist/matchesWildcardPattern-BGqLSmEs.mjs +0 -1
  217. package/dist/modules-p-PUNv9r.mjs +0 -332
  218. package/dist/network-BjZ1Y-GB.mjs +0 -7
  219. package/dist/outputPaths-BonGThuc.mjs +0 -2
  220. package/dist/platform-C446Lf97.mjs +0 -93
  221. package/dist/playwright-cdp-fallback-BwVR-_T3.mjs +0 -1
  222. package/dist/process-C9f2A5zk.mjs +0 -962
  223. package/dist/proxy-CvRepxgV.mjs +0 -1
  224. package/dist/search-defaults-D2bY-rzH.mjs +0 -1
  225. package/dist/shared-state-board-Cyg-xh_k.mjs +0 -1
  226. package/dist/sourcemap-D6Q1UuAp.mjs +0 -1
  227. package/dist/streaming-CTX58tbb.mjs +0 -1
  228. package/dist/transform-Cv9P2vVD.mjs +0 -103
  229. package/dist/types-DtThH00r.mjs +0 -1
  230. package/dist/wasm-DaJa8J0V.mjs +0 -174
  231. /package/dist/{CacheAdapters-CdAxBmVW.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
  232. /package/dist/{EventBus-DgciURGg.mjs → EventBus-Cm-t-B65.mjs} +0 -0
  233. /package/dist/{EvidenceGraphBridge-BIfgB7HP.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
  234. /package/dist/{HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
  235. /package/dist/{InstrumentationSession-DxXs0sCp.mjs → InstrumentationSession-c5qZyp7d.mjs} +0 -0
  236. /package/dist/{StealthVerifier-Dhbj4B4P.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
  237. /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
  238. /package/dist/{authorization-schema-B40obG1A.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
  239. /package/dist/{bind-helpers-BlAOQrFQ.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
  240. /package/dist/{capabilities-DbYCv-HF.mjs → capabilities-L1ax5EHS.mjs} +0 -0
  241. /package/dist/{chunk-C_pMuVsO.mjs → chunk-88NL7fhV.mjs} +0 -0
  242. /package/dist/{concurrency-CcK46d0h.mjs → concurrency-Dehnw4JC.mjs} +0 -0
  243. /package/dist/{evidence-graph-bridge-B0yhGPcs.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
  244. /package/dist/{formatAddress-C7j2fDlM.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
  245. /package/dist/{logger-sBC6IdRT.mjs → logger-CCikqqvj.mjs} +0 -0
  246. /package/dist/{response-C7rKQst4.mjs → response-B1RuVVfD.mjs} +0 -0
  247. /package/dist/{ssrf-policy-T96MR3r6.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
  248. /package/dist/{tool-builder-CI9914Tf.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
  249. /package/dist/{types-CuyefmGT.mjs → types-BzPBzmVB.mjs} +0 -0
@@ -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-CCikqqvj.mjs";import{d as t,u as n}from"./ensure-browser-core-JHwDo5ql.mjs";import{c as r,o as i,s as a,t as o}from"./parse-args-ngRrvF9e.mjs";import"./definitions-0hxnrDU72.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(a){try{let o=r(a,`hookId`),s=r(a,`code`),c=i(a,`method`,`evaluate`);if(this.hasAttachedTargetSession())c===`evaluateOnNewDocument`?(await this.addPersistentScriptToManagedTargets(o,s),e.info(`Hook injected into attached target (evaluateOnNewDocument): ${o}`)):(await this.evaluateInAttachedTarget(s),e.info(`Hook injected into attached target (evaluate): ${o}`));else{let r=await this.pageController.getPage();c===`evaluateOnNewDocument`?(await n(r,s),e.info(`Hook injected (evaluateOnNewDocument): ${o}`)):(await t(r,s),e.info(`Hook injected (evaluate): ${o}`))}return this.injectedHooks.set(o,{code:s,injectionTime:Date.now()}),{content:[{type:`text`,text:JSON.stringify({success:!0,hookId:o,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(n){try{let e=r(n,`hookId`),i=this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
2
2
  const hookId = ${JSON.stringify(e)};
3
3
  const hooks = globalThis.__aiHooks;
4
4
  if (!hooks?.[hookId]) {
@@ -10,7 +10,7 @@ import{t as e}from"./logger-sBC6IdRT.mjs";import{a as t,o as n,s as r,t as i}fro
10
10
  records: hooks[hookId],
11
11
  totalRecords: hooks[hookId].length,
12
12
  };
13
- })()`):await o(await this.pageController.getPage(),e=>window.__aiHooks?.[e]?{hookId:e,metadata:window.__aiHookMetadata?.[e],records:window.__aiHooks[e],totalRecords:window.__aiHooks[e].length}:null,e);return n?{content:[{type:`text`,text:JSON.stringify({success:!0,...n},null,2)}]}:{content:[{type:`text`,text:JSON.stringify({success:!1,message:`Hook: ${e}`},null,2)}]}}catch(t){return e.error(`Failed to get hook data`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookList(t){try{let e=this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
13
+ })()`):await t(await this.pageController.getPage(),e=>window.__aiHooks?.[e]?{hookId:e,metadata:window.__aiHookMetadata?.[e],records:window.__aiHooks[e],totalRecords:window.__aiHooks[e].length}:null,e);return i?{content:[{type:`text`,text:JSON.stringify({success:!0,...i},null,2)}]}:{content:[{type:`text`,text:JSON.stringify({success:!1,message:`Hook: ${e}`},null,2)}]}}catch(t){return e.error(`Failed to get hook data`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookList(n){try{let e=this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
14
14
  const metadata = globalThis.__aiHookMetadata;
15
15
  const hooks = globalThis.__aiHooks;
16
16
  if (!metadata) {
@@ -21,27 +21,27 @@ import{t as e}from"./logger-sBC6IdRT.mjs";import{a as t,o as n,s as r,t as i}fro
21
21
  metadata: metadata[hookId],
22
22
  recordCount: hooks?.[hookId]?.length || 0,
23
23
  }));
24
- })()`):await o(await this.pageController.getPage(),()=>window.__aiHookMetadata?Object.keys(window.__aiHookMetadata).map(e=>({hookId:e,metadata:window.__aiHookMetadata[e],recordCount:window.__aiHooks?.[e]?.length||0})):[]);return{content:[{type:`text`,text:JSON.stringify({success:!0,totalHooks:e.length,hooks:e},null,2)}]}}catch(t){return e.error(`Failed to list hooks`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookClear(n){try{let e=t(n,`hookId`);return e?(this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
24
+ })()`):await t(await this.pageController.getPage(),()=>window.__aiHookMetadata?Object.keys(window.__aiHookMetadata).map(e=>({hookId:e,metadata:window.__aiHookMetadata[e],recordCount:window.__aiHooks?.[e]?.length||0})):[]);return{content:[{type:`text`,text:JSON.stringify({success:!0,totalHooks:e.length,hooks:e},null,2)}]}}catch(t){return e.error(`Failed to list hooks`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookClear(n){try{let e=i(n,`hookId`);return e?(this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
25
25
  const hookId = ${JSON.stringify(e)};
26
26
  if (globalThis.__aiHooks?.[hookId]) {
27
27
  globalThis.__aiHooks[hookId] = [];
28
28
  }
29
29
  return true;
30
- })()`):await o(await this.pageController.getPage(),e=>{window.__aiHooks?.[e]&&(window.__aiHooks[e]=[])},e),{content:[{type:`text`,text:JSON.stringify({success:!0,message:`Hook: ${e}`},null,2)}]}):(this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
30
+ })()`):await t(await this.pageController.getPage(),e=>{window.__aiHooks?.[e]&&(window.__aiHooks[e]=[])},e),{content:[{type:`text`,text:JSON.stringify({success:!0,message:`Hook: ${e}`},null,2)}]}):(this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
31
31
  if (globalThis.__aiHooks) {
32
32
  for (const key in globalThis.__aiHooks) {
33
33
  globalThis.__aiHooks[key] = [];
34
34
  }
35
35
  }
36
36
  return true;
37
- })()`):await o(await this.pageController.getPage(),()=>{if(window.__aiHooks)for(let e in window.__aiHooks)window.__aiHooks[e]=[]}),{content:[{type:`text`,text:JSON.stringify({success:!0,message:`Hook`},null,2)}]})}catch(t){return e.error(`Failed to clear hook data`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookToggle(t){try{let e=r(t,`hookId`),n=i(t,`enabled`);return this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
37
+ })()`):await t(await this.pageController.getPage(),()=>{if(window.__aiHooks)for(let e in window.__aiHooks)window.__aiHooks[e]=[]}),{content:[{type:`text`,text:JSON.stringify({success:!0,message:`Hook`},null,2)}]})}catch(t){return e.error(`Failed to clear hook data`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookToggle(n){try{let e=r(n,`hookId`),i=o(n,`enabled`);return this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
38
38
  const hookId = ${JSON.stringify(e)};
39
- const enabled = ${JSON.stringify(n)};
39
+ const enabled = ${JSON.stringify(i)};
40
40
  if (globalThis.__aiHookMetadata?.[hookId]) {
41
41
  globalThis.__aiHookMetadata[hookId].enabled = enabled;
42
42
  }
43
43
  return true;
44
- })()`):await o(await this.pageController.getPage(),(e,t)=>{window.__aiHookMetadata?.[e]&&(window.__aiHookMetadata[e].enabled=t)},e,n),{content:[{type:`text`,text:JSON.stringify({success:!0,hookId:e,enabled:n,message:`Hook`},null,2)}]}}catch(t){return e.error(`Failed to toggle hook`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookExport(n){try{let e=t(n,`hookId`),r=t(n,`format`,`json`),i=this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
44
+ })()`):await t(await this.pageController.getPage(),(e,t)=>{window.__aiHookMetadata?.[e]&&(window.__aiHookMetadata[e].enabled=t)},e,i),{content:[{type:`text`,text:JSON.stringify({success:!0,hookId:e,enabled:i,message:`Hook`},null,2)}]}}catch(t){return e.error(`Failed to toggle hook`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHookExport(n){try{let e=i(n,`hookId`),r=i(n,`format`,`json`),a=this.hasAttachedTargetSession()?await this.evaluateInAttachedTarget(`(() => {
45
45
  const hookId = ${JSON.stringify(e)};
46
46
  if (hookId) {
47
47
  return {
@@ -54,7 +54,7 @@ import{t as e}from"./logger-sBC6IdRT.mjs";import{a as t,o as n,s as r,t as i}fro
54
54
  metadata: globalThis.__aiHookMetadata || {},
55
55
  records: globalThis.__aiHooks || {},
56
56
  };
57
- })()`):await o(await this.pageController.getPage(),e=>e?{hookId:e,metadata:window.__aiHookMetadata?.[e],records:window.__aiHooks?.[e]||[]}:{metadata:window.__aiHookMetadata||{},records:window.__aiHooks||{}},e);return{content:[{type:`text`,text:JSON.stringify({success:!0,format:r,data:i,exportTime:new Date().toISOString()},null,2)}]}}catch(t){return e.error(`Failed to export hook data`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHook(e){let t=String(e.action??``);switch(t){case`inject`:return this.handleAIHookInject(e);case`get_data`:return this.handleAIHookGetData(e);case`list`:return this.handleAIHookList(e);case`clear`:return this.handleAIHookClear(e);case`toggle`:return this.handleAIHookToggle(e);case`export`:return this.handleAIHookExport(e);default:return{content:[{type:`text`,text:JSON.stringify({success:!1,error:`Unknown action: ${t}. Valid actions: inject, get_data, list, clear, toggle, export`})}]}}}};function c(e,t,n,r){let i=n?`const __stack = new Error().stack?.split('\\n').slice(1,4).join(' | ') || '';`:`const __stack = '';`,a=r?`console.log(__msg + (__stack ? ' | Stack: ' + __stack : ''));`:``;return`
57
+ })()`):await t(await this.pageController.getPage(),e=>e?{hookId:e,metadata:window.__aiHookMetadata?.[e],records:window.__aiHooks?.[e]||[]}:{metadata:window.__aiHookMetadata||{},records:window.__aiHooks||{}},e);return{content:[{type:`text`,text:JSON.stringify({success:!0,format:r,data:a,exportTime:new Date().toISOString()},null,2)}]}}catch(t){return e.error(`Failed to export hook data`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}async handleAIHook(e){let t=String(e.action??``);switch(t){case`inject`:return this.handleAIHookInject(e);case`get_data`:return this.handleAIHookGetData(e);case`list`:return this.handleAIHookList(e);case`clear`:return this.handleAIHookClear(e);case`toggle`:return this.handleAIHookToggle(e);case`export`:return this.handleAIHookExport(e);default:return{content:[{type:`text`,text:JSON.stringify({success:!1,error:`Unknown action: ${t}. Valid actions: inject, get_data, list, clear, toggle, export`})}]}}}};function c(e,t,n,r){let i=n?`const __stack = new Error().stack?.split('\\n').slice(1,4).join(' | ') || '';`:`const __stack = '';`,a=r?`console.log(__msg + (__stack ? ' | Stack: ' + __stack : ''));`:``;return`
58
58
  (function() {
59
59
  if (window.__hookPresets === undefined) window.__hookPresets = {};
60
60
  if (window.__hookPresets['${e}']) return;
@@ -597,4 +597,4 @@ import{t as e}from"./logger-sBC6IdRT.mjs";import{a as t,o as n,s as r,t as i}fro
597
597
  return new _Memory(descriptor);
598
598
  };
599
599
  WebAssembly.Memory.prototype = _Memory.prototype;
600
- }`,e,t)}},d={...l,...u},f=Object.entries(d).map(([e,t])=>({id:e,description:t.description}));var p=class{pageController;constructor(e){this.pageController=e}async handleHookPreset(r){try{let a=this.buildCustomPresetMap(r),o={...d,...a},s=[...f,...Object.entries(a).map(([e,t])=>({id:e,description:`${t.description} (custom)`}))];if(r.listPresets===!0)return{content:[{type:`text`,text:JSON.stringify({success:!0,totalPresets:s.length,presets:s},null,2)}]};let c=i(r,`captureStack`,!1),l=i(r,`logToConsole`,!0),u=t(r,`method`,`evaluate`),p=[];if(r.preset)p=[t(r,`preset`)];else if(Array.isArray(r.presets))p=n(r,`presets`);else return{content:[{type:`text`,text:JSON.stringify({success:!1,error:` Provide either preset (single) or presets (multiple), or set listPresets=true to list available presets`},null,2)}]};let m=p.filter(e=>!o[e]);if(m.length>0)return{content:[{type:`text`,text:JSON.stringify({success:!1,error:`: ${m.join(`, `)}`,availablePresets:s.map(e=>e.id)},null,2)}]};let h=await this.pageController.getPage(),g=[],_=[];for(let t of p)try{let n=o[t].buildCode(c,l);u===`evaluateOnNewDocument`?await h.evaluateOnNewDocument(n):await h.evaluate(n),g.push(t),e.info(` Hook preset injected: ${t}`)}catch(n){let r=n instanceof Error?n.message:String(n);_.push({preset:t,error:r}),e.error(` Failed to inject preset ${t}:`,n)}return{content:[{type:`text`,text:JSON.stringify({success:_.length===0,injected:g,failed:_,method:u,captureStack:c,message:` ${g.length}/${p.length} Hook`,usage:` ai_hook_get_data(hookId: "preset-<>") `},null,2)}]}}catch(t){return e.error(`Hook preset injection failed`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}buildCustomPresetMap(e){let t=[];e.customTemplate&&typeof e.customTemplate==`object`&&t.push(e.customTemplate),Array.isArray(e.customTemplates)&&t.push(...e.customTemplates);let n={};for(let e of t){let t=e.id?.trim(),r=e.body?.trim();if(!t||!r)throw Error(`Each custom template requires non-empty id and body`);if(d[t])throw Error(`Custom template id conflicts with built-in preset: ${t}`);n[t]={description:e.description?.trim()||`Custom inline preset: ${t}`,buildCode:(e,n)=>c(t,r,e,n)}}return n}};export{s as AIHookToolHandlers,p as HookPresetToolHandlers};
600
+ }`,e,t)}},d={...l,...u},f=Object.entries(d).map(([e,t])=>({id:e,description:t.description}));var p=class{pageController;constructor(e){this.pageController=e}async handleHookPreset(t){try{let n=this.buildCustomPresetMap(t),r={...d,...n},s=[...f,...Object.entries(n).map(([e,t])=>({id:e,description:`${t.description} (custom)`}))];if(t.listPresets===!0)return{content:[{type:`text`,text:JSON.stringify({success:!0,totalPresets:s.length,presets:s},null,2)}]};let c=o(t,`captureStack`,!1),l=o(t,`logToConsole`,!0),u=i(t,`method`,`evaluate`),p=[];if(t.preset)p=[i(t,`preset`)];else if(Array.isArray(t.presets))p=a(t,`presets`);else return{content:[{type:`text`,text:JSON.stringify({success:!1,error:` Provide either preset (single) or presets (multiple), or set listPresets=true to list available presets`},null,2)}]};let m=p.filter(e=>!r[e]);if(m.length>0)return{content:[{type:`text`,text:JSON.stringify({success:!1,error:`: ${m.join(`, `)}`,availablePresets:s.map(e=>e.id)},null,2)}]};let h=await this.pageController.getPage(),g=[],_=[];for(let t of p)try{let n=r[t].buildCode(c,l);u===`evaluateOnNewDocument`?await h.evaluateOnNewDocument(n):await h.evaluate(n),g.push(t),e.info(` Hook preset injected: ${t}`)}catch(n){let r=n instanceof Error?n.message:String(n);_.push({preset:t,error:r}),e.error(` Failed to inject preset ${t}:`,n)}return{content:[{type:`text`,text:JSON.stringify({success:_.length===0,injected:g,failed:_,method:u,captureStack:c,message:` ${g.length}/${p.length} Hook`,usage:` ai_hook_get_data(hookId: "preset-<>") `},null,2)}]}}catch(t){return e.error(`Hook preset injection failed`,t),{content:[{type:`text`,text:JSON.stringify({success:!1,error:t instanceof Error?t.message:String(t)},null,2)}]}}}buildCustomPresetMap(e){let t=[];e.customTemplate&&typeof e.customTemplate==`object`&&t.push(e.customTemplate),Array.isArray(e.customTemplates)&&t.push(...e.customTemplates);let n={};for(let e of t){let t=e.id?.trim(),r=e.body?.trim();if(!t||!r)throw Error(`Each custom template requires non-empty id and body`);if(d[t])throw Error(`Custom template id conflicts with built-in preset: ${t}`);n[t]={description:e.description?.trim()||`Custom inline preset: ${t}`,buildCode:(e,n)=>c(t,r,e,n)}}return n}};export{s as AIHookToolHandlers,p as HookPresetToolHandlers};
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"./chunk-88NL7fhV.mjs";import{t}from"./logger-CCikqqvj.mjs";import{Cn as n,Dn as r,En as i,M as a,Mr as o,N as s,Nr as c,On as l,P as u,Sn as d,Tn as f,Xr as p,a as m,at as h,cr as g,dn as _,dr as v,i as y,it as b,ji as x,kn as S,lr as C,n as w,r as T,t as E,un as ee,ur as te,wn as ne}from"./constants-DMv3svps.mjs";import{a as re,i as ie,n as ae,r as oe,t as se}from"./artifactRetention-DkYKLOvi.mjs";import{d as ce,f as le,l as ue}from"./outputPaths-D2ddHrOJ.mjs";import{a as de,n as fe,r as pe,t as me}from"./DetailedDataManager-Z77fDl9Z.mjs";import{r as D,t as he}from"./response-B1RuVVfD.mjs";import{_ as ge,a as _e,d as ve,f as ye,h as be,i as O,l as xe,m as Se,n as Ce,o as we,p as Te,r as Ee,s as De,u as Oe}from"./ToolCatalog-DgmQXdsm.mjs";import{t as k}from"./ToolError-g3rjWzhx.mjs";import{t as ke}from"./ToolHandlerMap-7HWoIgQO.mjs";import{n as A,r as Ae,t as je}from"./ServerRuntimeState-CgqBBwfd.mjs";import{n as Me,r as Ne,t as Pe}from"./MCPServer.activation.ttl-CEGNBycZ.mjs";import{t as Fe}from"./ProcessRegistry-D5y1yuP2.mjs";import{n as Ie,r as Le,t as Re}from"./ExtensionManager.tools-CIGOWViz.mjs";import{a as j,c as ze,i as Be,n as Ve,o as He,r as M,s as Ue}from"./MCPServer.search.helpers-Cs1JpKbu.mjs";import{t as We}from"./types-BzPBzmVB.mjs";import{_ as Ge,a as Ke,c as qe,d as Je,f as Ye,g as Xe,h as Ze,i as Qe,l as $e,m as et,n as tt,o as nt,p as rt,r as it,s as at,t as ot,u as st,v as ct,y as lt}from"./ToolRouter.policy-UKBlFlbh.mjs";import{n as ut,t as N}from"./MCPServer.search.validation-DnifPCCv.mjs";import{i as dt,r as ft}from"./HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs";import{n as pt}from"./EventBus-Cm-t-B65.mjs";import{n as mt,t as ht}from"./BrowserSessionCoordinator-QIt3tetp.mjs";import{McpServer as gt,ResourceTemplate as _t}from"@modelcontextprotocol/sdk/server/mcp.js";import{CompleteRequestSchema as vt,ErrorCode as P,McpError as F,isJSONRPCErrorResponse as yt,isJSONRPCNotification as bt,isJSONRPCRequest as xt,isJSONRPCResultResponse as St}from"@modelcontextprotocol/sdk/types.js";import{promises as I}from"fs";import{join as Ct}from"path";import{createHash as wt}from"crypto";import{homedir as Tt}from"node:os";import{appendFileSync as Et,existsSync as L,mkdirSync as Dt,readFileSync as Ot}from"node:fs";import{basename as kt,dirname as R,isAbsolute as At,join as z,relative as jt,resolve as B}from"node:path";import{mkdir as Mt,readFile as Nt,readdir as Pt,rename as Ft,writeFile as It}from"node:fs/promises";import{fileURLToPath as Lt,pathToFileURL as Rt}from"node:url";import{ZodError as zt,z as V}from"zod";import{createServer as Bt}from"node:http";import{StdioServerTransport as Vt}from"@modelcontextprotocol/sdk/server/stdio.js";import{createHash as Ht,randomUUID as Ut,timingSafeEqual as Wt}from"node:crypto";import{StreamableHTTPServerTransport as Gt}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var Kt=class{config;constructor(e){this.config=e}async init(){if(this.config.enabled)try{await I.mkdir(this.config.dir,{recursive:!0}),t.debug(`Cache directory initialized: ${this.config.dir}`)}catch(e){t.error(`Failed to initialize cache directory`,e)}}generateKey(e){return wt(`md5`).update(e).digest(`hex`)}getCachePath(e){let t=this.generateKey(e);return Ct(this.config.dir,`${t}.json`)}async get(e){if(!this.config.enabled)return null;try{let n=this.getCachePath(e),r=await I.readFile(n,`utf-8`),i=JSON.parse(r);return Date.now()-i.timestamp>this.config.ttl*1e3?(await this.delete(e),null):(t.debug(`Cache hit: ${e}`),i.value)}catch{return t.debug(`Cache miss: ${e}`),null}}async set(e,n){if(this.config.enabled)try{let r=this.getCachePath(e),i={timestamp:Date.now(),value:n};await I.writeFile(r,JSON.stringify(i),`utf-8`),t.debug(`Cache set: ${e}`)}catch(e){t.error(`Failed to set cache`,e)}}async delete(e){if(this.config.enabled)try{let n=this.getCachePath(e);await I.unlink(n),t.debug(`Cache deleted: ${e}`)}catch(e){e.code!==`ENOENT`&&t.warn(`Cache delete failed:`,e)}}async clear(){if(this.config.enabled)try{let e=await I.readdir(this.config.dir);await Promise.all(e.map(e=>I.unlink(Ct(this.config.dir,e)))),t.info(`Cache cleared`)}catch(e){if(e.code===`ENOENT`)return;t.error(`Failed to clear cache`,e)}}},qt=class{mcpServer;constructor(e){this.mcpServer=e}isSamplingSupported(){try{return!!this.mcpServer.server.getClientCapabilities()?.sampling}catch{return!1}}async sampleText(e){if(!this.isSamplingSupported())return t.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:e.userMessage}}],systemPrompt:e.systemPrompt,maxTokens:e.maxTokens??512,...e.temperature===void 0?{}:{temperature:e.temperature},...e.modelHint?{modelPreferences:{hints:[{name:e.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:(t.warn(`sampling/createMessage returned non-text content`),null)}catch(e){return t.warn(`LLM sampling request failed:`,e),null}}},Jt=class{mcpServer;constructor(e){this.mcpServer=e}isElicitationSupported(){try{return!!this.mcpServer.server.getClientCapabilities()?.elicitation}catch{return!1}}async requestFormInput(e){if(!this.isElicitationSupported())return t.debug(`Elicitation not supported by connected client`),null;try{let t=await this.mcpServer.server.elicitInput(e);return{action:t.action,content:t.content}}catch(e){return t.warn(`Elicitation request failed:`,e),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}}},Yt=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 k(`NOT_FOUND`,`Unknown tool: ${e}`,{toolName:e});return n(t)}};const Xt=[`page_`,`console_`,`debugger_`,`network_`,`dom_`,`stealth_`,`framework_`,`indexeddb_`,`js_heap_`,`script_`,`captcha_`,`ai_hook_`,`instrumentation_`,`hook_preset_`,`ws_`,`evidence_`],Zt=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`]),Qt=new Set([`search_tools`,`route_tool`,`describe_tool`,`call_tool`,`activate_tools`,`deactivate_tools`,`activate_domain`]),$t=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 en=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(Zt.has(e))return this.contextSensitiveCache.set(e,!1),!1;let n=Xt.some(t=>e.startsWith(t));return this.contextSensitiveCache.set(e,n),n}recordCall(e){return Qt.has(e)?0:(e===this.lastToolName?this.consecutiveCount++:(this.lastToolName=e,this.consecutiveCount=1),this.consecutiveCount)}isRepeatLoop(){return this.consecutiveCount>=3}enrichResponse(e,n){if(this.isRepeatLoop()&&!Qt.has(e)&&this.injectRepeatWarning(e,n),!this.isContextSensitive(e)||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 t.debug(`[ContextGuard] Skipped non-JSON response enrichment for ${e}`),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`]:$t.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 tn=3e4;var nn=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(e){let n=this.states.get(e);if(!n||n.state===`closed`)return!1;if(n.state===`open`)return Date.now()-n.lastFailureTime>=tn?(n.state=`half-open`,this.halfOpenCalls.set(e,1),t.info(`[CircuitBreaker] ${e}: open → half-open`),!1):!0;if(n.state===`half-open`){let t=this.halfOpenCalls.get(e)??0;return t>=1?!0:(this.halfOpenCalls.set(e,t+1),!1)}return!1}recordSuccess(e){let n=this.states.get(e);if(n){if(n.state===`half-open`){n.state=`closed`,n.failureCount=0,this.halfOpenCalls.delete(e),t.info(`[CircuitBreaker] ${e}: half-open → closed`),this.emit(`recovered`,e);return}n.failureCount=0}}recordFailure(e){let n=this.states.get(e);if(n||(n={toolName:e,failureCount:0,lastFailureTime:0,state:`closed`},this.states.set(e,n)),n.failureCount++,n.lastFailureTime=Date.now(),n.state===`half-open`){n.state=`open`,this.halfOpenCalls.delete(e),t.warn(`[CircuitBreaker] ${e}: half-open → open (probe failed)`),this.emit(`opened`,e);return}n.state===`closed`&&n.failureCount>=3&&(n.state=`open`,t.warn(`[CircuitBreaker] ${e}: closed → open (${n.failureCount} consecutive failures)`),this.emit(`opened`,e))}getStates(){return Array.from(this.states.values())}reset(e){this.states.delete(e),this.halfOpenCalls.delete(e)}getRecoveryMs(){return tn}};const rn=/"_?offload"|detailId|_filePath/;var an=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}storeInDetailManager(e,n,r){let i=this.detailedData.store(e),a=this.detailedData.cache.get(i)?.size??0;return t.info(`[Offloader] Stored in DetailDataManager (${pe(a)}) → detailId=${i}`),{_offload:{type:`detailId`,detailId:i,size:pe(a)}}}isDetailWrapper(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.detailId==`string`?`data`in t||`summary`in t||`preview`in t:!1}tryParseJson(e){try{let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))return JSON.parse(t)}catch{}return null}offload(e,n){if(n.isError||this.excludeTools.has(e))return n;let r=n.content;if(!Array.isArray(r))return n;let i=!1;for(let t=0;t<r.length;t++){let n=r[t];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)continue;let s=this.tryParseJson(o);if(s!==null&&this.isDetailWrapper(s)){let e=de(s);e!==s&&(r[t]={...a,text:JSON.stringify(e,null,2)},i=!0);continue}if(rn.test(o))continue;if(fe.test(o)){r[t]={...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:pe(o.length),mimeType:o.match(fe)?.[1]??`application/octet-stream`}},null,2)},i=!0;continue}let c=this.tryParseJson(o);if(c!==null){r[t]={...a,text:JSON.stringify(this.storeInDetailManager(c,e,t),null,2)},i=!0;continue}if(o.length>=this.fileThreshold){r[t]={...a,text:JSON.stringify({_offload:{type:`file`,pending:!0,hint:`Large raw string — use get_detailed_data() or await async offload`,size:pe(o.length)}},null,2)},i=!0;continue}}return i&&t.debug(`[Offloader] Offloaded large data from ${e}`),n}async offloadAsync(e,n){if(n.isError||this.excludeTools.has(e))return n;let r=n.content;if(!Array.isArray(r))return n;for(let e=0;e<r.length;e++){let n=r[e];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&&fe.test(n._offload.mimeType?`data:${n._offload.mimeType};base64,`:``)&&t.debug(`[Offloader] Skipping async write for already-placeholdered entry ${e}`)}catch{}}return n}};function on(){let e=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),n=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase(),r=De(process.env.MCP_TOOL_DOMAINS);if(r&&r.length>0){let e=_e(r);return t.info(`Tool registration mode=domains [${r.join(`,`)}], count=${e.length}`),{tools:e,profile:n===`full`||n===`workflow`||n===`search`?n:`search`}}let i;i=n===`full`||n===`workflow`||n===`search`?n:`search`;let a=we(i);return i===`search`?t.info(`Tool registration mode=search bootstrap, transport=${e}, baseCount=${a.length}. Meta-tools remain available for domain activation and call_tool bridging.`):t.info(`Tool registration mode=${i}, transport=${e}, count=${a.length}`),{tools:a,profile:i}}function sn(e){return(typeof e==`object`||typeof e==`function`)&&e!==null&&typeof e.then==`function`}function cn(e){let t=new Set;for(let n of e){let e=O(n.name);e&&t.add(e)}return t}function H(e,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 k(`RUNTIME`,`${r}: circular initialization detected for domain "${n}"`,{details:a});t.info(`Lazy-initializing ${r} for domain "${n}"`),l++;try{let e=i();return sn(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 sn(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:(t,i)=>{if(!e.enabledDomains.has(n))return()=>{throw new k(`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 sn(o)?p(i):u(o,i)}})}const ln=new Set([`http://127.0.0.1`,`http://localhost`,`http://[::1]`]);function un(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 ln.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 dn(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||!Wt(a,o)?(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – invalid token`),!1):!0}const fn=(()=>{let e=parseInt(process.env.MCP_MAX_BODY_BYTES??``,10);return Number.isFinite(e)&&e>0?e:10*1024*1024})();function pn(e,t,n=fn){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 mn=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_WINDOW_MS??``,10);return Number.isFinite(e)&&e>0?e:6e4})(),hn=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_MAX??``,10);return Number.isFinite(e)&&e>0?e:60})(),U=new Map,gn=_,_n=ee;let vn=Date.now();function yn(e){if(e-vn<_n)return;vn=e;let t=e-mn;for(let[e,n]of U)n.timestamps=n.timestamps.filter(e=>e>t),n.timestamps.length===0&&U.delete(e)}function bn(){if(U.size<=gn)return;let e=Math.ceil(gn*.1),t=0;for(let n of U.keys()){if(t>=e)break;U.delete(n),t++}}function xn(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 Sn(e,t,n=!1){if([`0`,`false`].includes((process.env.MCP_RATE_LIMIT_ENABLED??``).toLowerCase()))return!0;let r=n?hn*3:hn,i=Date.now();yn(i),bn();let a=xn(e),o=U.get(a);o||(o={timestamps:[]},U.set(a,o));let s=i-mn;if(o.timestamps=o.timestamps.filter(e=>e>s),o.timestamps.length>=r){let e=Math.ceil(mn/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 Cn(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 wn(e){return typeof e==`string`?`s:${e}`:`n:${String(e)}`}var Tn=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=St(e)||yt(e)?{...e,id:r.originalId}:e,a=t?.relatedRequestId===void 0?t:{...t,relatedRequestId:r.originalId};await r.transport.send(i,a),(St(e)||yt(e))&&this.releaseRequestRoute(n,r);return}}let r=[...this.sessions.values()];if(r.length!==0){if(bt(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=Cn(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 Gt({sessionIdGenerator:()=>Ut()});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(xt(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(wn(n.id),r),{...n,id:r}}if(bt(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(wn(r));if(i)return{...n,params:{...t,requestId:i}}}}return n}resolveRouteKey(e,t){return t?.relatedRequestId===void 0?St(e)||yt(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(wn(t.originalId)),n.size===0&&this.sessionOriginalToInternal.delete(t.sessionId))}dropSession(e){this.sessions.delete(e),this.sessionOriginalToInternal.delete(e);for(let[t,n]of this.requestRoutes)n.sessionId===e&&this.requestRoutes.delete(t);t.info(`[http] MCP session closed: ${e}`)}};async function En(e){let n=new Vt;if(typeof n.send==`function`){let e=n.send.bind(n);n.send=n=>new Promise(r=>{let i=setTimeout(()=>{t.warn(`transport.send() timed out — stdout broken, skipping write`),r()},500);e(n).then(()=>clearTimeout(i)).catch(()=>clearTimeout(i)).finally(r)})}n.onclose=()=>{e.shutdownStarted||(t.info(`stdio transport closed — running cleanup...`),kn(e).catch(e=>t.warn(`cleanup after transport close failed:`,e)))},await e.server.connect(n);let r=!1,i=()=>{r||(r=!0,t.info(`stdin EOF — parent disconnected, shutting down...`),kn(e).catch(e=>t.warn(`stdin EOF cleanup failed:`,e)).finally(()=>process.exit(0)))};process.stdin.on(`end`,i),process.stdin.on(`close`,i),t.success(`MCP stdio server started`)}async function Dn(e){let n=parseInt(process.env.MCP_PORT??`3000`,10),r=process.env.MCP_HOST??`127.0.0.1`,a=new Tn;await e.server.connect(a),e.httpServer=Bt((t,r)=>{let i=new URL(t.url??`/`,`http://localhost:${n}`);if(i.pathname===`/health`&&t.method===`GET`){On(e,r);return}if(i.pathname!==`/mcp`){r.writeHead(404,{"Content-Type":`text/plain`}),r.end(`Not Found – use POST /mcp or GET /health`);return}if(!un(t,r))return;let o=dn(t,r);if(o&&Sn(t,r,o)){if(t.method===`GET`||t.method===`DELETE`){a.handleRequest(t,r);return}if(t.method===`POST`){pn(t,r).then(e=>a.handleRequest(t,r,e)).catch(()=>{});return}r.writeHead(405,{"Content-Type":`text/plain`}),r.end(`Method Not Allowed`)}});let o=e.httpServer;if(!o)throw Error(`HTTP server initialization failed`);o.requestTimeout=i,o.headersTimeout=ne,o.keepAliveTimeout=f,o.on(`connection`,t=>{e.httpSockets.add(t),t.on(`close`,()=>e.httpSockets.delete(t))}),await new Promise((e,i)=>{o.listen(n,r,()=>{t.success(`MCP Streamable HTTP server listening on http://${r}:${n}/mcp`),e()}),o.on(`error`,i)})}function On(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 kn(e){return e.shutdownStarted?e.shutdownPromise??Promise.resolve():(e.shutdownStarted=!0,e.shutdownPromise=(async()=>{let r=typeof e.getDomainInstance==`function`?e.getDomainInstance.bind(e):null;if(r){let e=r(`snapshotScheduler`);if(e)try{await e.flushAll(),e.dispose()}catch(e){t.warn(`snapshot flush on shutdown failed:`,e)}}for(let[,t]of e.domainTtlEntries)clearTimeout(t.timer);e.domainTtlEntries.clear(),e.detailedData.shutdown();let i=typeof e.getDomainInstance==`function`?e.getDomainInstance(`activationController`):e.activationController??void 0;if(i&&typeof i.dispose==`function`)try{i.dispose()}catch(e){t.warn(`activationController cleanup failed:`,e)}if(e.httpServer){let t=e.httpServer,r=new Promise(e=>t.close(()=>e())),i=setTimeout(()=>{for(let t of e.httpSockets)t.destroy()},n);await r,clearTimeout(i),e.httpSockets.clear(),e.httpServer=void 0}let a=[[`consoleMonitor`,e.consoleMonitor,`disable`],[`runtimeInspector`,e.runtimeInspector,`close`],[`debuggerManager`,e.debuggerManager,`close`],[`scriptManager`,e.scriptManager,`close`],[`transformHandlers`,e.transformHandlers,`close`],[`nativeEmulatorHandlers`,e.getDomainInstance?.(`nativeEmulatorHandlers`),`dispose`]];for(let[e,n,r]of a)if(n)try{let e=n[r];typeof e==`function`&&await e.call(n)}catch(n){t.warn(`${e} cleanup failed:`,n)}if(e.consoleMonitor=void 0,e.runtimeInspector=void 0,e.debuggerManager=void 0,e.scriptManager=void 0,e.collector){try{await e.collector.close()}catch(e){t.warn(`collector cleanup failed:`,e)}e.collector=void 0}try{await e.server.close()}catch(e){t.warn(`MCP server close failed:`,e)}try{await Fe.terminateAll()}catch(e){t.warn(`ProcessRegistry cleanup failed:`,e)}t.success(`MCP server closed`)})(),e.shutdownPromise)}const An={debug:0,info:1,warning:2,error:3},jn={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{Dt(e,{recursive:!0});let t=new Date().toISOString().replace(/[:.]/g,`-`);this.filePath=z(e,`jshookmcp-${t}.log`)}catch{}}getFilePath(){return this.filePath}log(e,t,n){!this.enabled||!this.server||An[e]<An[this.minLevel]||(this.server.server.sendLoggingMessage({level:jn[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
+ `;Et(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)}},W=e({handleActivateDomain:()=>G});async function G(e,n){let r=typeof n.domain==`string`?n.domain:``;if(!r)return D(JSON.stringify({success:!1,error:`domain must be a non-empty string`}));let i=new Set(ye());for(let t of e.extensionToolsByName.values())i.add(t.domain);if(!i.has(r))return D(JSON.stringify({success:!1,error:`Unknown domain "${r}". Valid: ${[...i].join(`, `)}`}));await Oe(r);let a=typeof n.ttlMinutes==`number`?n.ttlMinutes:m,o=[..._e([r]),...[...e.extensionToolsByName.values()].filter(e=>e.domain===r).map(e=>e.tool)],s=M(e),c=[];e.enabledDomains.add(r);for(let t of o){if(s.has(t.name))continue;let n=e.extensionToolsByName.get(t.name);if(n)Re(e,n,`activate_domain`);else{let n=e.registerSingleTool(t);e.activatedToolNames.add(t.name),e.activatedRegisteredTools.set(t.name,n)}c.push(t.name)}if(c.length>0){let n=new Set(c.filter(t=>!e.extensionToolsByName.has(t)));if(n.size>0){let t=ke(e.handlerDeps,n);e.router.addHandlers(t)}for(let t of c){let n=e.extensionToolsByName.get(t);n?.handler&&e.router.addHandlers({[t]:n.handler})}Ne(e,r,a,c),A(e)?.setPendingDomainActivation(r,a,c);try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed:`,e)}}return t.info(`activate_domain: domain="${r}", activated ${c.length} tools, ttl=${a}min`),e.mcpLog.info(`jshookmcp`,{event:`domain_activated`,domain:r,toolCount:c.length}),D(JSON.stringify({success:!0,domain:r,activated:c.length,activatedTools:c,totalDomainTools:o.length,ttlMinutes:a>0?a:`no expiry`,hint:c.length>0?`Tools activated. If they do not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke them.`:void 0}))}const Nn=[{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:b}],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:b}],boostDomains:[`memory`],priority:15},{id:`network-intercept-flow`,name:`Network interception workflow`,conditions:[{type:`domain_active`,domain:`network`},{type:`domain_active`,domain:`browser`}],boostDomains:[`instrumentation`],priority:10},{id:`skia-to-v8-correlation`,name:`Skia scene + V8 heap correlation`,conditions:[{type:`domain_active`,domain:`canvas`},{type:`event_count`,event:`v8:heap_captured`,minCount:1,windowMs:h}],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:h}],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:h}],boostDomains:[`cross-domain`],priority:14}];var Pn=class{conditions;constructor(e=[]){this.conditions=[...Nn,...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}},Fn=class{callHistory=[];maxHistory;confidenceThreshold;decayFactor;transitions=new Map;transitions2=new Map;maxSecondOrderKeys;constructor(e={}){this.maxHistory=e.maxHistory??te,this.confidenceThreshold=e.confidenceThreshold??g,this.decayFactor=e.decayFactor??C,this.maxSecondOrderKeys=e.maxSecondOrderKeys??v}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)}},In=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??a,this.manualInactivityMs=r.manualActivatedInactivityMs??u,this.checkIntervalMs=r.checkIntervalMs??s,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 e=Date.now();for(let[n,r]of this.lastActivity.entries()){if(this.baseDomains.has(n))continue;let i=e-r,a=this.autoActivatedDomains.has(n)?this.autoInactivityMs:this.manualInactivityMs;i>=a&&(t.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 Ln=[{eventPattern:`debugger:breakpoint_hit`,targetDomains:[`debugger`],threshold:1,windowMs:E,priority:10},{eventPattern:`browser:navigated`,targetDomains:[`browser`],threshold:1,windowMs:E,priority:10},{eventPattern:`memory:scan_completed`,targetDomains:[`memory`],threshold:1,windowMs:E,priority:10},{eventPattern:`network:intercept_started`,targetDomains:[`network`,`instrumentation`],threshold:1,windowMs:E,priority:9},{eventPattern:`v8:heap_captured`,targetDomains:[`v8-inspector`],threshold:1,windowMs:E,priority:10},{eventPattern:`tls:keylog_started`,targetDomains:[`boringssl-inspector`],threshold:1,windowMs:E,priority:10},{eventPattern:`skia:scene_captured`,targetDomains:[`canvas`],threshold:1,windowMs:E,priority:10},{eventPattern:`frida:attached`,targetDomains:[`binary-instrument`],threshold:1,windowMs:E,priority:10},{eventPattern:`adb:device_connected`,targetDomains:[`adb-bridge`],threshold:1,windowMs:E,priority:10},{eventPattern:`mojo:message_captured`,targetDomains:[`mojo-ipc`],threshold:1,windowMs:E,priority:10},{eventPattern:`syscall:trace_started`,targetDomains:[`syscall-hook`],threshold:1,windowMs:E,priority:10},{eventPattern:`protocol:pattern_detected`,targetDomains:[`protocol-analysis`],threshold:1,windowMs:E,priority:10}];var Rn=class{eventBus;ctx;cooldownMs;boostRules;unsubscribers=[];lastBoostTime=new Map;lastActivity=new Map;eventHistory=[];maxEventHistory;toolCallCount=0;compoundEvalEvery;compoundEngine;predictiveBooster;autoPruner;disposed=!1;constructor(e,n,r={}){this.eventBus=e,this.ctx=n,this.cooldownMs=r.cooldownMs??T,this.maxEventHistory=y,this.compoundEvalEvery=Math.max(1,w);let i=r.boostRules??[];this.boostRules=[...Ln,...i].toSorted((e,t)=>t.priority-e.priority),this.compoundEngine=new Pn,this.predictiveBooster=new Fn;let a=new Set(Ee(n.baseTier));this.autoPruner=new In(e,a,e=>{t.info(`[ActivationController] Auto-pruning domain "${e}"`)}),this.subscribe(),t.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=>O(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(e,n){if(this.disposed)return;let r=Date.now();r-(this.lastBoostTime.get(e)??0)<this.cooldownMs||this.ctx.enabledDomains.has(e)||(this.lastBoostTime.set(e,r),t.info(`[ActivationController] Boosting domain "${e}" — reason: ${n}`),await G(this.ctx,{domain:e,ttlMinutes:m}),await this.eventBus.emit(`activation:domain_boosted`,{domain:e,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(),t.info(`[ActivationController] Disposed`)}};const zn=new Set([`true`,`1`,`yes`,`on`]),Bn=new Set([`false`,`0`,`no`,`off`]);function Vn(e){if(typeof e!=`string`)return e;let t=e.trim().toLowerCase();return zn.has(t)?!0:Bn.has(t)?!1:e}function Hn(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 K(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=>K(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(Hn,n);break}case`boolean`:r=V.preprocess(Vn,V.boolean());break;case`array`:r=e.items&&typeof e.items==`object`?V.array(K(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=K(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 Un(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=K(i&&typeof i==`object`?i:{});r[e]=n.has(e)?t:t.optional()}return r}function Wn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Gn(e){let t=e._meta;return Wn(t)?t:null}function Kn(e,t){let n={...e},r={},i=Gn(e);return i&&Object.assign(r,i),Wn(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 qn(e){switch(e){case`VALIDATION`:return P.InvalidParams;case`NOT_FOUND`:return-32002;case`TIMEOUT`:return P.RequestTimeout;case`CONNECTION`:return P.ConnectionClosed;case`PREREQUISITE`:case`PERMISSION`:return P.InvalidRequest;default:return P.InternalError}}function Jn(e,n){if(n instanceof zt)throw t.error(`Tool validation failed: ${e}`,n),new F(P.InvalidParams,`Validation Error in ${e}: ${n.message}`);if(n instanceof F)throw n;if(n instanceof k){t.error(`Tool execution failed [${n.code}]: ${e} - ${n.message}`);let r=n.details?`\nDetails: ${JSON.stringify(n.details)}`:``;throw new F(qn(n.code),`[${n.code}] ${n.message}${r}`)}throw t.error(`Tool execution failed: ${e}`,n),new F(P.InternalError,`Execution Failed in ${e}: ${n instanceof Error?n.message:String(n)}`)}function q(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]=q(i)}t.properties=e}if(t.items&&typeof t.items==`object`){let{description:e,...n}=t.items;t.items=q(n)}return t.additionalProperties&&typeof t.additionalProperties==`object`&&!Array.isArray(t.additionalProperties)&&(t.additionalProperties=q(t.additionalProperties)),t}function Yn(e,t){let n=t;n.autocompleteHandlers&&e.toolAutocompleteHandlers.set(t.name,n.autocompleteHandlers);let r=d&&t.inputSchema?q(t.inputSchema):t.inputSchema,i=r&&typeof r==`object`?Un(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=Kn(n,r);return await e.executeToolWithTracking(t.name,i)}catch(e){return Jn(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=Kn({},r);return await e.executeToolWithTracking(t.name,n)}catch(e){return Jn(t.name,e)}});if(n.execution){let r=e.server.registeredTools;r&&r[t.name]&&(r[t.name].execution=n.execution)}return o}function Xn(e){let t=e;for(;;){if(L(z(t,`package.json`)))return t;let e=R(t);if(e===t)break;t=e}return B(e,`..`,`..`,`..`,`..`)}const Zn=Xn(Lt(new URL(`.`,import.meta.url))),Qn=[z(Zn,`plugins`)],$n=[z(Zn,`workflows`)];function J(e,t){let n=e?.trim();if(!n)return t;let r=n.split(`,`).map(e=>e.trim()).filter(Boolean);return r.length>0?[...new Set(r)]:t}function Y(e,t=Zn){let n=e.map(e=>At(e)?e:B(t,e));return[...new Set(n)].toSorted((e,t)=>e.localeCompare(t))}function X(e){let t=e.trim().match(/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function er(e,t){let n=X(e),r=X(t);if(!n||!r)return null;let[i,a,o]=n,[s,c,l]=r;return i>s?1:i<s?-1:a>c?1:a<c?-1:o>l?1:o<l?-1:0}function tr(e,t){let n=e.trim();if(!n||n===`*`)return!0;if(n.startsWith(`>=`)){let e=er(t,n.slice(2).trim());return e!==null&&e>=0}if(n.startsWith(`^`)){let e=n.slice(1).trim(),r=X(t),i=X(e);if(!r||!i)return!1;let a=er(t,e);return a!==null&&a>=0&&r[0]===i[0]}if(n.startsWith(`~`)){let e=n.slice(1).trim(),r=X(t),i=X(e);if(!r||!i)return!1;let a=er(t,e);return a!==null&&a>=0&&r[0]===i[0]&&r[1]===i[1]}let r=er(t,n);return r!==null&&r===0}async function nr(e){let t=await Nt(e);return Ht(`sha256`).update(t).digest(`hex`)}function rr(e){return e.trim().toLowerCase().replace(/^0x/,``)}function ir(e){return[`1`,`true`].includes(e.toLowerCase())}function ar(){let e=process.env.MCP_PLUGIN_SIGNATURE_REQUIRED;return e===void 0||e.trim()===``?process.env.NODE_ENV===`production`:ir(e)}function or(){let e=process.env.MCP_PLUGIN_STRICT_LOAD;return e===void 0||e.trim()===``?ar():ir(e)||ar()}function sr(e){let t=e?.trim();return t?new Set(t.split(`,`).map(e=>rr(e)).filter(e=>e.length>0)):new Set}async function cr(e,t){let n=[];return tr(e.compatibleCoreRange,t)||n.push(`Plugin ${e.id} incompatible with core ${t}; requires ${e.compatibleCoreRange}`),{ok:n.length===0,errors:n,warnings:[]}}function lr(e){if(!e||typeof e!=`object`)return!1;let t=e;return!!(typeof t.id==`string`&&typeof t.version==`string`&&Array.isArray(t.tools)&&(t.workflows===void 0||Array.isArray(t.workflows)))}function ur(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.kind===`workflow-contract`&&t.version===1&&typeof t.id==`string`&&typeof t.displayName==`string`&&typeof t.build==`function`}function dr(e){return e.endsWith(`.js`)||e.endsWith(`.mjs`)||e.endsWith(`.cjs`)}function fr(e){return e.endsWith(`.ts`)||e.endsWith(`.mts`)||e.endsWith(`.cts`)}async function pr(e,t){let n=new Set;for(let r of e)try{await hr(r,t,n)}catch{continue}return[...n].toSorted((e,t)=>e.localeCompare(t))}const mr=new Set([`node_modules`,`.git`,`.pnpm`]);async function hr(e,t,n){let r=[e];for(;r.length>0;){let e=r.pop();if(!e)continue;let i=await Pt(e,{withFileTypes:!0});for(let a of i){let i=B(e,a.name);if(a.isDirectory()){mr.has(a.name)||r.push(i);continue}a.isFile()&&t(kt(i))&&n.add(i)}}}function gr(e,t){let n=e.replace(/\\/g,`/`).replace(/\/+/g,`/`).replace(/^\/+|\/+$/g,``).toLowerCase(),r=jt(e,R(t)).replace(/^[/\\]+/,``).replace(/\\/g,`/`).replace(/\/+/g,`/`).replace(/^\/+|\/+$/g,``).toLowerCase();return!r||r===`dist`?`${n}::`:`${n}::${r.endsWith(`/dist`)?r.slice(0,-5):r}`}function _r(e){return e.isJs?0:e.isTs?1:2}function vr(e,t){if(!e||typeof e!=`object`)return!1;let n=e;if(n.version!==1||n.kind!==t||typeof n.slug!=`string`||typeof n.id!=`string`||!n.source||typeof n.source!=`object`)return!1;let r=n.source;return typeof r.type==`string`&&typeof r.repo==`string`&&typeof r.ref==`string`&&typeof r.commit==`string`&&typeof r.subpath==`string`&&typeof r.entry==`string`}async function yr(e,t){let n=[];for(let[r,i]of e.entries()){let e=await pr([i],e=>e===We);for(let a of e){let e;try{e=JSON.parse(await Nt(a,`utf8`))}catch{continue}if(!vr(e,t))continue;let o=e.source.entry.trim();if(!o)continue;let s=B(R(a),o);L(s)&&n.push({file:s,key:gr(i,s),isJs:dr(s),isTs:fr(s),rootIndex:r,priority:0})}}return n}function br(e){let t=new Map;for(let n of e.toSorted((e,t)=>e.file.localeCompare(t.file))){let e=t.get(n.key);if(!e){t.set(n.key,n);continue}let r=e.rootIndex,i=n.rootIndex,a=e.priority,o=n.priority,s=_r(e),c=_r(n);(i<r||i===r&&o<a||i===r&&o===a&&c<s||i===r&&o===a&&c===s&&n.file.localeCompare(e.file)<0)&&t.set(n.key,n)}return[...t.values()].map(e=>e.file).toSorted((e,t)=>e.localeCompare(t))}async function xr(e){let t=await yr(e,`plugin`);for(let[n,r]of e.entries()){let e=await pr([r],e=>e===`manifest.js`||e===`manifest.ts`);for(let i of e)t.push({file:i,key:gr(r,i),isJs:dr(i),isTs:fr(i),rootIndex:n,priority:1})}return br(t)}async function Sr(e){let t=await yr(e,`workflow`);for(let[n,r]of e.entries()){let e=await pr([r],e=>e.endsWith(`.workflow.js`)||e.endsWith(`.workflow.mjs`)||e.endsWith(`.workflow.cjs`)||e.endsWith(`.workflow.ts`)||e.endsWith(`.workflow.mts`)||e.endsWith(`.workflow.cts`)||e===`workflow.js`||e===`workflow.mjs`||e===`workflow.cjs`||e===`workflow.ts`||e===`workflow.mts`||e===`workflow.cts`);for(let i of e)t.push({file:i,key:gr(r,i),isJs:dr(i),isTs:fr(i),rootIndex:n,priority:1})}return br(t)}function Cr(e,t,n){let r=t.split(`.`).filter(Boolean),i=e.config;for(let e of r){if(!i||typeof i!=`object`)return n;i=i[e]}return i??n}function wr(e,n){let r=new URL(Rt(e).href);return r.searchParams.set(`reloadTs`,String(Date.now())),t.debug(`[extensions] Loading fresh ${n} module: ${e}`),r.href}async function Tr(e){let n=0,r=new Set;for(let[n,r]of e.extensionPluginRuntimeById.entries()){try{r.plugin.onDeactivateHandler&&r.state===`activated`&&(await r.plugin.onDeactivateHandler(r.lifecycleContext),r.state=`deactivated`)}catch(e){t.warn(`Plugin onDeactivate failed for "${n}":`,e)}try{r.plugin.onDeactivateHandler&&(r.state=`unloaded`)}catch(e){t.warn(`Plugin onUnload failed for "${n}":`,e)}}for(let i of e.extensionToolsByName.values()){r.add(i.domain);try{Le(e,i,{onRemoveError:e=>{t.warn(`Failed to remove extension tool "${i.name}":`,e)}})}catch(e){t.warn(`Failed to remove extension tool "${i.name}":`,e)}n++}for(let t of r)Pe(e,t);return e.extensionToolsByName.clear(),e.extensionPluginsById.clear(),e.extensionPluginRuntimeById.clear(),e.extensionWorkflowsById.clear(),e.extensionWorkflowRuntimeById.clear(),n}function Er(e,t,n){let r=[`full`],i=[...e.extensionToolsByName.values()].map(t=>({name:t.name,domain:t.domain,source:t.source,profiles:t.profiles&&t.profiles.length>0?[...t.profiles]:r,visibleInCurrentProfile:Ie(e.baseTier,t),active:e.activatedToolNames.has(t.name),activationSource:t.activationSource,activatedAt:t.activatedAt}));return{pluginRoots:t,workflowRoots:n,pluginCount:e.extensionPluginsById.size,workflowCount:e.extensionWorkflowsById.size,toolCount:e.extensionToolsByName.size,activeToolCount:i.filter(e=>e.active).length,currentProfile:e.baseTier,lastReloadAt:e.lastExtensionReloadAt,plugins:[...e.extensionPluginsById.values()],workflows:[...e.extensionWorkflowsById.values()],tools:i}}var Dr=e({ensureWorkflowsLoaded:()=>Br,listExtensions:()=>Or,reloadExtensions:()=>zr});function Or(e){return Er(e,Y(J(process.env.MCP_PLUGIN_ROOTS,Qn)),Y(J(process.env.MCP_WORKFLOW_ROOTS,$n)))}function kr(e){try{let t=Ot(e,`utf-8`),n={};for(let e of t.split(/\r?\n/)){let t=e.trim();if(!t||t.startsWith(`#`))continue;let r=t.indexOf(`:`);if(r<1)continue;let i=t.slice(0,r).trim(),a=t.slice(r+1).trim();i&&(n[i]=a)}return n}catch{return{}}}function Ar(e){return e?.trim()||void 0}function jr(e,t,n){let r=z(e,`meta.yaml`);return L(r)?kr(r):(n.push(`Plugin "${t}" is missing meta.yaml; outward metadata now lives there.`),{})}function Mr(e){return{name:Ar(e.name),description:Ar(e.description),author:Ar(e.author),source_repo:Ar(e.source_repo)}}function Nr(e){let t=e;for(;;){if(L(z(t,`.jshook-install.json`)))return t;let e=R(t);if(e===t)return null;t=e}}function Pr(e){let t=R(e);return Nr(t)||(kt(t).toLowerCase()===`dist`?R(t):t)}let Fr=Promise.resolve();const Ir=new WeakSet,Lr=`[extensions] Loading plugins WITHOUT MCP_PLUGIN_ALLOWED_DIGESTS allowlist. Plugin code will execute on import() before post-load integrity checks. Set MCP_PLUGIN_STRICT_LOAD=true to enforce allowlist requirement.`;async function Rr(e){let t=Fr,n;Fr=new Promise(e=>{n=e}),await t;try{return await e()}finally{n()}}async function zr(e){return Rr(()=>Gr(e))}async function Br(e){e.extensionWorkflowRuntimeById.size>0||Ir.has(e)||await Rr(async()=>{if(e.extensionWorkflowRuntimeById.size>0||Ir.has(e))return;Ir.add(e);let n=[],r=[],i=Y(J(process.env.MCP_PLUGIN_ROOTS,Qn)),a=Y(J(process.env.MCP_WORKFLOW_ROOTS,$n));await Wr(e,i,n,r),await Vr(e,await Sr(a),n,r);for(let e of n)t.warn(`[extensions] ${e}`);for(let e of r)t.error(`[extensions] ${e}`)})}async function Vr(e,t,n,r){for(let i of t)try{let t=await import(wr(i,`workflow`)),r=t.default??t;if(!ur(r)){n.push(`Skip workflow file without valid WorkflowContract: ${i}`);continue}Hr(e,r,i,n)}catch(e){r.push(`Failed to import workflow file ${i}: ${String(e)}`)}}function Hr(e,t,n,r){if(e.extensionWorkflowsById.has(t.id))return r.push(`Skip workflow "${t.id}" from ${n}: duplicate id`),!1;let i={id:t.id,displayName:t.displayName,source:n,description:t.description,tags:t.tags,timeoutMs:t.timeoutMs,defaultMaxConcurrency:t.defaultMaxConcurrency,route:t.route};e.extensionWorkflowsById.set(i.id,i);let a={workflow:t,source:n,route:t.route};return e.extensionWorkflowRuntimeById.set(i.id,a),!0}function Ur(e,t,n,r,i){return{id:e.id,name:t.name??e.id,description:t.description,source:n,author:t.author,sourceRepo:t.source_repo,domains:r.length>0?[`plugin:${e.id}`]:[],workflows:i,tools:r}}async function Wr(e,n,r,i){let a=sr(process.env.MCP_PLUGIN_ALLOWED_DIGESTS);if(or()&&a.size===0){i.push(`MCP_PLUGIN_ALLOWED_DIGESTS is required when MCP_PLUGIN_SIGNATURE_REQUIRED=true or MCP_PLUGIN_STRICT_LOAD=true. The digest allowlist is the only pre-import trust boundary — without it, plugin code executes before integrity verification. No plugins will be loaded.`),t.error(`[extensions] MCP_PLUGIN_ALLOWED_DIGESTS is required when MCP_PLUGIN_SIGNATURE_REQUIRED=true or MCP_PLUGIN_STRICT_LOAD=true. The digest allowlist is the only pre-import trust boundary — without it, plugin code executes before integrity verification. No plugins will be loaded.`);return}a.size===0&&t.warn(Lr);let o=await xr(n),s=e.config?.mcp?.version??`0.0.0`;for(let t of o){let n;try{if(n=rr(await nr(t)),a.size>0&&!a.has(n)){r.push(`Skip plugin file not in MCP_PLUGIN_ALLOWED_DIGESTS allowlist: ${t}`);continue}}catch(e){i.push(`Failed to hash plugin file ${t}: ${String(e)}`);continue}let o;try{let e=await import(wr(t,`plugin`)),n=e.default??e;if(!lr(n)){r.push(`Skip plugin file without valid ExtensionBuilder: ${t}`);continue}o=n}catch(e){i.push(`Failed to import plugin file ${t}: ${String(e)}`);continue}let c=jr(Pr(t),o.id,r);if(e.extensionPluginsById.has(o.id)){r.push(`Skip plugin "${o.id}" from ${t}: duplicate plugin id`);continue}try{let e=await cr(o,s);if(r.push(...e.warnings),!e.ok){i.push(...e.errors);continue}}catch(e){i.push(`Failed to verify plugin ${o.id}: ${String(e)}`);continue}let l=[],u=Array.isArray(o.workflows)?o.workflows:[];for(let n of u){if(!ur(n)){r.push(`Skip invalid workflow contribution from plugin "${o.id}" in ${t}`);continue}Hr(e,n,`${t}#workflow:${n.id}`,r)&&l.push(n.id)}let d=o.tools.map(e=>e.name);e.extensionPluginsById.set(o.id,Ur(o,Mr(c),t,d,l))}}async function Gr(e){let n=[],r=[],i=await Tr(e),a=Y(J(process.env.MCP_PLUGIN_ROOTS,Qn)),o=Y(J(process.env.MCP_WORKFLOW_ROOTS,$n)),s=sr(process.env.MCP_PLUGIN_ALLOWED_DIGESTS),c=0;if(or()&&s.size===0){if(r.push(`MCP_PLUGIN_ALLOWED_DIGESTS is required when MCP_PLUGIN_SIGNATURE_REQUIRED=true or MCP_PLUGIN_STRICT_LOAD=true. The digest allowlist is the only pre-import trust boundary — without it, plugin code executes before integrity verification. No plugins will be loaded.`),t.error(`[extensions] MCP_PLUGIN_ALLOWED_DIGESTS is required when MCP_PLUGIN_SIGNATURE_REQUIRED=true or MCP_PLUGIN_STRICT_LOAD=true. The digest allowlist is the only pre-import trust boundary — without it, plugin code executes before integrity verification. No plugins will be loaded.`),await Vr(e,await Sr(o),n,r),i>0)try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed after extension reload:`,e)}return e.lastExtensionReloadAt=new Date().toISOString(),{...Er(e,a,o),addedTools:0,autoActivatedTools:[],removedTools:i,warnings:n,errors:r}}s.size===0&&t.warn(Lr);let l=new Set(Ce.map(e=>e.name)),u=await xr(a),d=e.config?.mcp?.version??`0.0.0`;for(let i of u){let a;try{if(a=rr(await nr(i)),s.size>0&&!s.has(a)){n.push(`Skip plugin file not in MCP_PLUGIN_ALLOWED_DIGESTS allowlist: ${i}`);continue}}catch(e){r.push(`Failed to hash plugin file ${i}: ${String(e)}`);continue}let o;try{let e=await import(wr(i,`plugin`)),t=e.default??e;if(!lr(t)){n.push(`Skip plugin file without valid ExtensionBuilder: ${i}`);continue}o=t}catch(e){r.push(`Failed to import plugin file ${i}: ${String(e)}`);continue}let u=Pr(i),f=jr(u,o.id,n);if(e.extensionPluginsById.has(o.id)){n.push(`Skip plugin "${o.id}" from ${i}: duplicate plugin id`);continue}try{let e=await cr(o,d);if(n.push(...e.warnings),!e.ok){r.push(...e.errors);continue}}catch(e){r.push(`Failed to verify plugin ${o.id}: ${String(e)}`);continue}let p=new Map,m=new Set,h=`loaded`,g=o.allowedTools.includes(`*`),_={pluginId:o.id,pluginRoot:u,config:e.config,get state(){return h},registerMetric(e){m.add(e)},async invokeTool(t,n={}){if(typeof t!=`string`||t.length===0)throw Error(`invokeTool requires a non-empty tool name`);if(!g&&!o.allowedTools.includes(t))throw Error(`Plugin "${o.id}" is not allowed to invoke "${t}". Declare it in allowTool calls.`);if(!l.has(t))throw Error(`Plugin "${o.id}" can only invoke built-in tools. "${t}" is not built-in.`);if(!e.router.has(t))throw Error(`Tool "${t}" is not available in the current active profile.`);return e.executeToolWithTracking(t,n??{})},hasPermission(e){return!0},getConfig(t,n){return Cr(e,t,n)},setRuntimeData(e,t){p.set(e,t)},getRuntimeData(e){return p.get(e)}},v={plugin:o,lifecycleContext:_,state:h,source:i},y=[],b=[];try{if(o.onLoadHandler&&await o.onLoadHandler(_),h=`loaded`,v.state=h,o.onValidateHandler){let e=await o.onValidateHandler(_);if(!e.valid){n.push(`Plugin ${o.id} validation failed: ${e.errors.join(`; `)}`);continue}h=`validated`,v.state=h}o.onActivateHandler&&(await o.onActivateHandler(_),h=`activated`,v.state=h),e.extensionPluginRuntimeById.set(o.id,v);let r=`plugin:${o.id}`;for(let a of o.tools){if(l.has(a.name)){n.push(`Skip tool "${a.name}" from plugin "${o.id}": collides with built-in tool name`);continue}if(e.extensionToolsByName.has(a.name)){n.push(`Skip duplicate extension tool "${a.name}" from plugin "${o.id}"`);continue}let s={name:a.name,domain:r,source:i,tool:{name:a.name,description:a.description,inputSchema:a.schema},profiles:a.profiles??o.profiles,handler:async e=>{try{return await a.handler(e,_)}catch(e){throw t.error(`[extension:${o.id}] Tool "${a.name}" failed:`,e),e}}};e.extensionToolsByName.set(a.name,s),y.push(a.name),b.push(s),Ie(e.baseTier,s)&&Re(e,s,`reload`)&&c++}}catch(n){for(let n of b.toReversed())try{Le(e,n,{removeDefinition:!0})}catch(e){t.warn(`Failed to roll back extension tool "${n.name}" for plugin "${o.id}":`,e)}e.extensionPluginRuntimeById.delete(o.id);try{o.onDeactivateHandler&&h===`activated`&&(await o.onDeactivateHandler(_),h=`deactivated`,v.state=h)}catch(e){t.warn(`Plugin onDeactivate failed during rollback for ${o.id}:`,e)}r.push(`Plugin lifecycle failed for ${o.id}: ${String(n)}`);continue}let x=[],S=Array.isArray(o.workflows)?o.workflows:[];for(let t of S){if(!ur(t)){n.push(`Skip invalid workflow contribution from plugin "${o.id}" in ${i}`);continue}Hr(e,t,`${i}#workflow:${t.id}`,n)&&x.push(t.id)}let C=Ur(o,Mr(f),i,y,x);e.extensionPluginsById.set(C.id,C)}if(await Vr(e,await Sr(o),n,r),c>0||i>0)try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed after extension reload:`,e)}return e.lastExtensionReloadAt=new Date().toISOString(),{...Er(e,a,o),addedTools:e.extensionToolsByName.size,autoActivatedTools:[...e.extensionToolsByName.values()].filter(e=>e.activationSource===`reload`).map(e=>e.name).toSorted(),removedTools:i,warnings:n,errors:r}}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 Kr(e,t){return`call_tool({ name: "${e}", args: ${JSON.stringify(Z(t))} })`}function qr(e,t){let n=N(e),r=Ye(n,t);return r?{name:n,description:st(n,t),inputSchema:r}:null}async function Jr(e,n,r){let{task:i,context:a={}}=e,o=a.maxRecommendations||5;t.info(`[ToolRouter] Routing request`,{task:i,context:a}),await Br(n);let s=Ze(i),c=M(n),l=Ue(n),u=await $e(n),d=qe(n),f=lt(i,n),p=null,m=await r.search(i,o*2,c,l,Be(n)),h=!f&&!s?et(m.slice(0,10),d):null,g=[];if(h){let e=h.tools.filter(e=>d.has(e)).map((e,t)=>({name:e,domain:Je(e,n),shortDescription:m.find(t=>t.name===e)?.shortDescription??n.extensionToolsByName.get(e)?.tool.description??``,score:h.priority-t*.01,isActive:rt(e,n)})),r=new Set(h.tools),i=m.filter(e=>!r.has(e.name));g=[...e,...i],t.info(`[ToolRouter] Cross-domain workflow detected`,{pattern:h.id,domains:h.domains})}else if(f?.workflow.route.kind===`preset`){let e=ot(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=Qe(f,n);g=[e,...m.filter(t=>t.name!==e.name)]}else if(s){let e=ct(i),t=Ke(s,u,d),r=t.map((t,r)=>({name:t,domain:Je(t,n),shortDescription:m.find(e=>e.name===t)?.shortDescription??n.extensionToolsByName.get(t)?.tool.description??``,score:(e?90:s.priority)-r*.01,isActive:rt(t,n)})),a=new Set(t),o=m.filter(e=>!a.has(e.name));g=[...r,...o]}else if(i&&!Xe(i,s)&&!Ge(i)){let e=it(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=at(_,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?tt(f,n):void 0,x=g.map(e=>{let t=Ye(e.name,n),r=rt(e.name,n),i={name:e.name,domain:e.domain,description:e.shortDescription,inputSchema:t||{type:`object`},score:e.score,isActive:r,callCommand:Kr(e.name,t||{type:`object`})};r||(i.activationCommand=`activate_tools with names: ["${e.name}"]`);let a=nt()[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||!Xe(i,s)||Ge(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:Z(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:Z(r?.inputSchema??Ye(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:{...Z(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:Z(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:Z(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}}var Yr=e({activateToolNames:()=>Q,handleActivateTools:()=>Zr,handleDeactivateTools:()=>Qr});async function Xr(e,n){if(n)try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed:`,e)}}async function Q(e,n){await xe();let r=M(e),i=[],a=[],o=[];for(let t of n){let n=N(t);if(r.has(n)){a.push(n);continue}let s=(await He(e)).get(n);if(!s){o.push(n);continue}let c=e.extensionToolsByName.get(n);if(c)Re(e,c,`activate_tools`);else{let t=e.registerSingleTool(s);e.activatedToolNames.add(n),e.activatedRegisteredTools.set(n,t);let r=O(n);r&&e.enabledDomains.add(r);let i=new Set([n]),a=ke(e.handlerDeps,i);e.router.addHandlers(a)}i.push(n),r.add(n)}return await Xr(e,i.length>0),t.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 Zr(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}=ut({names:n});if(i)return D(JSON.stringify({success:!1,error:i}));let a=await Q(e,r);return D(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 Qr(e,n){let{names:r,error:i}=ut(n);if(i)return D(JSON.stringify({success:!1,error:i}));let a=[],o=[];for(let n of r){let r=N(n);if(!e.activatedToolNames.has(r)){o.push(r);continue}let i=e.activatedRegisteredTools.get(r);if(i&&!e.extensionToolsByName.has(r))try{i.remove()}catch(e){t.warn(`Failed to remove activated tool "${r}":`,e)}let s=e.extensionToolsByName.get(r);s?Le(e,s,{onRemoveError:e=>{t.warn(`Failed to remove activated tool "${r}":`,e)}}):(e.router.removeHandler(r),e.activatedToolNames.delete(r),e.activatedRegisteredTools.delete(r)),a.push(r)}return await Xr(e,a.length>0),t.info(`deactivate_tools: deactivated ${a.length}, not_activated ${o.length}`),D(JSON.stringify({success:!0,deactivated:a,notActivated:o,hint:`Deactivated tools are no longer available. Search again to find alternatives.`}))}async function $r(e,t){let n=t.query,r=t.top_k??10,i=t.auto_activate??!0,a=performance.now(),o=await j(e),s=M(e),c=Ue(e),l=await o.search(n,r,s,c,Be(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&&p){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 Promise.resolve().then(()=>W);for(let t of n)try{await i(e,{domain:t,ttlMinutes:m})}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 Q(e,s)}else if(l.length===0){let t=n.toLowerCase().split(/[\s\-_.,;:|/(){}[\]]+/).filter(e=>e.length>=2),i=[...ye()].filter(e=>t.some(t=>e.includes(t)||t.includes(e.replace(/-/g,``))||e.replace(/-/g,``).includes(t)));if(i.length>0){let{handleActivateDomain:t}=await Promise.resolve().then(()=>W);for(let n of i)try{await t(e,{domain:n,ttlMinutes:m})}catch{}let a=M(e),s=Ue(e),c=await o.search(n,r,a,s,Be(e));c.length>0&&(l=c)}}}let d=i?M(e):s,f=l[0],h=f?qr(f.name,e):null,g=h?Z(h.inputSchema):void 0,_=[];f&&(d.has(f.name)?_.push({step:1,action:`call`,command:f.name,exampleArgs:g,description:`Call ${f.name} directly. Use describe_tool("${f.name}") only if you need the full schema.`}):(_.push({step:1,action:`activate_tools`,command:`activate_tools({ names: ["${f.name}"] })`,description:`Activate ${f.name} before calling.`}),_.push({step:2,action:`call`,command:f.name,exampleArgs:g,description:`Call ${f.name}. Use describe_tool("${f.name}") only if you need the full schema.`})));let v=l.length<3?` Few results — try distilling your query to key concepts (e.g. "hook fetch" instead of "how to intercept fetch requests").`:``,y=l.map(e=>({...e,isActive:d.has(e.name)?!0:e.isActive})),b={query:n,resultCount:l.length,results:y,nextActions:_,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.`+v,autoActivated:i&&l.some(e=>!e.isActive&&d.has(e.name))},x=JSON.stringify(b,null,2),S=o.getSearchQualityTracker().getEnhancementSuggestions(n,l.length,l[0]?.score??0);return S&&S.length>0&&(x+=`\n\n---\n**Search Enhancement Suggestions:**\n${S.map(e=>`- ${e}`).join(`
6
+ `)}`),D(x)}function ei(e){return{...e,recommendations:e.recommendations.map(e=>({...e,callCommand:e.callCommand??Kr(e.name,e.inputSchema)}))}}async function ti(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 D(JSON.stringify({success:!1,error:`task must be a non-empty string`}));let a=await j(e),o=i?.autoActivate===!0,s=ei(await Jr({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 G(e,{domain:t,ttlMinutes:m}),c=!0}catch{}let l=t.filter(e=>!r.has(e.domain??``)).map(e=>e.name);(l.length>0||o.length>0)&&(await Q(e,[...new Set([...l,...o])])).activated.length>0&&(c=!0),c&&(s=ei(await Jr({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 D(JSON.stringify(s,null,2))}async function ni(e,t){let n=t.name;if(!n||typeof n!=`string`)return D(JSON.stringify({success:!1,error:`name must be a non-empty string`}));let r=qr(n,e);return D(r?JSON.stringify({success:!0,tool:r},null,2):JSON.stringify({success:!1,error:`Tool not found: ${n}`}))}function ri(e){return e.issues.map(e=>`${e.path.length>0?e.path.join(`.`):`(root)`}: ${e.message}`).join(`; `)}function ii(e,t,n){if(!t||typeof t!=`object`)return n;let r=Un(t);if(Object.keys(r).length===0)return n;try{return V.object(r).parse(n)}catch(t){throw t instanceof zt?Error(`Invalid arguments for "${e}": ${ri(t)}`,{cause:t}):t}}function ai(e,t){return{wasAutoActivated:e,activatedTools:t}}function oi(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 si(e,n){let r=typeof n.name==`string`?n.name:``,i=ai(!1,[]);if(!r)return D(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(!e.router.has(a)){let t=!1;try{let{ensureAllDomainsLoaded:n}=await import(`./ToolCatalog-DgmQXdsm.mjs`).then(e=>e.g);await n();let{getToolByName:r}=await import(`./MCPServer.search.helpers-Cs1JpKbu.mjs`).then(e=>e.t);if((await r(e)).get(a)){let{activateToolNames:n}=await Promise.resolve().then(()=>Yr),{getToolDomain:r}=await import(`./ToolCatalog-DgmQXdsm.mjs`).then(e=>e.t),i=r(a);if(i&&!e.enabledDomains.has(i)){let{handleActivateDomain:t}=await Promise.resolve().then(()=>W);try{await t(e,{domain:i,ttlMinutes:(await import(`./constants-DMv3svps.mjs`).then(e=>e.ya)).ACTIVATION_TTL_MINUTES})}catch{}}e.router.has(a)||await n(e,[a]),c.wasAutoActivated=!0,c.activatedTools=[a],t=!0}}catch{}if(!t)return D(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 t=ii(a,Ye(a,e),o),n=await e.executeToolWithTracking(a,t);try{(await j(e)).recordToolCallFeedback(a,``)}catch{}return oi(n,c)}catch(e){let n=e instanceof Error?e.message:String(e);return t.error(`call_tool: execution of "${a}" failed`,e),D(JSON.stringify({success:!1,error:`Tool "${a}" failed: ${n}`,...c}))}}async function ci(e,t){await xe();let n=A(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 li(e){return[{name:`search_tools`,description:Ve(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:$r},{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:ti},{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:ni},{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:Zr},{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:Qr},{name:`activate_domain`,description:`Activate all tools in a domain at once. Domains: ${[...ve()].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:G},{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:si},{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:ci}]}function ui(e){let n=li(e);for(let r of n){let n=Un(r.inputSchema);e.server.registerTool(r.name,{description:r.description,inputSchema:n},async(n,i)=>{try{let t=Kn(n,i),a=await r.handler(e,t);return A(e)?.recordToolCall(r.name,t),a}catch(e){return t.error(`${r.name} failed`,e),he(e)}}),e.metaToolsByName.set(r.name,{name:r.name,description:r.description.split(`
7
+ `)[0]||r.description,inputSchema:r.inputSchema})}}function $(e,t){return{contents:[{uri:e,mimeType:`application/json`,text:JSON.stringify(t,null,2)}]}}function di(e,t,n){return{contents:[{uri:e,mimeType:n,text:t}]}}function fi(e){return e.getDomainInstance(`evidenceGraph`)}function pi(e){return e.getDomainInstance(`instrumentationSessionManager`)}function mi(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=fi(e);return $(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=fi(e);return di(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=pi(e);return $(t.toString(),n?n.listSessionSnapshots():[])});let t=new _t(`jshook://instrumentation/session/{sessionId}`,{list:async()=>({resources:(pi(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=pi(e)?.getSessionSnapshot(r);return $(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+=Se().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 $(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=>$(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 $(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=A(e)?.getCoverageSummary(e)??{called:{},calledCount:0,uncataloguedCalls:[],uncataloguedCallCount:0,totalKnownTools:0,uncalled:[],uncalledCount:0};return $(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=>$(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 $(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 $(t.toString(),{tabs:r,currentTabId:i.pageId,totalTabs:r.length})});let n=new _t(`jshook://domains/{domainName}`,{list:async()=>{let t=new Map;try{let e=Se();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=ye()}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=Se().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 $(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 hi(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
+ ${dt()}
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:`${ft(`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 gi=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(e,n){let r=this.sources.find(t=>t.filePath===e||t.source===n);if(r){(r.filePath!==e||r.source!==n)&&t.warn(`skipping conflicting snapshot registration for ${e}`);return}let i={source:n,filePath:e};this.sources.push(i),this.started&&this.restoreOne(i).catch(e=>t.warn(`snapshot restore failed for ${i.filePath}:`,e))}async start(){this.started||this.disposed||(this.started=!0,await this.restoreAll(),!(this.disposed||this.periodicTimer)&&(this.periodicTimer=setInterval(()=>{this.scheduleFlush().catch(e=>t.warn(`periodic snapshot failed:`,e))},this.periodicMs)))}notifyDirty(){this.disposed||(this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.scheduleFlush().catch(e=>t.warn(`debounce snapshot failed:`,e))},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(e){try{let n=await Nt(e.filePath,`utf-8`),r=JSON.parse(n);e.source.restoreSnapshot(r),t.info(`restored snapshot from ${e.filePath}`)}catch{}}async scheduleFlush(){await this.writeDirtySources()}async writeDirtySources(){for(let e of this.sources)if(e.source.isPersistDirty())try{await this.writeSnapshot(e)}catch(n){t.warn(`snapshot write failed for ${e.filePath}:`,n)}}async writeSnapshot(e){await Mt(R(e.filePath),{recursive:!0});let t=JSON.stringify(e.source.exportSnapshot()),n=e.filePath+`.tmp`;await It(n,t,`utf-8`),await Ft(n,e.filePath),e.source.markPersisted()}};function _i(){let e=process.env.JSHOOK_STATE_DIR;return typeof e==`string`&&e.trim().length>0?B(Tt(),e):B(Tt(),`.jshookmcp`,`state`)}function vi(){return process.env.E2E_COLLECT_PERFORMANCE===`1`}function yi(){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 bi(e,t,n,r,i){let a=new Date().toISOString(),o=process.cpuUsage(r),s=yi();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 xi(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 Si=class{config;server;cache;tokenBudget;unifiedCache;detailedData;eventBus;samplingBridge;elicitationBridge;selectedTools;enabledDomains;router;contextGuard;circuitBreaker=new nn;circuitBrokenTools=new Set;searchQualityTracker=new ze;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(e){this.config=e,this.cache=new Kt(e.cache),this.tokenBudget=new re,this.unifiedCache=new ie,this.detailedData=new me,this.eventBus=pt(),this.tokenBudget.setExternalCleanup(()=>this.detailedData.clear());let{tools:n,profile:i}=on();this.selectedTools=n,this.baseTier=i,this.enabledDomains=this.resolveEnabledDomains(this.selectedTools);let a=[],o=Te(),s=new Map(o.map(e=>[e.domain,e])),c=ge();if(!Array.isArray(c))t.warn(`[MCPServer] getLoaderMetadata returned non-array, skipping domain proxy setup`);else for(let e of c){let t=s.get(e.domain);if(t){if(a.push([e.depKey,H(this,e.domain,`${e.domain}:${e.depKey}`,()=>t.ensure(this))]),t.secondaryDepKeys)for(let n of t.secondaryDepKeys)a.some(([e])=>e===n)||a.push([n,H(this,e.domain,`${e.domain}:${n}`,async()=>(await t.ensure(this),this[n]))])}else{a.push([e.depKey,H(this,e.domain,`${e.domain}:${e.depKey}`,async()=>{let t=await Oe(e.domain);if(!t)throw Error(`Failed to load domain ${e.domain}`);return t.ensure(this)})]);for(let t of e.secondaryDepKeys)a.some(([e])=>e===t)||a.push([t,H(this,e.domain,`${e.domain}:${t}`,async()=>{let n=await Oe(e.domain);if(!n)throw Error(`Failed to load domain ${e.domain}`);return await n.ensure(this),this[t]})])}}this.handlerDeps=Object.fromEntries(a);let u=new Set(this.selectedTools.map(e=>e.name));this.router=new Yt(ke(this.handlerDeps,u)),this.contextGuard=new en(()=>{let e=this.handlerDeps.browserHandlers;return e&&typeof e.getTabRegistry==`function`?e.getTabRegistry():null}),this.largeDataOffloader=new an(this.detailedData),this.server=new gt({name:e.mcp.name,version:e.mcp.version},{capabilities:{tools:{listChanged:!0},logging:{},completions:{},prompts:{listChanged:!0}}}),this.mcpLog.attach(this.server,r),new Set([`debug`,`info`,`warning`,`error`]).has(S)&&this.mcpLog.setLevel(S),l&&this.mcpLog.enableFileLogging(l),this.circuitBreaker.onChange((e,t)=>{e===`opened`?this.circuitBreakerDeactivate(t):this.circuitBreakerReactivate(t)}),this.server.server.oninitialized=()=>{this.clientInitialized=!0},t.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 qt(this.server),this.elicitationBridge=new Jt(this.server),this.setDomainInstance(`activationController`,new Rn(this.eventBus,this));let d=_i(),f=new gi,p=new je,m=new ht(()=>this.collector);this.setDomainInstance(`snapshotScheduler`,f),this.setDomainInstance(`snapshotStateDir`,d),this.setDomainInstance(`serverRuntimeState`,p),this.setDomainInstance(`browserSessionCoordinator`,m),f.register(`${d}/runtime-state.json`,p),f.start().then(async()=>{await Ae(this)}).catch(e=>t.warn(`snapshot scheduler start failed:`,e)),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(vt,async e=>{try{let t=e.params.ref.name;if(!t)return{completion:{values:[],total:0,hasMore:!1}};let n=e.params.argument.name,r=e.params.argument.value,i=this.toolAutocompleteHandlers.get(t);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(e){return t.error(`Autocomplete failed:`,e),{completion:{values:[],total:0,hasMore:!1}}}}),this.registerTools()}resolveEnabledDomains(e){return cn(e)}registerSingleTool(e){return Yn(this,e)}async reloadExtensions(){return zr(this)}listExtensions(){return Or(this)}async registerCaches(){if(!this.cacheAdaptersRegistered&&this.collector){if(this.cacheRegistrationPromise){await this.cacheRegistrationPromise;return}this.cacheRegistrationPromise=(async()=>{try{let{createCacheAdapters:e}=await import(`./CacheAdapters-BlDrQg8f.mjs`),n=this.collector.getCache(),r=this.collector.getCompressor(),i=e(this.detailedData,n,r);for(let e of i)this.unifiedCache.registerCache(e);this.cacheAdaptersRegistered=!0,t.info(`Registered ${i.length} cache adapters.`)}catch(e){t.error(`Cache registration failed:`,e)}finally{this.cacheRegistrationPromise=void 0}})();try{await this.cacheRegistrationPromise}catch(e){t.error(`Cache registration failed:`,e)}}}async executeToolWithTracking(e,n){let r,i=3e4,a=vi(),o=a?new Date().toISOString():null,s=a?performance.now():0,c=a?process.cpuUsage():null,l=a?yi():null;try{if(this.setDomainInstance(`activeToolArgs`,n),r=setTimeout(()=>{try{let r=JSON.stringify(n).slice(0,500);t.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${e}'. Args preview: ${r}...`)}catch{t.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${e}'.`)}},i),r.unref(),this.circuitBreaker.shouldBlock(e)){let t=this.circuitBreaker.getState(e),n=t?Math.ceil((this.circuitBreaker.getRecoveryMs()-(Date.now()-t.lastFailureTime))/1e3):30;return r&&clearTimeout(r),{content:[{type:`text`,text:JSON.stringify({success:!1,error:`Circuit breaker open for tool "${e}"`,reason:`Tool has failed consecutively ${t?.failureCount??0} times`,retryAfterSeconds:n})}],isError:!0}}let u;try{let t=O(e)===`browser`?this.getDomainInstance(`browserSessionCoordinator`):null,r=n._meta?.sessionId??null;u=t?await t.runExclusive(r,async()=>(await t.restoreSessionContext(r),await this.router.execute(e,n))):await this.router.execute(e,n)}finally{r&&clearTimeout(r)}if(this.largeDataOffloader.offload(e,u),O(e)===`browser`){let t=this.getDomainInstance(`browserSessionCoordinator`),r=n._meta?.sessionId??null;t?.noteToolResult(r,e,mt(u))}this.contextGuard.recordCall(e),this.getDomainInstance(`serverRuntimeState`)?.recordToolCall(e,n);let d=this.contextGuard.enrichResponse(e,u);a&&o&&c&&l&&(d=xi(d,bi(o,s,i,c,l)));try{this.tokenBudget.recordToolCall(e,n,d)}catch(e){t.warn(`Token tracking failed, continuing without tracking this call:`,e)}this.activatedToolNames.has(e)&&Me(this,e);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(e):this.circuitBreaker.recordFailure(e),this.eventBus.emit(`tool:called`,{toolName:e,domain:O(e)??null,timestamp:new Date().toISOString(),success:f,args:n,result:{success:f,isError:d.isError===!0}}),this.searchQualityTracker.associateLastSearch(e),this.mcpLog.info(`jshookmcp`,{event:`tool_called`,toolName:e,domain:O(e)??null,success:f}),this.getDomainInstance(`evidenceGraph`)?.commit(),d}catch(r){this.circuitBreaker.recordFailure(e);let i=he(r);try{this.tokenBudget.recordToolCall(e,n,i)}catch(e){t.warn(`Token tracking failed on error path:`,e)}throw this.getDomainInstance(`evidenceGraph`)?.commit(),r}finally{this.setDomainInstance(`activeToolArgs`,void 0)}}enterDegradedMode(e){this.degradedMode||(this.degradedMode=!0,t.warn(`Entering degraded mode: ${e}`),this.tokenBudget.setTrackingEnabled(!1),t.setLevel(`warn`))}circuitBreakerDeactivate(e){if(this.circuitBrokenTools.has(e))return;let n=this.activatedRegisteredTools.get(e);if(n)try{n.remove()}catch(n){t.warn(`CircuitBreaker: failed to remove tool "${e}":`,n);return}else if(!this.activatedToolNames.has(e))return;this.router.removeHandler(e),this.activatedToolNames.delete(e),this.activatedRegisteredTools.delete(e),this.circuitBrokenTools.add(e);let r=this.extensionToolsByName.get(e);r&&(r.registeredTool=void 0),this.clientSupportsListChanged&&this.server.sendToolListChanged(),t.info(`CircuitBreaker: deactivated "${e}" from tool list`)}circuitBreakerReactivate(e){if(!this.circuitBrokenTools.has(e))return;this.circuitBrokenTools.delete(e);let n=this.selectedTools.find(t=>t.name===e);if(!n){t.warn(`CircuitBreaker: cannot reactivate "${e}" — no tool definition found`);return}let r=this.registerSingleTool(n);this.activatedRegisteredTools.set(e,r),this.activatedToolNames.add(e),this.clientSupportsListChanged&&this.server.sendToolListChanged(),t.info(`CircuitBreaker: reactivated "${e}" in tool list`)}async start(){await this.registerCaches(),await this.cache.init(),(process.env.MCP_TRANSPORT??`stdio`).toLowerCase()===`http`?await Dn(this):await En(this)}async close(){return kn(this)}registerTools(){for(let e of this.selectedTools)this.registerSingleTool(e);ui(this),mi(this),hi(this);let e=this.metaToolsByName.size;t.info(`Registered ${this.selectedTools.length} base tools + ${e} 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.binarySecretsHandlers.apkPackerHandlers.adbBridgeHandlers.mojoIpcHandlers.syscallHookHandlers.protocolAnalysisHandlers.extensionRegistryHandlers.crossDomainHandlers.debuggerHandlers.advancedHandlers.aiHookHandlers.hookPresetHandlers.deobfuscator.advancedDeobfuscator.astOptimizer.obfuscationDetector.analyzer.cryptoDetector.hookManager.coreAnalysisHandlers.coreMaintenanceHandlers.extensionManagementHandlers.sandboxHandlers.processHandlers.workflowHandlers.macroHandlers.wasmHandlers.streamingHandlers.encodingHandlers.antidebugHandlers.graphqlHandlers.platformHandlers.sourcemapHandlers.transformHandlers.coordinationHandlers.sharedStateBoardHandlers.evidenceHandlers.instrumentationHandlers`.split(`.`))e===`domainInstanceMap`||e===`getDomainInstance`||e===`setDomainInstance`||Object.defineProperty(Si.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 Ci(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 wi(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:Ci(le(t))}:i?{handled:!0,exitCode:0,output:`${le(t)}\n`}:{handled:!1,exitCode:0}}const Ti=new Set([`ERR_WORKER_OUT_OF_MEMORY`,`ERR_MEMORY_ALLOCATION_FAILED`]),Ei=new Set([`ENOMEM`,`ENOSPC`,`EMFILE`,`ENFILE`]);function Di(e){if(!(e instanceof Error))return!1;let t=`code`in e&&typeof e.code==`string`?e.code:void 0;return!!(t&&Ti.has(t)||t&&Ei.has(t)||e instanceof RangeError&&e.message.includes(`allocation`))}function Oi(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 ki(){try{let e=wi(process.argv.slice(2),import.meta.url);if(e.handled){e.output&&process.stdout.write(e.output),process.exit(e.exitCode);return}let n=ue();t.debug(`Configuration loaded:`,n);let r=ce(n);if(!r.valid){t.error(`Configuration validation failed:`),r.errors.forEach(e=>t.error(` - ${e}`)),process.exit(1);return}let i=ae();if(i.cleanupOnStart&&i.enabled){let e=await se();e.removedFiles>0&&t.info(`[artifacts] Startup cleanup removed ${e.removedFiles} files (${e.removedBytes} bytes)`)}t.info(`Creating MCP server instance...`);let a=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),s=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase();await be(s===`full`||s===`workflow`||s===`search`?s:`search`);let l=new Si(n),u=oe(),d=Math.max(1e3,c),f=Math.max(1,o),p={windowStart:Date.now(),errorCount:0,degradedMode:!1},m=(e,n)=>{Di(n)&&(t.error(`[${e}] FATAL unrecoverable error — forcing exit: ${Oi(n)}`),process.exit(1));let r=Date.now();r-p.windowStart>d&&(p.windowStart=r,p.errorCount=0),p.errorCount+=1,t.error(`[${e}] Runtime failure captured (${p.errorCount}/${f}): ${Oi(n)}`),!p.degradedMode&&p.errorCount>=f&&(p.degradedMode=!0,l.enterDegradedMode(`Runtime failures reached ${p.errorCount} within ${d}ms`),t.warn(`Degraded mode enabled. Server keeps running without forced process exit.`))};process.on(`SIGINT`,async()=>{t.info(`Received SIGINT, shutting down...`);let e=setTimeout(()=>{t.error(`Graceful shutdown timed out, forcing exit`),process.exit(1)},x);e.unref();try{u?.(),await l.close()}catch(e){t.error(`Error during SIGINT shutdown:`,e)}clearTimeout(e),process.exit(0)}),process.on(`SIGTERM`,async()=>{t.info(`Received SIGTERM, shutting down...`);let e=setTimeout(()=>{t.error(`Graceful shutdown timed out, forcing exit`),process.exit(1)},x);e.unref();try{u?.(),await l.close()}catch(e){t.error(`Error during SIGTERM shutdown:`,e)}clearTimeout(e),process.exit(0)}),process.on(`uncaughtException`,e=>{m(`uncaughtException`,e)}),process.on(`unhandledRejection`,e=>{m(`unhandledRejection`,e)}),t.info(`Starting MCP server...`),await l.start(),t.info(`MCP server started successfully`),a===`stdio`&&(process.stdin.resume(),process.stdin.on(`end`,async()=>{t.info(`stdin EOF — parent disconnected, shutting down...`);let e=setTimeout(()=>{t.error(`Graceful shutdown timed out after stdin EOF, forcing exit`),process.exit(1)},x);e.unref();try{u?.(),await l.close()}catch(e){t.error(`Error during stdin EOF shutdown:`,e)}clearTimeout(e),process.exit(0)})),t.info(`MCP server is running. Press Ctrl+C to stop.`)}catch(e){t.error(`Failed to start MCP server:`),e instanceof Error&&(t.error(`Error name:`,e.name),t.error(`Error message:`,e.message),t.error(`Error stack:`,e.stack)),t.error(`Full error object:`,JSON.stringify(e,null,2));let n=e?.code,r=e instanceof Error?e.message:String(e);n===`EADDRINUSE`&&t.error(`Port is already in use. Please check if another instance is running.`),r?.includes(`credentials`)&&t.error(`Authentication failed. Please check your API keys or credentials.`),process.exit(1)}}ki();export{ki as main,W as n,Dr as t};
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./logger-CCikqqvj.mjs";import{bn as t,xn as n}from"./constants-DMv3svps.mjs";import{i as r}from"./outputPaths-D2ddHrOJ.mjs";import"./definitions-EGmqr85H.mjs";import{n as i}from"./WorkflowEngine-CldHG5b4.mjs";import{extname as a,resolve as o}from"node:path";import{readFile as s,readdir as c}from"node:fs/promises";function l(e){return`kind`in e?e:e.build()}function u(e,t){return t?.(e),e}function d(e,t){let n={},r,i,a,o;return n.input=e=>(r=e,n),n.inputFrom=e=>(i=e,n),n.retry=e=>(a=e,n),n.timeout=e=>(o=e,n),n.build=()=>({kind:`tool`,id:e,toolName:t,input:r,inputFrom:i,retry:a,timeoutMs:o}),n}function f(e,t){return t?typeof t==`function`?(t(e),e):(t.input&&e.input(t.input),t.inputFrom&&e.inputFrom(t.inputFrom),t.retry&&e.retry(t.retry),t.timeoutMs!==void 0&&e.timeout(t.timeoutMs),e):e}function p(e,t){return e.step=n=>(t.push(n),e),e.tool=(n,r,i)=>(t.push(f(d(n,r),i)),e),e.sequence=(n,r)=>(t.push(u(m(n),r)),e),e.parallel=(n,r)=>(t.push(u(h(n),r)),e),e.branch=(n,r,i)=>(t.push(u(g(n,r),i)),e),e.fallback=(n,r)=>(t.push(u(_(n),r)),e),e}function m(e){let t=[],n=p({},t);return n.build=()=>({kind:`sequence`,id:e,steps:t.map(l)}),n}function h(e){let t=[],n=p({},t),r=4,i=!1;return n.maxConcurrency=e=>(r=e,n),n.failFast=e=>(i=e,n),n.build=()=>({kind:`parallel`,id:e,steps:t.map(l),maxConcurrency:r,failFast:i}),n}function g(e,t){let n={},r,i,a;return n.predicateFn=e=>(r=e,n),n.whenTrue=e=>(i=e,n),n.whenFalse=e=>(a=e,n),n.build=()=>{if(!i)throw Error(`BranchNode '${e}' requires a whenTrue step`);return{kind:`branch`,id:e,predicateId:t,predicateFn:r,whenTrue:l(i),whenFalse:a?l(a):void 0}},n}function _(e){let t={},n,r;return t.primary=e=>(n=e,t),t.fallback=e=>(r=e,t),t.build=()=>{if(!n)throw Error(`FallbackNode '${e}' requires a primary step`);if(!r)throw Error(`FallbackNode '${e}' requires a fallback step`);return{kind:`fallback`,id:e,primary:l(n),fallback:l(r)}},t}function v(e,t){let n={},r,i,a,o,s,c,l,u,d;return n.description=e=>(r=e,n),n.tags=e=>(i=e,n),n.timeoutMs=e=>(a=e,n),n.defaultMaxConcurrency=e=>(o=e,n),n.route=e=>(s=e,n),n.buildGraph=e=>(c=e,n),n.onStart=e=>(l=e,n),n.onFinish=e=>(u=e,n),n.onError=e=>(d=e,n),n.build=()=>{if(!c)throw Error(`Workflow '${e}' needs a buildGraph() function.`);return{kind:`workflow-contract`,version:1,id:e,displayName:t,description:r,tags:i,timeoutMs:a,defaultMaxConcurrency:o,route:s,build:c,onStart:l,onFinish:u,onError:d}},n}function y(e,t,n){let r=v(e,t);return n(r),r.build()}function b(e,t,n){return f(d(e,t),n).build()}function x(e,t){return u(m(e),t).build()}var S=class{ctx;constructor(e){this.ctx=e}buildWorkflowFromDefinition(e){return y(e.id,e.displayName,t=>t.description(e.description).tags(e.tags).timeoutMs(e.timeoutMs??n).buildGraph(()=>x(`${e.id}-root`,t=>{for(let n of e.steps)t.step(b(n.id,n.toolName,e=>{e.input(n.input??{}).timeout(n.timeoutMs??0),n.inputFrom&&e.inputFrom(n.inputFrom)}))})).onStart(t=>{t.emitSpan(`macro.start`,{macroId:e.id,totalSteps:e.steps.length})}).onError((t,n)=>{t.emitSpan(`macro.error`,{macroId:e.id,error:n.message})}))}async execute(e,t){let n=this.buildWorkflowFromDefinition(e),r=Date.now();try{let r=await i(this.ctx,n,{nodeInputOverrides:t}),a=this.buildProgress(e,r.spans,r.stepResults);return{macroId:e.id,displayName:e.displayName,ok:!0,durationMs:r.durationMs,stepsCompleted:e.steps.length,totalSteps:e.steps.length,stepResults:r.stepResults,progress:a}}catch(t){let n=Date.now()-r,i=t instanceof Error?t.message:String(t),a=this.buildPartialProgress(e,i);return{macroId:e.id,displayName:e.displayName,ok:!1,durationMs:n,stepsCompleted:a.filter(e=>e.status===`complete`).length,totalSteps:e.steps.length,stepResults:{},progress:a,error:i}}}formatProgressReport(e){let t=[];t.push(`**Macro:** ${e.displayName} (\`${e.macroId}\`)`),t.push(``);for(let n of e.progress){let e=n.durationMs===void 0?``:` (${n.durationMs}ms)`,r=n.error?`: ${n.error}`:``,i=n.status===`complete`?`✓`:n.status===`failed`?`✗`:`○`;t.push(`[stage ${n.step}/${n.totalSteps}] ${i} ${n.stepName} — ${n.status}${e}${r}`)}return t.push(``),e.ok?t.push(`✓ Macro complete (${e.stepsCompleted}/${e.totalSteps} steps, ${e.durationMs}ms)`):t.push(`✗ Macro failed at step ${e.stepsCompleted+1}/${e.totalSteps}: ${e.error??`unknown error`}`),t.join(`
2
+ `)}buildProgress(e,t,n){return e.steps.map((r,i)=>{let a=t.find(e=>e.name===`workflow.node.start`&&e.attrs?.nodeId===r.id),o=t.find(e=>e.name===`workflow.node.finish`&&e.attrs?.nodeId===r.id),s;a&&o&&(s=new Date(o.at).getTime()-new Date(a.at).getTime());let c=r.id in n;return{step:i+1,totalSteps:e.steps.length,stepName:r.id,status:c?`complete`:`skipped`,durationMs:s}})}buildPartialProgress(e,t){return e.steps.map((n,r)=>({step:r+1,totalSteps:e.steps.length,stepName:n.id,status:`failed`,error:r===0?t:void 0}))}};async function C(t){let n;try{n=await c(t)}catch{return[]}let r=n.filter(e=>a(e)===`.json`),i=[];for(let n of r){let r=o(t,n);try{let t=JSON.parse(await s(r,`utf-8`));w(t)?(i.push(T(t)),e.info(`[macros] Loaded user macro "${t.id}" from ${n}`)):e.warn(`[macros] Skipping ${n}: invalid macro schema`)}catch(t){e.warn(`[macros] Skipping ${n}: ${t instanceof Error?t.message:String(t)}`)}}return i}function w(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.id!=`string`||!t.id||typeof t.displayName!=`string`||!t.displayName||!Array.isArray(t.steps)||t.steps.length===0)return!1;for(let e of t.steps){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.id!=`string`||!t.id||typeof t.toolName!=`string`||!t.toolName)return!1}return!0}function T(e){return{id:e.id,displayName:e.displayName,description:e.description??``,tags:e.tags??[],timeoutMs:e.timeoutMs,steps:e.steps.map(e=>({id:e.id,toolName:e.toolName,input:e.input,inputFrom:e.inputFrom,timeoutMs:e.timeoutMs,optional:e.optional}))}}const E={loadFromDirectory:C,validate:w},D=[{id:`deobfuscate_ast_flow`,displayName:`Deobfuscate AST Flow`,description:`Chain: deobfuscate → optional webcrack unpack → semantic analysis`,tags:[`analysis`,`deobfuscation`,`ast`],timeoutMs:t,steps:[{id:`deobfuscate`,toolName:`deobfuscate`,input:{}},{id:`advanced_deobfuscate`,toolName:`webcrack_unpack`,input:{unpack:!0,unminify:!0},inputFrom:{code:`deobfuscate.code`},optional:!0},{id:`analyze_deobfuscated`,toolName:`understand_code`,inputFrom:{code:`deobfuscate.code`}}]},{id:`unpacker_flow`,displayName:`Unpacker Flow`,description:`Detect packer type → extract inner code → optional deep unpack → normalize output`,tags:[`analysis`,`unpacking`,`deobfuscation`],timeoutMs:9e4,steps:[{id:`detect_and_unpack`,toolName:`deobfuscate`,input:{unpack:!0}},{id:`deep_deobfuscate`,toolName:`webcrack_unpack`,input:{unpack:!0,unminify:!0},inputFrom:{code:`detect_and_unpack.code`},optional:!0},{id:`normalize_output`,toolName:`ast_transform_apply`,input:{transforms:[`dead_code_remove`,`rename_vars`]},inputFrom:{code:`detect_and_unpack.code`}}]}];var O=class{runner;macros=null;constructor(e){this.runner=new S(e)}async ensureMacrosLoaded(){if(this.macros)return this.macros;this.macros=new Map;for(let e of D)this.macros.set(e.id,e);try{let e=await E.loadFromDirectory(o(r(),`macros`));for(let t of e)this.macros.set(t.id,t)}catch{}return this.macros}async handleRunMacro(e){let t=e.macroId,n=e.inputOverrides;if(!t||typeof t!=`string`)return{content:[{type:`text`,text:JSON.stringify({ok:!1,error:`macroId parameter is required`})}]};let r=await this.ensureMacrosLoaded(),i=r.get(t);if(!i)return{content:[{type:`text`,text:JSON.stringify({ok:!1,error:`Macro "${t}" not found`,available:Array.from(r.keys())})}]};let a=await this.runner.execute(i,n);return{content:[{type:`text`,text:this.runner.formatProgressReport(a)}]}}async handleListMacros(){let e=await this.ensureMacrosLoaded(),t=Array.from(e.values()).map(e=>({id:e.id,displayName:e.displayName,description:e.description,tags:e.tags,stepCount:e.steps.length}));return{content:[{type:`text`,text:JSON.stringify({macros:t,count:t.length})}]}}};export{O as MacroToolHandlers};