@jshookmcp/jshook 0.3.2 → 0.3.4

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 (357) hide show
  1. package/README.md +19 -4
  2. package/README.zh.md +19 -4
  3. package/dist/AntiCheatDetector-B-mz4DK_.mjs +1 -0
  4. package/dist/{BrowserSessionCoordinator-BJ-HOxo0.mjs → BrowserSessionCoordinator-Cdic8FsH.mjs} +1 -1
  5. package/dist/CodeAnalyzerDataFlow-a-NkwcaG.mjs +2 -0
  6. package/dist/CodeInjector-B099WO6x.mjs +1 -0
  7. package/dist/ConsoleMonitor-BZRqrBH-.mjs +306 -0
  8. package/dist/CpuEngine-BC8jayy9.mjs +1 -0
  9. package/dist/DartAotExecutor-B7WVTKsd.mjs +1 -0
  10. package/dist/DartAotLoader-BxdhW-K2.mjs +2 -0
  11. package/dist/DarwinAPI-DzojdfjF.mjs +1 -0
  12. package/dist/DetailedDataManager-Dgh402Gp.mjs +5 -0
  13. package/dist/ExecutionSandbox-QbWQmzuC.mjs +45 -0
  14. package/dist/ExtensionManager.tools-D3h818Xs.mjs +1 -0
  15. package/dist/FingerprintManager-D9Zlr6be.mjs +1 -0
  16. package/dist/HardwareBreakpoint-C_lJ22bj.mjs +1 -0
  17. package/dist/HeapAnalyzer-bJbLvzp6.mjs +1 -0
  18. package/dist/HookPatternScanner-yx4vJ9sd.mjs +1 -0
  19. package/dist/InstrumentationSession-Cv1wikLA.mjs +1 -0
  20. package/dist/IntegrityScanner-BB7sw-SA.mjs +1 -0
  21. package/dist/JScramblerDeobfuscator-NVR5VatT.mjs +1 -0
  22. package/dist/MCPServer.activation.ttl-C2wOCMLV.mjs +1 -0
  23. package/dist/MCPServer.search.helpers-DlassAew.mjs +2 -0
  24. package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
  25. package/dist/MemoryController-CCsGuGJS.mjs +2 -0
  26. package/dist/{MemoryScanSession-DG_F-PjE.mjs → MemoryScanSession-BZ2A9Ph1.mjs} +1 -1
  27. package/dist/MemoryScanner-DAxsq7Sx.mjs +1 -0
  28. package/dist/NativeMemoryManager.impl-BIJzXMqH.mjs +1 -0
  29. package/dist/{NativeMemoryManager.utils-BHy1P_jM.mjs → NativeMemoryManager.utils-CMoul2an.mjs} +1 -1
  30. package/dist/PEAnalyzer-CB_kaTis.mjs +1 -0
  31. package/dist/PackerDeobfuscator-BpwGjxDL.mjs +7 -0
  32. package/dist/PointerChainEngine-B6SYv6ZM.mjs +1 -0
  33. package/dist/ProcessRegistry-C5W1Tkn9.mjs +1 -0
  34. package/dist/{handlers-mPFiNPe8.mjs → QuickJSSandbox-CIde-jzG.mjs} +2 -5
  35. package/dist/{ResponseBuilder-BfWP-uaT.mjs → ResponseBuilder-BLicSCjn.mjs} +1 -1
  36. package/dist/ReverseEvidenceGraph-DJzk0GQz.mjs +2 -0
  37. package/dist/ServerRuntimeState-DGXNv8Ji.mjs +1 -0
  38. package/dist/Speedhack-MGoeq1ZS.mjs +1 -0
  39. package/dist/StructureAnalyzer-CCTWAXR3.mjs +2 -0
  40. package/dist/ToolHandlerMap-C40EmuLT.mjs +1 -0
  41. package/dist/{ToolProbe-C7ZU2x7M.mjs → ToolProbe-B02GC3ZY.mjs} +1 -1
  42. package/dist/ToolRegistry-CzqQxFqf.mjs +1 -0
  43. package/dist/ToolRouter.policy-Bgb3S8jc.mjs +4 -0
  44. package/dist/TraceRecorder-BfeCTQUj.mjs +407 -0
  45. package/dist/VMDeobfuscator-BHtkV850.mjs +1 -0
  46. package/dist/Win32API-G7QPyckq.mjs +1 -0
  47. package/dist/{Win32Debug-CYrIQBvr.mjs → Win32Debug-6yzmtv5b.mjs} +1 -1
  48. package/dist/allocation-track-CiI-CnaI.mjs +1 -0
  49. package/dist/analysis-CojUzwX-.mjs +27 -0
  50. package/dist/antidebug-CgU84TE1.mjs +1 -0
  51. package/dist/apk-DrPBsOq8.mjs +1 -0
  52. package/dist/artifactRetention-Bk6fW2uF.mjs +1 -0
  53. package/dist/artifacts-Bx9GLx4J.mjs +1 -0
  54. package/dist/ast-bridge-BlOrmVAv.mjs +1 -0
  55. package/dist/ast-utils-B9E5k_v1.mjs +1 -0
  56. package/dist/{betterSqlite3-Brtq-SIQ.mjs → betterSqlite3-Bdo_ifuJ.mjs} +1 -1
  57. package/dist/binary-instrument-DiE1BP0x.mjs +12 -0
  58. package/dist/boringssl-inspector-C6M3sOga.mjs +2 -0
  59. package/dist/browser-QDUu5ML9.mjs +29 -0
  60. package/dist/{handlers-yo_xYzT8.mjs → canvas-g5kmLdY-.mjs} +1098 -24
  61. package/dist/{capabilities-CyXuKUl1.mjs → capabilities-DwzyxL2w.mjs} +1 -1
  62. package/dist/cdp-session-Dy4OwMOP.mjs +1 -0
  63. package/dist/collector-Cld4i-E4.mjs +1 -0
  64. package/dist/config-5ODJ3Aj0.mjs +3 -0
  65. package/dist/constants-nvsLpSri.mjs +1 -0
  66. package/dist/coordination-C6y2gM9O.mjs +98 -0
  67. package/dist/coverage-and-block--cWjjEe5.mjs +1 -0
  68. package/dist/dart-inspector-D4IKxZ6u.mjs +0 -0
  69. package/dist/debugger-C2SpiXoO.mjs +1 -0
  70. package/dist/definitions-0mtilYzG.mjs +1 -0
  71. package/dist/definitions-9csunmeX.mjs +1 -0
  72. package/dist/definitions-B11MudW_.mjs +1 -0
  73. package/dist/definitions-BKpRDjcI.mjs +1 -0
  74. package/dist/definitions-BXE3H4re.mjs +1 -0
  75. package/dist/definitions-BlPHe5DX.mjs +1 -0
  76. package/dist/definitions-Bob4XMxI.mjs +27 -0
  77. package/dist/definitions-BpIQN2nm.mjs +1 -0
  78. package/dist/definitions-BvolWeSu.mjs +1 -0
  79. package/dist/definitions-C-6j3Ejl.mjs +1 -0
  80. package/dist/definitions-C-AdFfFu.mjs +1 -0
  81. package/dist/definitions-CArdw_9T.mjs +1 -0
  82. package/dist/definitions-CCvIcRrT.mjs +1 -0
  83. package/dist/definitions-CJPE5PIl.mjs +1 -0
  84. package/dist/definitions-CbqeW06u.mjs +1 -0
  85. package/dist/definitions-Cexmkypg.mjs +1 -0
  86. package/dist/definitions-D1dxl8qt.mjs +1 -0
  87. package/dist/definitions-D3uT-ZbU.mjs +1 -0
  88. package/dist/definitions-DtOY5iUc.mjs +1 -0
  89. package/dist/{definitions-DxFNRQNK2.mjs → definitions-DvrYdDCJ2.mjs} +1 -1
  90. package/dist/{definitions-Cenu6mxo.mjs → definitions-aeRd5DAR.mjs} +1 -1
  91. package/dist/definitions-ihxOqOC4.mjs +1 -0
  92. package/dist/deopt-trace-qnAcC931.mjs +17 -0
  93. package/dist/disasm-DoxSucGp.mjs +1 -0
  94. package/dist/dumpsys-parser-Du-5ruEe.mjs +2 -0
  95. package/dist/encoding-UMtwgy4M.mjs +2 -0
  96. package/dist/ensure-browser-core-BP70x0TB.mjs +285 -0
  97. package/dist/factory-BeND77hf.mjs +2 -0
  98. package/dist/graphql-CF7QKJME.mjs +68 -0
  99. package/dist/grpc-raw-Dp7ps2sv.mjs +1 -0
  100. package/dist/handlers--qCl9vNv.mjs +1 -0
  101. package/dist/handlers-BHIu1LqA.mjs +1 -0
  102. package/dist/{antidebug-7L3ygj_9.mjs → handlers-BQ4K8Jbr.mjs} +2 -2
  103. package/dist/handlers-BxQv-wtf.mjs +8 -0
  104. package/dist/handlers-ByYG27-5.mjs +1 -0
  105. package/dist/handlers-C0I9-BtX.mjs +5 -0
  106. package/dist/handlers-CL0Iokmw.mjs +1 -0
  107. package/dist/handlers-CNbhIdSK.mjs +4 -0
  108. package/dist/handlers-CnTTSJFs.mjs +109 -0
  109. package/dist/handlers-CoDx6akJ2.mjs +49 -0
  110. package/dist/{handlers-0yKLRIfo.mjs → handlers-DASJI0Pn.mjs} +1 -1
  111. package/dist/handlers-DRKMaA-_.mjs +74 -0
  112. package/dist/handlers-Dalu0olz.mjs +2 -0
  113. package/dist/handlers-KY0g31ny.mjs +9 -0
  114. package/dist/handlers-oGo60aVv.mjs +1 -0
  115. package/dist/handlers.impl-BTXLw6Qc.mjs +1 -0
  116. package/dist/heap-sampling-BqdiU-5j.mjs +1 -0
  117. package/dist/{hooks-D4XLfgtV.mjs → hooks-COK3t5rT.mjs} +52 -33
  118. package/dist/index.mjs +11 -11
  119. package/dist/logger-BGCcd-jJ.mjs +1 -0
  120. package/dist/macro-nUYUjKNZ.mjs +2 -0
  121. package/dist/maintenance-CfnE7ZKU.mjs +4 -0
  122. package/dist/manifest-7EOTUc0D.mjs +1 -0
  123. package/dist/manifest-B5ujuQmf.mjs +1 -0
  124. package/dist/manifest-BErXl3zn.mjs +1 -0
  125. package/dist/manifest-BKA-mD3J.mjs +1 -0
  126. package/dist/manifest-BUXj23bX.mjs +1 -0
  127. package/dist/manifest-BfXt9cau.mjs +1 -0
  128. package/dist/manifest-Bx-tpURK.mjs +1 -0
  129. package/dist/manifest-C0owVAdq.mjs +1 -0
  130. package/dist/manifest-C5XqYc9o.mjs +1 -0
  131. package/dist/manifest-CVKzLjsA.mjs +1 -0
  132. package/dist/manifest-CaeFjdhj.mjs +1 -0
  133. package/dist/manifest-CegBgip0.mjs +1 -0
  134. package/dist/manifest-CoJHqlgS.mjs +1 -0
  135. package/dist/manifest-D0dbtDqd.mjs +1 -0
  136. package/dist/manifest-D5Gr8ujd.mjs +12 -0
  137. package/dist/manifest-D82z-5og.mjs +1 -0
  138. package/dist/manifest-DA2afIwh.mjs +1 -0
  139. package/dist/manifest-DAbiFP5o.mjs +1 -0
  140. package/dist/manifest-DEY0s1O72.mjs +1 -0
  141. package/dist/manifest-DTOqNqiA.mjs +1 -0
  142. package/dist/manifest-DZ6ELNgX.mjs +1 -0
  143. package/dist/manifest-DjHkjddT.mjs +1 -0
  144. package/dist/manifest-DocA_itf2.mjs +1 -0
  145. package/dist/manifest-Dpnhvfq0.mjs +1 -0
  146. package/dist/manifest-DucPMG_a.mjs +1 -0
  147. package/dist/manifest-Dw5yYEac.mjs +1 -0
  148. package/dist/manifest-Ic_Cg66S.mjs +1 -0
  149. package/dist/manifest-JHaG6GMN.mjs +1 -0
  150. package/dist/manifest-QdkIzmYM.mjs +1 -0
  151. package/dist/manifest-YZqaCe25.mjs +1 -0
  152. package/dist/manifest-f0lUeXwq.mjs +1 -0
  153. package/dist/manifest-h-Ebisf8.mjs +1 -0
  154. package/dist/manifest-oOfTymBS.mjs +1 -0
  155. package/dist/manifest-qXqrO6KC.mjs +2 -0
  156. package/dist/mapsParser-DrJoeC0c.mjs +1 -0
  157. package/dist/modules-CC_ADmwi.mjs +333 -0
  158. package/dist/mojo-ipc-kVztXYw-.mjs +140 -0
  159. package/dist/native-D9ouskXO.mjs +961 -0
  160. package/dist/native-bridge-Dzd7hYoq.mjs +1 -0
  161. package/dist/network-C5Y-S87J.mjs +7 -0
  162. package/dist/one-gadget-CiWFE17F.mjs +1 -0
  163. package/dist/outputPaths-CHtELDyi.mjs +1 -0
  164. package/dist/parse-args-B6dwWc9k.mjs +1 -0
  165. package/dist/platform-BIXgJaM3.mjs +94 -0
  166. package/dist/process-aDIfLC0v.mjs +6 -0
  167. package/dist/proxy-DsHsQ1I4.mjs +2 -0
  168. package/dist/registry-7h8jJ9y9.mjs +1 -0
  169. package/dist/{registry-DH4sc1dt.mjs → registry-DJDnkQW2.mjs} +1 -1
  170. package/dist/response-R8ghbZSb.mjs +1 -0
  171. package/dist/retry-policy-DtYv0kDi.mjs +1 -0
  172. package/dist/reverseEngineeringConfig-BhZLOa3C.mjs +1 -0
  173. package/dist/safeOutput-Dt4mfjXA.mjs +1 -0
  174. package/dist/search-defaults-BBRJNAzC.mjs +1 -0
  175. package/dist/server/plugin-api.mjs +1 -1
  176. package/dist/server/search/EmbeddingWorker.d.mts +1 -0
  177. package/dist/server/search/EmbeddingWorker.mjs +1 -0
  178. package/dist/shared-BKtWZDGN.mjs +1 -0
  179. package/dist/sourcemap-2VIeVeKw.mjs +3 -0
  180. package/dist/streaming-DkpE3GGU.mjs +15 -0
  181. package/dist/syscall-DGZoYM_U.mjs +1 -0
  182. package/dist/transform-BJqsBC_-.mjs +105 -0
  183. package/dist/turbofan-graph-CbGHNVtl.mjs +1 -0
  184. package/dist/turbofan-inspect--NdCuYXi.mjs +23 -0
  185. package/dist/types-CWSvzmIh.mjs +1 -0
  186. package/dist/v8-inspector-CTJo08-K.mjs +297 -0
  187. package/dist/wasm-DX4Qm2Vs.mjs +235 -0
  188. package/dist/weakrefs-inspect-CnhaF-rN.mjs +57 -0
  189. package/dist/webgpu-D4-DxbxZ.mjs +6 -0
  190. package/dist/workflow-DHktRNF2.mjs +108 -0
  191. package/package.json +33 -27
  192. package/dist/AntiCheatDetector-B6d4Qe9D.mjs +0 -1
  193. package/dist/CodeInjector-Cll_7bLJ.mjs +0 -1
  194. package/dist/ConsoleMonitor-CxDJV15E.mjs +0 -306
  195. package/dist/DOMInspector-C19J4zeq.mjs +0 -95
  196. package/dist/DarwinAPI-ZfQdpLNI.mjs +0 -1
  197. package/dist/DetailedDataManager-DmQ1LT-W.mjs +0 -1
  198. package/dist/ExtensionManager-BD724zkO.mjs +0 -1
  199. package/dist/ExtensionManager.tools-oVMJgPcN.mjs +0 -1
  200. package/dist/FingerprintManager-DT0EAUEo.mjs +0 -1
  201. package/dist/HardwareBreakpoint-BUfPdp0f.mjs +0 -1
  202. package/dist/HeapAnalyzer-B_aqY8oj.mjs +0 -1
  203. package/dist/InstrumentationSession-D_G1ZPyd.mjs +0 -1
  204. package/dist/MCPServer.search.handlers.domain-BbS-6LnX.mjs +0 -1
  205. package/dist/MemoryController-X1XNSn1n.mjs +0 -2
  206. package/dist/MemoryScanner-g1_L1ub5.mjs +0 -1
  207. package/dist/NativeMemoryManager.impl-DniBe2wf.mjs +0 -1
  208. package/dist/NetworkMonitor-B_-au6aV.mjs +0 -185
  209. package/dist/PEAnalyzer-yWQaGrcx.mjs +0 -1
  210. package/dist/PageController-Dfsm1_o7.mjs +0 -1
  211. package/dist/PointerChainEngine-BhCUkmxY.mjs +0 -1
  212. package/dist/PrerequisiteError-BjCQA-gK.mjs +0 -1
  213. package/dist/ProcessRegistry-C-bN48oR.mjs +0 -1
  214. package/dist/ReverseEvidenceGraph-BhSYYdiI.mjs +0 -2
  215. package/dist/ScriptManager-LWGPTdvD.mjs +0 -7
  216. package/dist/ServerRuntimeState-D2bWHqEE.mjs +0 -1
  217. package/dist/Speedhack-yseDPSZ9.mjs +0 -1
  218. package/dist/StructureAnalyzer-C5lpuZkg.mjs +0 -2
  219. package/dist/ToolCatalog-CYdD9F5f.mjs +0 -1
  220. package/dist/ToolRegistry-C5oB8KP8.mjs +0 -1
  221. package/dist/ToolRouter.policy-CfhJczkt.mjs +0 -4
  222. package/dist/TraceRecorder-BiJWBXHX.mjs +0 -272
  223. package/dist/VersionDetector-CHT36Az0.mjs +0 -9
  224. package/dist/Win32API-eUCF57l_.mjs +0 -1
  225. package/dist/WorkflowEngine-D876meOO.mjs +0 -1
  226. package/dist/analysis-D4swdMvq.mjs +0 -6
  227. package/dist/apk-packer-BqXcInnX.mjs +0 -1
  228. package/dist/artifactRetention-BCPQASm7.mjs +0 -1
  229. package/dist/artifacts-CkodUM4j.mjs +0 -1
  230. package/dist/binary-instrument-DU7V6TUM.mjs +0 -7
  231. package/dist/binary-secrets-PdMVoyt0.mjs +0 -1
  232. package/dist/boringssl-inspector-BBaJwwkU.mjs +0 -2
  233. package/dist/browser-Qqco2rOT.mjs +0 -11
  234. package/dist/collector-Bpl6qy2L.mjs +0 -1
  235. package/dist/constants-BYj8Xek8.mjs +0 -1
  236. package/dist/coordination-CWXW1o8K.mjs +0 -1
  237. package/dist/dart-inspector-7AkPeZ_Q.mjs +0 -0
  238. package/dist/debugger-DyALjYMk.mjs +0 -1
  239. package/dist/definitions-BWxBke3r.mjs +0 -1
  240. package/dist/definitions-BYwATKc-.mjs +0 -1
  241. package/dist/definitions-B_83XfNQ.mjs +0 -1
  242. package/dist/definitions-Bf3H1EwV.mjs +0 -1
  243. package/dist/definitions-BftdXgXI.mjs +0 -1
  244. package/dist/definitions-Bio5XJYy.mjs +0 -1
  245. package/dist/definitions-C3qNgSn1.mjs +0 -1
  246. package/dist/definitions-CB6vmOer.mjs +0 -1
  247. package/dist/definitions-CMZRSy3k.mjs +0 -1
  248. package/dist/definitions-CQd7yCQH.mjs +0 -1
  249. package/dist/definitions-CT8ln6GQ.mjs +0 -1
  250. package/dist/definitions-D4g-MS10.mjs +0 -1
  251. package/dist/definitions-D5wl_8HN.mjs +0 -1
  252. package/dist/definitions-DAQm1Xar.mjs +0 -1
  253. package/dist/definitions-DP1vgxEY.mjs +0 -1
  254. package/dist/definitions-Ibci7e_L.mjs +0 -1
  255. package/dist/definitions-OeLvmlQy.mjs +0 -1
  256. package/dist/definitions-RZYGD_Ey.mjs +0 -1
  257. package/dist/definitions-Tls8c0A0.mjs +0 -1
  258. package/dist/definitions-bybDvnG0.mjs +0 -26
  259. package/dist/definitions-l7TjdE6V.mjs +0 -1
  260. package/dist/encoding-ycOaz8Vr.mjs +0 -2
  261. package/dist/ensure-browser-core-DxWC-NTp.mjs +0 -1
  262. package/dist/factory-CKr4fAE1.mjs +0 -1
  263. package/dist/flat-target-session-DvcQX7J5.mjs +0 -1
  264. package/dist/graphql-B2TiPEow.mjs +0 -62
  265. package/dist/handlers-8zN_vBIz.mjs +0 -1
  266. package/dist/handlers-B62K4FTc.mjs +0 -1
  267. package/dist/handlers-BpDlVVVU.mjs +0 -1
  268. package/dist/handlers-CMJK7m1c.mjs +0 -31
  269. package/dist/handlers-D2ZOul9p.mjs +0 -54
  270. package/dist/handlers-D5E40ssn.mjs +0 -5
  271. package/dist/handlers-DGbdQAgD.mjs +0 -4
  272. package/dist/handlers-DHO3rjsW.mjs +0 -1
  273. package/dist/handlers-FJ80VzUI.mjs +0 -2
  274. package/dist/handlers-VHWrxbM_.mjs +0 -1
  275. package/dist/handlers-l8QIKqBj.mjs +0 -2
  276. package/dist/handlers.impl-D9Hh8Bgl.mjs +0 -1
  277. package/dist/jadx-search-B_Yse0Zh.mjs +0 -5
  278. package/dist/logger-sBC6IdRT.mjs +0 -1
  279. package/dist/maintenance-BUpIukhg.mjs +0 -1
  280. package/dist/manifest-0Jpt_AQa.mjs +0 -1
  281. package/dist/manifest-B3fZbSWR.mjs +0 -1
  282. package/dist/manifest-B7NB2rh2.mjs +0 -1
  283. package/dist/manifest-BDi4nbH1.mjs +0 -1
  284. package/dist/manifest-BLDfkE7n.mjs +0 -1
  285. package/dist/manifest-BcXbB4gf.mjs +0 -1
  286. package/dist/manifest-Bdnc_vrc.mjs +0 -1
  287. package/dist/manifest-BuYKgCnp.mjs +0 -1
  288. package/dist/manifest-CBfNnGPV.mjs +0 -1
  289. package/dist/manifest-CPS1Xv69.mjs +0 -1
  290. package/dist/manifest-CQH9FhwI.mjs +0 -1
  291. package/dist/manifest-CRryuZF4.mjs +0 -1
  292. package/dist/manifest-CctIumog.mjs +0 -1
  293. package/dist/manifest-CvTe5ZGV2.mjs +0 -1
  294. package/dist/manifest-D-5GH0DV.mjs +0 -1
  295. package/dist/manifest-D3Ssf3IC.mjs +0 -1
  296. package/dist/manifest-D5ck3NvC.mjs +0 -1
  297. package/dist/manifest-D9jUUJAu.mjs +0 -1
  298. package/dist/manifest-DCx6w2XV.mjs +0 -1
  299. package/dist/manifest-DG19q-Ld.mjs +0 -1
  300. package/dist/manifest-DLMlD0Zc.mjs +0 -1
  301. package/dist/manifest-DYpn8w_h.mjs +0 -1
  302. package/dist/manifest-DYzWI8Xs.mjs +0 -1
  303. package/dist/manifest-D_obs5F4.mjs +0 -1
  304. package/dist/manifest-DujQqEQR.mjs +0 -2
  305. package/dist/manifest-DwL2ik8P.mjs +0 -1
  306. package/dist/manifest-ItF5P8A12.mjs +0 -1
  307. package/dist/manifest-KZphqIyX.mjs +0 -1
  308. package/dist/manifest-LG42zPLY2.mjs +0 -1
  309. package/dist/manifest-LLdI5m4T.mjs +0 -1
  310. package/dist/manifest-QYbQXJn0.mjs +0 -1
  311. package/dist/manifest-RcpX_MyZ.mjs +0 -123
  312. package/dist/manifest-YgVd8Sgz.mjs +0 -1
  313. package/dist/manifest-Zy7Odg5J.mjs +0 -1
  314. package/dist/manifest-ff1H7Pdp.mjs +0 -1
  315. package/dist/manifest-iuhF6pTL2.mjs +0 -1
  316. package/dist/manifest-nXHmtMSp2.mjs +0 -1
  317. package/dist/manifest-xWfu6iLo.mjs +0 -1
  318. package/dist/manifest-yC16OhL2.mjs +0 -1
  319. package/dist/manifest-ztWJoXy4.mjs +0 -1
  320. package/dist/matchesWildcardPattern-BAG6LvX5.mjs +0 -1
  321. package/dist/modules-BPBcSaM-.mjs +0 -333
  322. package/dist/mojo-ipc-BhwsdVUW.mjs +0 -9
  323. package/dist/native-j8l473zn.mjs +0 -961
  324. package/dist/network-T0VRwNPd.mjs +0 -7
  325. package/dist/outputPaths-B4Ic4RZh.mjs +0 -2
  326. package/dist/parse-args-Bw413PlW.mjs +0 -1
  327. package/dist/platform-CzaQtISh.mjs +0 -93
  328. package/dist/playwright-cdp-fallback-DqFdx9-s.mjs +0 -1
  329. package/dist/process-CWhsCWrf.mjs +0 -2
  330. package/dist/proxy-DZFlDsG3.mjs +0 -2
  331. package/dist/renderer-pid-9tJnZ_9N.mjs +0 -1
  332. package/dist/response-C7rKQst4.mjs +0 -1
  333. package/dist/search-defaults-lYBVn_3L.mjs +0 -1
  334. package/dist/shared-state-board-BSjXLUV1.mjs +0 -1
  335. package/dist/sourcemap-Dh3Ai_ur.mjs +0 -1
  336. package/dist/streaming-BcJ0B6ao.mjs +0 -1
  337. package/dist/transform-DOxzeWPB.mjs +0 -103
  338. package/dist/types-D9EiE5o9.mjs +0 -1
  339. package/dist/wasm-CZ_HTfKR.mjs +0 -174
  340. package/dist/webcrack-C1iYG_EX.mjs +0 -46
  341. package/dist/workflow-BdwQmARn.mjs +0 -101
  342. /package/dist/{CacheAdapters-CsNtQIR8.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
  343. /package/dist/{EventBus-DL8iLA09.mjs → EventBus-Cm-t-B65.mjs} +0 -0
  344. /package/dist/{EvidenceGraphBridge-BtbwXsLC.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
  345. /package/dist/{HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
  346. /package/dist/{RingBuffer-Dm54ELKT.mjs → RingBuffer-B6RTHmij.mjs} +0 -0
  347. /package/dist/{StealthVerifier-BmcxfwSF.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
  348. /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
  349. /package/dist/{authorization-schema-BOFwSXUN.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
  350. /package/dist/{bind-helpers-m2U8glkF.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
  351. /package/dist/{concurrency-DCr8WQ2M.mjs → concurrency-Dehnw4JC.mjs} +0 -0
  352. /package/dist/{evidence-graph-bridge-CV_UdYqj.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
  353. /package/dist/{formatAddress-vLA_hOJt.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
  354. /package/dist/{chunk-C_pMuVsO.mjs → rolldown-runtime-88NL7fhV.mjs} +0 -0
  355. /package/dist/{ssrf-policy-CsIJGkpd.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
  356. /package/dist/{tool-builder-qif8M9-K.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
  357. /package/dist/{types-Fz69RzbZ.mjs → types-BzPBzmVB.mjs} +0 -0
package/dist/index.mjs CHANGED
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
- import{t as e}from"./logger-sBC6IdRT.mjs";import{Bn as t,Bt as n,Cn as r,D as i,Dt as a,Et as o,Gt as s,Ht as c,O as l,Rr as u,Rt as d,Sn as f,Ut as p,Vn as m,Vt as h,Wt as g,a as _,bn as v,d as ee,i as y,l as b,n as x,r as S,t as C,u as w,xn as te,zt as ne}from"./constants-BYj8Xek8.mjs";import{a as re,i as ie,n as ae,r as oe,t as se}from"./artifactRetention-BCPQASm7.mjs";import{t as ce}from"./DetailedDataManager-DmQ1LT-W.mjs";import{r as T,t as le}from"./response-C7rKQst4.mjs";import{a as ue,c as de,d as fe,f as pe,h as me,i as he,l as ge,m as _e,n as ve,o as ye,p as E,r as D,u as be}from"./ToolCatalog-CYdD9F5f.mjs";import{t as O}from"./ToolError-DWU_z7gp.mjs";import{a as xe,c as Se,i as k,l as Ce,n as A,o as j,r as we,s as Te,u as Ee}from"./MCPServer.search.handlers.domain-BbS-6LnX.mjs";import{n as M,r as De,t as Oe}from"./ServerRuntimeState-D2bWHqEE.mjs";import{a as ke,r as Ae,t as je}from"./ExtensionManager.tools-oVMJgPcN.mjs";import{t as Me}from"./ProcessRegistry-C-bN48oR.mjs";import{i as Ne,n as Pe,r as Fe}from"./ExtensionManager-BD724zkO.mjs";import{_ as Ie,a as Le,b as Re,c as ze,d as Be,f as N,g as Ve,h as He,i as Ue,l as We,m as P,n as Ge,o as Ke,p as F,r as qe,s as Je,t as Ye,u as Xe,v as Ze,x as Qe,y as $e}from"./ToolRouter.policy-CfhJczkt.mjs";import{i as et,r as tt}from"./HookGeneratorBuilders.core.generators.storage-DzD6dIJd.mjs";import{n as nt}from"./EventBus-DL8iLA09.mjs";import{n as rt,t as it}from"./BrowserSessionCoordinator-BJ-HOxo0.mjs";import{d as at,l as ot}from"./outputPaths-B4Ic4RZh.mjs";import{McpServer as st,ResourceTemplate as ct}from"@modelcontextprotocol/sdk/server/mcp.js";import{CompleteRequestSchema as lt,ErrorCode as I,McpError as L,isJSONRPCErrorResponse as R,isJSONRPCNotification as ut,isJSONRPCRequest as dt,isJSONRPCResultResponse as z}from"@modelcontextprotocol/sdk/types.js";import{promises as B}from"fs";import{join as ft}from"path";import{createHash as pt}from"crypto";import{homedir as mt}from"node:os";import{createServer as ht}from"node:http";import{StdioServerTransport as gt}from"@modelcontextprotocol/sdk/server/stdio.js";import{randomUUID as _t,timingSafeEqual as vt}from"node:crypto";import{StreamableHTTPServerTransport as yt}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{appendFileSync as bt,mkdirSync as xt,readFileSync as St}from"node:fs";import{dirname as Ct,join as wt,resolve as Tt}from"node:path";import{ZodError as Et,z as V}from"zod";import{fileURLToPath as Dt}from"node:url";import{mkdir as Ot,readFile as kt,rename as At,writeFile as jt}from"node:fs/promises";var Mt=class{config;constructor(e){this.config=e}async init(){if(this.config.enabled)try{await B.mkdir(this.config.dir,{recursive:!0}),e.debug(`Cache directory initialized: ${this.config.dir}`)}catch(t){e.error(`Failed to initialize cache directory`,t)}}generateKey(e){return pt(`md5`).update(e).digest(`hex`)}getCachePath(e){let t=this.generateKey(e);return ft(this.config.dir,`${t}.json`)}async get(t){if(!this.config.enabled)return null;try{let n=this.getCachePath(t),r=await B.readFile(n,`utf-8`),i=JSON.parse(r);return Date.now()-i.timestamp>this.config.ttl*1e3?(await this.delete(t),null):(e.debug(`Cache hit: ${t}`),i.value)}catch{return e.debug(`Cache miss: ${t}`),null}}async set(t,n){if(this.config.enabled)try{let r=this.getCachePath(t),i={timestamp:Date.now(),value:n};await B.writeFile(r,JSON.stringify(i),`utf-8`),e.debug(`Cache set: ${t}`)}catch(t){e.error(`Failed to set cache`,t)}}async delete(t){if(this.config.enabled)try{let n=this.getCachePath(t);await B.unlink(n),e.debug(`Cache deleted: ${t}`)}catch(t){t.code!==`ENOENT`&&e.warn(`Cache delete failed:`,t)}}async clear(){if(this.config.enabled)try{let t=await B.readdir(this.config.dir);await Promise.all(t.map(e=>B.unlink(ft(this.config.dir,e)))),e.info(`Cache cleared`)}catch(t){if(t.code===`ENOENT`)return;e.error(`Failed to clear cache`,t)}}},Nt=class{mcpServer;constructor(e){this.mcpServer=e}isSamplingSupported(){try{return!!this.mcpServer.server.getClientCapabilities()?.sampling}catch{return!1}}async sampleText(t){if(!this.isSamplingSupported())return e.debug(`Sampling not supported by connected client, skipping LLM delegation`),null;try{let n=(await this.mcpServer.server.createMessage({messages:[{role:`user`,content:{type:`text`,text:t.userMessage}}],systemPrompt:t.systemPrompt,maxTokens:t.maxTokens??512,...t.temperature===void 0?{}:{temperature:t.temperature},...t.modelHint?{modelPreferences:{hints:[{name:t.modelHint}],intelligencePriority:.8,speedPriority:.7,costPriority:.3}}:{}})).content;if(Array.isArray(n)){let e=n.filter(e=>e.type===`text`).map(e=>e.text);return e.length>0?e.join(``):null}return n&&typeof n==`object`&&`type`in n&&n.type===`text`?n.text:(e.warn(`sampling/createMessage returned non-text content`),null)}catch(t){return e.warn(`LLM sampling request failed:`,t),null}}},Pt=class{mcpServer;constructor(e){this.mcpServer=e}isElicitationSupported(){try{return!!this.mcpServer.server.getClientCapabilities()?.elicitation}catch{return!1}}async requestFormInput(t){if(!this.isElicitationSupported())return e.debug(`Elicitation not supported by connected client`),null;try{let e=await this.mcpServer.server.elicitInput(t);return{action:e.action,content:e.content}}catch(t){return e.warn(`Elicitation request failed:`,t),null}}async requestConfirmation(e){let t=await this.requestFormInput({message:e,requestedSchema:{type:`object`,properties:{confirmed:{type:`boolean`,description:`Confirm this action`,title:`Confirm`,default:!0}},required:[`confirmed`]}});return t?.action===`accept`&&t.content?.confirmed===!0}async requestCaptchaSolution(e,t){let n=await this.requestFormInput({message:[`🛡️ CAPTCHA detected: **${t}**`,``,`Page: ${e}`,``,`Please solve the CAPTCHA in your browser, then confirm completion below.`,`If a token/response was generated, paste it in the token field.`].join(`
3
- `),requestedSchema:{type:`object`,properties:{solved:{type:`boolean`,description:`Have you solved the CAPTCHA?`,title:`CAPTCHA Solved`,default:!1},token:{type:`string`,description:`CAPTCHA response token (if available)`,title:`Response Token`}},required:[`solved`]}});return!n||n.action!==`accept`?null:{solved:n.content?.solved===!0,token:typeof n.content?.token==`string`?n.content.token:void 0}}},Ft=class{handlers;constructor(e){this.handlers=new Map(Object.entries(e))}has(e){return this.handlers.has(e)}listToolNames(){return Array.from(this.handlers.keys())}addHandlers(e){for(let[t,n]of Object.entries(e))this.handlers.set(t,n)}removeHandler(e){this.handlers.delete(e)}async execute(e,t){let n=this.handlers.get(e);if(!n)throw new O(`NOT_FOUND`,`Unknown tool: ${e}`,{toolName:e});return n(t)}};const It=[`page_`,`console_`,`debugger_`,`network_`,`dom_`,`stealth_`,`framework_`,`indexeddb_`,`js_heap_`,`script_`,`captcha_`,`ai_hook_`,`instrumentation_`,`hook_preset_`,`ws_`,`evidence_`],Lt=new Set([`network_icmp_probe`,`network_traceroute`,`network_rtt_measure`,`http_request_build`,`http_plain_request`,`http2_probe`,`http2_frame_build`,`dns_resolve`,`dns_reverse`]),Rt=new Set([`search_tools`,`route_tool`,`describe_tool`,`call_tool`,`activate_tools`,`deactivate_tools`,`activate_domain`]),zt=new Map([[`stealth`,[`page_navigate`,`page_evaluate`,`stealth_verify`,`page_screenshot`]],[`page`,[`browser_jsdom_parse`,`js_bundle_search`,`network_get_requests`,`page_screenshot`]],[`console`,[`page_evaluate`,`console_get_logs`,`page_screenshot`]],[`network`,[`network_get_requests`,`page_navigate`]],[`captcha`,[`captcha_wait`,`page_screenshot`]],[`ai_hook`,[`manage_hooks`,`page_evaluate`,`ai_hook_inject`]],[`instrumentation`,[`instrumentation_session`,`instrumentation_artifact`]],[`evidence`,[`evidence_query`,`evidence_chain`]]]);var Bt=class{getProvider;contextSensitiveCache=new Map;lastToolName=null;consecutiveCount=0;constructor(e){this.getProvider=e}isContextSensitive(e){let t=this.contextSensitiveCache.get(e);if(t!==void 0)return t;if(Lt.has(e))return this.contextSensitiveCache.set(e,!1),!1;let n=It.some(t=>e.startsWith(t));return this.contextSensitiveCache.set(e,n),n}recordCall(e){return Rt.has(e)?0:(e===this.lastToolName?this.consecutiveCount++:(this.lastToolName=e,this.consecutiveCount=1),this.consecutiveCount)}isRepeatLoop(){return this.consecutiveCount>=3}enrichResponse(t,n){if(this.isRepeatLoop()&&!Rt.has(t)&&this.injectRepeatWarning(t,n),!this.isContextSensitive(t)||n.isError)return n;let r=this.getProvider();if(!r||typeof r.getContextMeta!=`function`)return n;let i=r.getContextMeta();if(!i.pageId&&i.tabIndex===null)return n;let a=n.content;if(!Array.isArray(a))return n;let o=a.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(!o)return n;let s=o.text,c=s.trimStart();if(c.startsWith(`{`)&&c.trimEnd().endsWith(`}`))try{let e=JSON.parse(s);if(typeof e==`object`&&e&&!Array.isArray(e))return`_tabContext`in e||(o.text=this.spliceTabContext(s,i)),n}catch{return e.debug(`[ContextGuard] Skipped non-JSON response enrichment for ${t}`),n}return n}spliceTabContext(e,t){let n={url:t.url,title:t.title,tabIndex:t.tabIndex,pageId:t.pageId};if(/\n\}\s*$/.test(e)){let t=JSON.stringify(n,null,2).replace(/\n/g,`
4
- `);return e.replace(/\n\}\s*$/,`,\n "_tabContext": ${t}\n}`)}let r=JSON.stringify(n);return/^\{\s*\}\s*$/.test(e)?e.replace(/\{\s*\}\s*$/,`{"_tabContext":${r}}`):e.replace(/\}\s*$/,`,"_tabContext":${r}}`)}injectRepeatWarning(e,t){let n=e.split(`_`)[0]??``,r=(e===`page_evaluate`?[`browser_jsdom_parse`,`js_bundle_search`,`network_get_requests`,`page_screenshot`]:zt.get(n)??[`page_navigate`,`page_evaluate`]).filter(t=>t!==e),i={detected:!0,consecutiveCount:this.consecutiveCount,message:`⚠ You have called "${e}" ${this.consecutiveCount} times in a row. This is likely a loop — consider what you actually need to do next.`,suggestedTools:r,hint:r.length>0?`Try calling ${r[0]} instead.`:`Re-evaluate your task objective before making another tool call.`},a=t.content;if(!Array.isArray(a))return;let o=a.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(o){let e=o.text;try{let t=JSON.parse(e);if(typeof t==`object`&&t&&!Array.isArray(t)){t.repeatWarning=i,o.text=JSON.stringify(t,null,2);return}}catch{}}a.push({type:`text`,text:JSON.stringify({repeatWarning:i},null,2)})}};const Vt=3e4;var Ht=class{states=new Map;halfOpenCalls=new Map;listeners=new Set;onChange(e){this.listeners.add(e)}emit(e,t){for(let n of this.listeners)try{n(e,t)}catch{}}getState(e){return this.states.get(e)}shouldBlock(t){let n=this.states.get(t);if(!n||n.state===`closed`)return!1;if(n.state===`open`)return Date.now()-n.lastFailureTime>=Vt?(n.state=`half-open`,this.halfOpenCalls.set(t,1),e.info(`[CircuitBreaker] ${t}: open → half-open`),!1):!0;if(n.state===`half-open`){let e=this.halfOpenCalls.get(t)??0;return e>=1?!0:(this.halfOpenCalls.set(t,e+1),!1)}return!1}recordSuccess(t){let n=this.states.get(t);if(n){if(n.state===`half-open`){n.state=`closed`,n.failureCount=0,this.halfOpenCalls.delete(t),e.info(`[CircuitBreaker] ${t}: half-open → closed`),this.emit(`recovered`,t);return}n.failureCount=0}}recordFailure(t){let n=this.states.get(t);if(n||(n={toolName:t,failureCount:0,lastFailureTime:0,state:`closed`},this.states.set(t,n)),n.failureCount++,n.lastFailureTime=Date.now(),n.state===`half-open`){n.state=`open`,this.halfOpenCalls.delete(t),e.warn(`[CircuitBreaker] ${t}: half-open → open (probe failed)`),this.emit(`opened`,t);return}n.state===`closed`&&n.failureCount>=3&&(n.state=`open`,e.warn(`[CircuitBreaker] ${t}: closed → open (${n.failureCount} consecutive failures)`),this.emit(`opened`,t))}getStates(){return Array.from(this.states.values())}reset(e){this.states.delete(e),this.halfOpenCalls.delete(e)}getRecoveryMs(){return Vt}};const H=/^data:([a-zA-Z0-9/+-]+);base64,/,Ut=/"_?offload"|detailId|_filePath/;var Wt=class{detailedData;detailThreshold;fileThreshold;excludeTools;constructor(e,t={}){this.detailedData=e,this.detailThreshold=t.detailThreshold??512*1024,this.fileThreshold=t.fileThreshold??4*1024*1024,this.excludeTools=t.excludeTools??new Set}formatSize(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(1)}MB`}storeInDetailManager(t,n,r){let i=this.detailedData.store(t),a=this.detailedData.cache.get(i)?.size??0;return e.info(`[Offloader] Stored in DetailDataManager (${this.formatSize(a)}) → detailId=${i}`),{_offload:{type:`detailId`,detailId:i,size:this.formatSize(a)}}}tryParseJson(e){try{let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))return JSON.parse(t)}catch{}return null}offload(t,n){if(n.isError||this.excludeTools.has(t))return n;let r=n.content;if(!Array.isArray(r))return n;let i=!1;for(let e=0;e<r.length;e++){let n=r[e];if(typeof n!=`object`||!n)continue;let a=n;if(a.type!==`text`&&a.type!==`resource`)continue;let o=a.text;if(typeof o!=`string`||o.length<this.detailThreshold||Ut.test(o))continue;if(H.test(o)){r[e]={...a,text:JSON.stringify({_offload:{type:`file`,pending:!0,dataUriLength:o.length,hint:`Use get_detailed_data() or read file after async offload completes`,size:this.formatSize(o.length),mimeType:o.match(H)?.[1]??`application/octet-stream`}},null,2)},i=!0;continue}let s=this.tryParseJson(o);if(s!==null){r[e]={...a,text:JSON.stringify(this.storeInDetailManager(s,t,e),null,2)},i=!0;continue}if(o.length>=this.fileThreshold){r[e]={...a,text:JSON.stringify({_offload:{type:`file`,pending:!0,hint:`Large raw string — use get_detailed_data() or await async offload`,size:this.formatSize(o.length)}},null,2)},i=!0;continue}}return i&&e.debug(`[Offloader] Offloaded large data from ${t}`),n}async offloadAsync(t,n){if(n.isError||this.excludeTools.has(t))return n;let r=n.content;if(!Array.isArray(r))return n;for(let t=0;t<r.length;t++){let n=r[t];if(typeof n!=`object`||!n)continue;let i=n;if(i.type!==`text`)continue;let a=i.text;if(typeof a==`string`)try{let n=JSON.parse(a);n?._offload?.pending&&H.test(n._offload.mimeType?`data:${n._offload.mimeType};base64,`:``)&&e.debug(`[Offloader] Skipping async write for already-placeholdered entry ${t}`)}catch{}}return n}};function Gt(){let t=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),n=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase(),r=ye(process.env.MCP_TOOL_DOMAINS);if(r&&r.length>0){let t=he(r);return e.info(`Tool registration mode=domains [${r.join(`,`)}], count=${t.length}`),{tools:t,profile:n===`full`||n===`workflow`||n===`search`?n:`search`}}let i;i=n===`full`||n===`workflow`||n===`search`?n:`search`;let a=ue(i);return i===`search`?e.info(`Tool registration mode=search bootstrap, transport=${t}, baseCount=${a.length}. Meta-tools remain available for domain activation and call_tool bridging.`):e.info(`Tool registration mode=${i}, transport=${t}, count=${a.length}`),{tools:a,profile:i}}function U(e){return(typeof e==`object`||typeof e==`function`)&&e!==null&&typeof e.then==`function`}function Kt(e){let t=new Set;for(let n of e){let e=D(n.name);e&&t.add(e)}return t}function W(t,n,r,i){let a={domain:n,label:r},o,s,c=`unknown`,l=0;function u(e,t){let n=e[t];return typeof n==`function`?n.bind(e):n}function d(){if(s)return s;if(o)return o;if(l>0)throw new O(`RUNTIME`,`${r}: circular initialization detected for domain "${n}"`,{details:a});e.info(`Lazy-initializing ${r} for domain "${n}"`),l++;try{let e=i();return U(e)?(c=`async`,o=Promise.resolve(e).then(e=>(s=e,e)),o):(c=`sync`,s=e,o=Promise.resolve(e),e)}finally{l--}}async function f(){let e=d();return U(e)?await e:e}function p(e){let t=()=>f().then(t=>u(t,e));return new Proxy((...t)=>f().then(n=>{let r=n[e];return typeof r==`function`?r.call(n,...t):r}),{get:(e,n,r)=>n===`then`?(...e)=>t().then(...e):n===`catch`?(...e)=>t().catch(...e):n===`finally`?(...e)=>t().finally(...e):Reflect.get(e,n,r)})}return new Proxy({},{get:(e,i)=>{if(!t.enabledDomains.has(n))return()=>{throw new O(`PREREQUISITE`,`${r} is unavailable: domain "${n}" not enabled by current tool profile`,{details:a})};if(i===`then`||i===`catch`||i===Symbol.toStringTag)return;if(s&&c===`sync`)return u(s,i);let o=d();return U(o)?p(i):u(o,i)}})}const qt=new Set([`http://127.0.0.1`,`http://localhost`,`http://[::1]`]);function Jt(e,t){let n=e.headers.origin;if(!n)return!0;let r;try{let e=new URL(n);r=`${e.protocol}//${e.hostname}`}catch{return t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – invalid Origin header`),!1}return qt.has(r)||process.env.MCP_AUTH_TOKEN?!0:(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – cross-origin requests require MCP_AUTH_TOKEN`),!1)}function Yt(e,t){let n=process.env.MCP_AUTH_TOKEN;if(!n){let e=process.env.MCP_HOST??`127.0.0.1`;return!new Set([`127.0.0.1`,`localhost`,`::1`]).has(e)&&![`1`,`true`].includes((process.env.MCP_ALLOW_INSECURE??``).toLowerCase())?(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – MCP_AUTH_TOKEN is required when binding to non-localhost. Set MCP_ALLOW_INSECURE=1 to override.`),!1):!0}let r=e.headers.authorization;if(!r?.startsWith(`Bearer `))return t.writeHead(401,{"Content-Type":`text/plain`}),t.end(`Unauthorized – missing or malformed Authorization header`),!1;let i=r.slice(7),a=Buffer.from(i),o=Buffer.from(n);return a.length!==o.length||!vt(a,o)?(t.writeHead(403,{"Content-Type":`text/plain`}),t.end(`Forbidden – invalid token`),!1):!0}const Xt=(()=>{let e=parseInt(process.env.MCP_MAX_BODY_BYTES??``,10);return Number.isFinite(e)&&e>0?e:10*1024*1024})();function Zt(e,t,n=Xt){return new Promise((r,i)=>{let a=[],o=0,s=parseInt(e.headers[`content-length`]??``,10);if(!isNaN(s)&&s>n){t.writeHead(413,{"Content-Type":`text/plain`}),t.end(`Payload Too Large – limit is ${n} bytes`),i(Error(`body_too_large`));return}let c=!1;e.on(`data`,r=>{if(!c){if(o+=r.length,o>n){c=!0,t.writeHead(413,{"Content-Type":`text/plain`}),t.end(`Payload Too Large – limit is ${n} bytes`,()=>{e.destroy()}),i(Error(`body_too_large`));return}a.push(r)}}),e.on(`end`,()=>{if(!c)try{r(JSON.parse(Buffer.concat(a).toString(`utf8`)))}catch{t.writeHead(400,{"Content-Type":`text/plain`}),t.end(`Bad Request – invalid JSON body`),i(Error(`invalid_json`))}}),e.on(`error`,e=>i(e))})}const G=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_WINDOW_MS??``,10);return Number.isFinite(e)&&e>0?e:6e4})(),Qt=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_MAX??``,10);return Number.isFinite(e)&&e>0?e:60})(),K=new Map,$t=a,en=o;let tn=Date.now();function nn(e){if(e-tn<en)return;tn=e;let t=e-G;for(let[e,n]of K)n.timestamps=n.timestamps.filter(e=>e>t),n.timestamps.length===0&&K.delete(e)}function rn(){if(K.size<=$t)return;let e=Math.ceil($t*.1),t=0;for(let n of K.keys()){if(t>=e)break;K.delete(n),t++}}function an(e){if([`1`,`true`].includes((process.env.MCP_TRUST_PROXY??``).toLowerCase())){let t=e.headers[`x-forwarded-for`];if(t)return(Array.isArray(t)?t[0]:t.split(`,`)[0]).trim()}return e.socket.remoteAddress??`unknown`}function on(e,t,n=!1){if([`0`,`false`].includes((process.env.MCP_RATE_LIMIT_ENABLED??``).toLowerCase()))return!0;let r=n?Qt*3:Qt,i=Date.now();nn(i),rn();let a=an(e),o=K.get(a);o||(o={timestamps:[]},K.set(a,o));let s=i-G;if(o.timestamps=o.timestamps.filter(e=>e>s),o.timestamps.length>=r){let e=Math.ceil(G/1e3);return t.writeHead(429,{"Content-Type":`text/plain`,"Retry-After":String(e)}),t.end(`Too Many Requests – limit is ${r} per ${e}s window`),!1}return o.timestamps.push(i),!0}function sn(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?typeof t[0]==`string`&&t[0].trim().length>0?t[0].trim():null:typeof t==`string`&&t.trim().length>0?t.trim():null}function q(e){return typeof e==`string`?`s:${e}`:`n:${String(e)}`}var cn=class{onclose;onerror;onmessage;sessionId;started=!1;sessions=new Map;requestRoutes=new Map;sessionOriginalToInternal=new Map;requestSequence=0;async start(){if(this.started)throw Error(`MultiplexedStreamableHttpTransport already started`);this.started=!0}async close(){let e=[...this.sessions.values()];this.sessions.clear(),this.requestRoutes.clear(),this.sessionOriginalToInternal.clear(),await Promise.allSettled(e.map(e=>e.transport.close())),this.onclose?.()}async send(e,t){let n=this.resolveRouteKey(e,t);if(n){let r=this.requestRoutes.get(n);if(r){let i=z(e)||R(e)?{...e,id:r.originalId}:e,a=t?.relatedRequestId===void 0?t:{...t,relatedRequestId:r.originalId};await r.transport.send(i,a),(z(e)||R(e))&&this.releaseRequestRoute(n,r);return}}let r=[...this.sessions.values()];if(r.length!==0){if(ut(e)){await Promise.allSettled(r.map(n=>n.transport.send(e,t)));return}if(r.length===1){await r[0].transport.send(e,t);return}throw Error(`Ambiguous HTTP session for outbound request/response routing.`)}}async handleRequest(e,t,n){let r=sn(e);if(r){let i=this.sessions.get(r);if(!i){t.writeHead(404,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,error:{code:-32e3,message:`Unknown MCP session: ${r}`},id:null}));return}await i.transport.handleRequest(e,t,n);return}let i=this.createInnerTransport();await i.handleRequest(e,t,n),i.sessionId&&!this.sessions.has(i.sessionId)&&this.sessions.set(i.sessionId,{sessionId:i.sessionId,transport:i})}createInnerTransport(){let e=new yt({sessionIdGenerator:()=>_t()});return e.onmessage=(t,n)=>{let r=e.sessionId,i=r?this.rewriteInboundMessage(r,e,t):t;this.onmessage?.(i,{...n})},e.onerror=e=>{this.onerror?.(e)},e.onclose=()=>{e.sessionId&&this.dropSession(e.sessionId)},e}rewriteInboundMessage(e,t,n){if(dt(n)){let r=`http:${e}:${++this.requestSequence}`;this.requestRoutes.set(r,{sessionId:e,originalId:n.id,transport:t});let i=this.sessionOriginalToInternal.get(e);return i||(i=new Map,this.sessionOriginalToInternal.set(e,i)),i.set(q(n.id),r),{...n,id:r}}if(ut(n)&&n.method===`notifications/cancelled`){let t=typeof n.params==`object`&&n.params!==null?n.params:null,r=t?.requestId;if(typeof r==`string`||typeof r==`number`){let i=this.sessionOriginalToInternal.get(e)?.get(q(r));if(i)return{...n,params:{...t,requestId:i}}}}return n}resolveRouteKey(e,t){return t?.relatedRequestId===void 0?z(e)||R(e)?String(e.id):null:String(t.relatedRequestId)}releaseRequestRoute(e,t){this.requestRoutes.delete(e);let n=this.sessionOriginalToInternal.get(t.sessionId);n&&(n.delete(q(t.originalId)),n.size===0&&this.sessionOriginalToInternal.delete(t.sessionId))}dropSession(t){this.sessions.delete(t),this.sessionOriginalToInternal.delete(t);for(let[e,n]of this.requestRoutes)n.sessionId===t&&this.requestRoutes.delete(e);e.info(`[http] MCP session closed: ${t}`)}};async function ln(t){let n=new gt;if(typeof n.send==`function`){let t=n.send.bind(n);n.send=n=>new Promise(r=>{let i=setTimeout(()=>{e.warn(`transport.send() timed out — stdout broken, skipping write`),r()},500);t(n).then(()=>clearTimeout(i)).catch(()=>clearTimeout(i)).finally(r)})}n.onclose=()=>{t.shutdownStarted||(e.info(`stdio transport closed — running cleanup...`),J(t).catch(t=>e.warn(`cleanup after transport close failed:`,t)))},await t.server.connect(n);let r=!1,i=()=>{r||(r=!0,e.info(`stdin EOF — parent disconnected, shutting down...`),J(t).catch(t=>e.warn(`stdin EOF cleanup failed:`,t)).finally(()=>process.exit(0)))};process.stdin.on(`end`,i),process.stdin.on(`close`,i),e.success(`MCP stdio server started`)}async function un(t){let r=parseInt(process.env.MCP_PORT??`3000`,10),i=process.env.MCP_HOST??`127.0.0.1`,a=new cn;await t.server.connect(a),t.httpServer=ht((e,n)=>{let i=new URL(e.url??`/`,`http://localhost:${r}`);if(i.pathname===`/health`&&e.method===`GET`){dn(t,n);return}if(i.pathname!==`/mcp`){n.writeHead(404,{"Content-Type":`text/plain`}),n.end(`Not Found – use POST /mcp or GET /health`);return}if(!Jt(e,n))return;let o=Yt(e,n);if(o&&on(e,n,o)){if(e.method===`GET`||e.method===`DELETE`){a.handleRequest(e,n);return}if(e.method===`POST`){Zt(e,n).then(t=>a.handleRequest(e,n,t)).catch(()=>{});return}n.writeHead(405,{"Content-Type":`text/plain`}),n.end(`Method Not Allowed`)}});let o=t.httpServer;if(!o)throw Error(`HTTP server initialization failed`);o.requestTimeout=c,o.headersTimeout=n,o.keepAliveTimeout=h,o.on(`connection`,e=>{t.httpSockets.add(e),e.on(`close`,()=>t.httpSockets.delete(e))}),await new Promise((t,n)=>{o.listen(r,i,()=>{e.success(`MCP Streamable HTTP server listening on http://${i}:${r}/mcp`),t()}),o.on(`error`,n)})}function dn(e,t){let n=[`1`,`true`].includes((process.env.MCP_HEALTH_VERBOSE??``).toLowerCase()),r={status:`ok`,uptime:process.uptime()};if(n){let t=e.tokenBudget.getStats();r.tier=e.baseTier,r.baseTier=e.baseTier,r.enabledDomains=[...e.enabledDomains],r.registeredTools=e.selectedTools.length,r.activatedTools=e.activatedToolNames.size,r.tokenBudget={usagePercentage:t.usagePercentage,currentUsage:t.currentUsage,maxTokens:t.maxTokens}}t.writeHead(200,{"Content-Type":`application/json`}),t.end(JSON.stringify(r))}async function J(t){return t.shutdownStarted?t.shutdownPromise??Promise.resolve():(t.shutdownStarted=!0,t.shutdownPromise=(async()=>{let n=typeof t.getDomainInstance==`function`?t.getDomainInstance.bind(t):null;if(n){let t=n(`snapshotScheduler`);if(t)try{await t.flushAll(),t.dispose()}catch(t){e.warn(`snapshot flush on shutdown failed:`,t)}}for(let[,e]of t.domainTtlEntries)clearTimeout(e.timer);t.domainTtlEntries.clear(),t.detailedData.shutdown();let r=typeof t.getDomainInstance==`function`?t.getDomainInstance(`activationController`):t.activationController??void 0;if(r&&typeof r.dispose==`function`)try{r.dispose()}catch(t){e.warn(`activationController cleanup failed:`,t)}if(t.httpServer){let e=t.httpServer,n=new Promise(t=>e.close(()=>t())),r=setTimeout(()=>{for(let e of t.httpSockets)e.destroy()},ne);await n,clearTimeout(r),t.httpSockets.clear(),t.httpServer=void 0}let i=[[`consoleMonitor`,t.consoleMonitor,`disable`],[`runtimeInspector`,t.runtimeInspector,`close`],[`debuggerManager`,t.debuggerManager,`close`],[`scriptManager`,t.scriptManager,`close`],[`transformHandlers`,t.transformHandlers,`close`]];for(let[t,n,r]of i)if(n)try{let e=n[r];typeof e==`function`&&await e.call(n)}catch(n){e.warn(`${t} cleanup failed:`,n)}if(t.consoleMonitor=void 0,t.runtimeInspector=void 0,t.debuggerManager=void 0,t.scriptManager=void 0,t.collector){try{await t.collector.close()}catch(t){e.warn(`collector cleanup failed:`,t)}t.collector=void 0}try{await t.server.close()}catch(t){e.warn(`MCP server close failed:`,t)}try{await Me.terminateAll()}catch(t){e.warn(`ProcessRegistry cleanup failed:`,t)}e.success(`MCP server closed`)})(),t.shutdownPromise)}const fn={debug:0,info:1,warning:2,error:3},pn={debug:`debug`,info:`info`,warning:`warning`,error:`error`};var mn=class{server=null;minLevel=`info`;enabled=!1;filePath;attach(e,t){this.server=e,this.enabled=t}setEnabled(e){this.enabled=e}setLevel(e){this.minLevel=e}enableFileLogging(e){try{xt(e,{recursive:!0});let t=new Date().toISOString().replace(/[:.]/g,`-`);this.filePath=wt(e,`jshookmcp-${t}.log`)}catch{}}getFilePath(){return this.filePath}log(e,t,n){!this.enabled||!this.server||fn[e]<fn[this.minLevel]||(this.server.server.sendLoggingMessage({level:pn[e],logger:t,data:JSON.stringify(n)}).catch(()=>void 0),this.writeToFile(e,t,n))}writeToFile(e,t,n){if(this.filePath)try{let r=JSON.stringify({timestamp:new Date().toISOString(),level:e,logger:t,...n})+`
5
- `;bt(this.filePath,r,`utf8`)}catch{}}debug(e,t){this.log(`debug`,e,t)}info(e,t){this.log(`info`,e,t)}warning(e,t){this.log(`warning`,e,t)}error(e,t){this.log(`error`,e,t)}};const hn=[{id:`wasm-chrome-macos`,name:`WASM inside Chrome on macOS`,conditions:[{type:`platform`,value:`darwin`},{type:`domain_active`,domain:`browser`},{type:`event_count`,event:`tool:called`,minCount:2,windowMs:i}],boostDomains:[`wasm`,`transform`],priority:20},{id:`debug-memory`,name:`Debug + Memory inspection`,conditions:[{type:`domain_active`,domain:`debugger`},{type:`event_count`,event:`debugger:breakpoint_hit`,minCount:1,windowMs:i}],boostDomains:[`memory`],priority:15},{id:`network-intercept-flow`,name:`Network interception workflow`,conditions:[{type:`domain_active`,domain:`network`},{type:`domain_active`,domain:`browser`}],boostDomains:[`hooks`],priority:10},{id:`skia-to-v8-correlation`,name:`Skia scene + V8 heap correlation`,conditions:[{type:`domain_active`,domain:`skia-capture`},{type:`event_count`,event:`v8:heap_captured`,minCount:1,windowMs:l}],boostDomains:[`cross-domain`,`v8-inspector`],priority:22},{id:`mojo-browser-network`,name:`Mojo IPC inside Chromium with active browser`,conditions:[{type:`domain_active`,domain:`mojo-ipc`},{type:`domain_active`,domain:`browser`}],boostDomains:[`network`,`cross-domain`],priority:18},{id:`frida-binary-trace`,name:`Frida attached → trace + cross-domain`,conditions:[{type:`tool_called_recently`,toolName:`frida_attach`,withinMs:l}],boostDomains:[`binary-instrument`,`trace`,`cross-domain`],priority:16},{id:`tls-capture-to-network`,name:`TLS keylog captured → network replay prep`,conditions:[{type:`domain_active`,domain:`boringssl-inspector`}],boostDomains:[`network`],priority:12},{id:`syscall-js-correlation`,name:`Syscall trace live → JS correlation`,conditions:[{type:`domain_active`,domain:`syscall-hook`},{type:`event_count`,event:`tool:called`,minCount:1,windowMs:l}],boostDomains:[`cross-domain`],priority:14}];var gn=class{conditions;constructor(e=[]){this.conditions=[...hn,...e].toSorted((e,t)=>t.priority-e.priority)}evaluate(e){let t=new Set;for(let n of this.conditions)if(this.allConditionsMet(n,e))for(let e of n.boostDomains)t.add(e);return[...t]}allConditionsMet(e,t){return e.conditions.every(e=>this.evaluatePredicate(e,t))}evaluatePredicate(e,t){let n=Date.now();switch(e.type){case`platform`:return t.platform===e.value;case`domain_active`:return t.activeDomains.has(e.domain);case`event_count`:{let r=n-e.windowMs;return t.eventHistory.filter(t=>t.event.startsWith(e.event)&&t.timestamp>=r).length>=e.minCount}case`tool_called_recently`:{let r=n-e.withinMs;return t.eventHistory.some(t=>t.event===`tool:called`&&t.timestamp>=r&&t.payload?.toolName===e.toolName)}default:return!1}}get conditionCount(){return this.conditions.length}},_n=class{callHistory=[];maxHistory;confidenceThreshold;decayFactor;transitions=new Map;transitions2=new Map;maxSecondOrderKeys;constructor(e={}){this.maxHistory=e.maxHistory??f,this.confidenceThreshold=e.confidenceThreshold??v,this.decayFactor=e.decayFactor??te,this.maxSecondOrderKeys=e.maxSecondOrderKeys??r}recordCall(e){let t=this.callHistory.length>0?this.callHistory[this.callHistory.length-1]:null,n=this.callHistory.length>1?this.callHistory[this.callHistory.length-2]:null;if(this.callHistory.push(e),this.callHistory.length>this.maxHistory&&this.callHistory.splice(0,this.callHistory.length-this.maxHistory),this.applyDecay(this.transitions),this.applyDecay(this.transitions2),t&&this.bumpTransition(this.transitions,t,e),n&&t){let r=`${n}\u0001${t}`;this.bumpTransition(this.transitions2,r,e),this.enforceSecondOrderCap()}}predictNext(e){let t=this.callHistory.length>1?this.callHistory[this.callHistory.length-2]:null;if(t){let n=`${t}\u0001${e}`,r=this.transitions2.get(n),i=this.pickPredictions(r);if(i.length>0)return i}return this.pickPredictions(this.transitions.get(e))}predictNextDomains(e,t){let n=this.predictNext(e),r=new Set;for(let e of n){let n=t(e);n&&r.add(n)}return[...r]}get historyLength(){return this.callHistory.length}get transitionCount(){return this.transitions.size}get secondOrderTransitionCount(){return this.transitions2.size}reset(){this.callHistory.length=0,this.transitions.clear(),this.transitions2.clear()}applyDecay(e){if(!(this.decayFactor>=1))for(let[,t]of e)for(let[e,n]of t){let r=n*this.decayFactor;r<.01?t.delete(e):t.set(e,r)}}bumpTransition(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r)),r.set(n,(r.get(n)??0)+1)}enforceSecondOrderCap(){if(this.transitions2.size<=this.maxSecondOrderKeys)return;let e=this.transitions2.size-this.maxSecondOrderKeys,t=this.transitions2.keys();for(let n=0;n<e;n++){let{value:e,done:n}=t.next();if(n||!e)break;this.transitions2.delete(e)}}pickPredictions(e){if(!e||e.size===0)return[];let t=0;for(let n of e.values())t+=n;if(t===0)return[];let n=[];for(let[r,i]of e){let e=i/t;e>=this.confidenceThreshold&&n.push({tool:r,confidence:e})}return n.sort((e,t)=>t.confidence-e.confidence),n.map(e=>e.tool)}},vn=class{lastActivity=new Map;baseDomains;autoActivatedDomains=new Set;autoInactivityMs;manualInactivityMs;checkIntervalMs;checkTimer=null;eventBus;onPrune;constructor(e,t,n,r={}){this.eventBus=e,this.baseDomains=t,this.onPrune=n,this.autoInactivityMs=r.autoActivatedInactivityMs??b,this.manualInactivityMs=r.manualActivatedInactivityMs??ee,this.checkIntervalMs=r.checkIntervalMs??w,this.startCheckTimer()}recordActivity(e){this.lastActivity.set(e,Date.now())}markAutoActivated(e){this.autoActivatedDomains.add(e),this.lastActivity.set(e,Date.now())}startCheckTimer(){this.checkTimer=setInterval(()=>{this.checkAndPrune()},this.checkIntervalMs),this.checkTimer.unref&&this.checkTimer.unref()}checkAndPrune(){let t=Date.now();for(let[n,r]of this.lastActivity.entries()){if(this.baseDomains.has(n))continue;let i=t-r,a=this.autoActivatedDomains.has(n)?this.autoInactivityMs:this.manualInactivityMs;i>=a&&(e.info(`[AutoPruner] Pruning domain "${n}" — inactive for ${Math.round(i/1e3)}s (threshold: ${Math.round(a/1e3)}s)`),this.onPrune(n),this.lastActivity.delete(n),this.autoActivatedDomains.delete(n),this.eventBus.emit(`activation:domain_pruned`,{domain:n,reason:`inactivity (${Math.round(i/1e3)}s)`,timestamp:new Date().toISOString()}))}}getLastActivity(e){return this.lastActivity.get(e)}isAutoActivated(e){return this.autoActivatedDomains.has(e)}dispose(){this.checkTimer&&=(clearInterval(this.checkTimer),null),this.lastActivity.clear(),this.autoActivatedDomains.clear()}};const yn=[{eventPattern:`debugger:breakpoint_hit`,targetDomains:[`debugger`],threshold:1,windowMs:C,priority:10},{eventPattern:`browser:navigated`,targetDomains:[`browser`],threshold:1,windowMs:C,priority:10},{eventPattern:`memory:scan_completed`,targetDomains:[`memory`],threshold:1,windowMs:C,priority:10},{eventPattern:`network:intercept_started`,targetDomains:[`network`,`hooks`],threshold:1,windowMs:C,priority:9},{eventPattern:`v8:heap_captured`,targetDomains:[`v8-inspector`],threshold:1,windowMs:C,priority:10},{eventPattern:`tls:keylog_started`,targetDomains:[`boringssl-inspector`],threshold:1,windowMs:C,priority:10},{eventPattern:`skia:scene_captured`,targetDomains:[`skia-capture`],threshold:1,windowMs:C,priority:10},{eventPattern:`frida:attached`,targetDomains:[`binary-instrument`],threshold:1,windowMs:C,priority:10},{eventPattern:`adb:device_connected`,targetDomains:[`adb-bridge`],threshold:1,windowMs:C,priority:10},{eventPattern:`mojo:message_captured`,targetDomains:[`mojo-ipc`],threshold:1,windowMs:C,priority:10},{eventPattern:`syscall:trace_started`,targetDomains:[`syscall-hook`],threshold:1,windowMs:C,priority:10},{eventPattern:`protocol:pattern_detected`,targetDomains:[`protocol-analysis`],threshold:1,windowMs:C,priority:10}];var bn=class{eventBus;ctx;cooldownMs;boostRules;unsubscribers=[];lastBoostTime=new Map;lastActivity=new Map;eventHistory=[];maxEventHistory;toolCallCount=0;compoundEvalEvery;compoundEngine;predictiveBooster;autoPruner;disposed=!1;constructor(t,n,r={}){this.eventBus=t,this.ctx=n,this.cooldownMs=r.cooldownMs??S,this.maxEventHistory=y,this.compoundEvalEvery=Math.max(1,x);let i=r.boostRules??[];this.boostRules=[...yn,...i].toSorted((e,t)=>t.priority-e.priority),this.compoundEngine=new gn,this.predictiveBooster=new _n;let a=new Set(ve(n.baseTier));this.autoPruner=new vn(t,a,t=>{e.info(`[ActivationController] Auto-pruning domain "${t}"`)}),this.subscribe(),e.info(`[ActivationController] Initialized with ${this.boostRules.length} boost rules, cooldown=${this.cooldownMs}ms, platform=${process.platform}, ${this.compoundEngine.conditionCount} compound conditions`)}subscribe(){this.unsubscribers.push(this.eventBus.on(`tool:called`,e=>{this.recordEvent(`tool:called`,e),e.domain&&(this.lastActivity.set(e.domain,Date.now()),this.autoPruner.recordActivity(e.domain)),this.predictiveBooster.recordCall(e.toolName);let t=this.predictiveBooster.predictNextDomains(e.toolName,e=>D(e)??null);for(let n of t)this.attemptBoost(n,`predictive: ${e.toolName} → ${n}`);this.toolCallCount++,this.toolCallCount%this.compoundEvalEvery===0&&this.evaluateCompoundConditions()}));let e=new Set;for(let t of this.boostRules){if(!t.eventPattern||e.has(t.eventPattern))continue;e.add(t.eventPattern);let n=t.eventPattern;this.unsubscribers.push(this.eventBus.on(n,e=>(this.recordEvent(t.eventPattern,e),this.evaluateBoostRules(t.eventPattern))))}}recordEvent(e,t){this.eventHistory.push({event:e,timestamp:Date.now(),payload:t}),this.eventHistory.length>this.maxEventHistory&&this.eventHistory.splice(0,this.eventHistory.length-this.maxEventHistory)}async evaluateBoostRules(e){let t=Date.now();for(let n of this.boostRules){if(!e.startsWith(n.eventPattern))continue;let r=t-n.windowMs,i=this.eventHistory.filter(e=>e.event.startsWith(n.eventPattern)&&e.timestamp>=r).length;i>=n.threshold&&await Promise.all(n.targetDomains.map(e=>this.attemptBoost(e,`rule:${n.eventPattern} (${i} events)`)))}}async attemptBoost(t,n){if(this.disposed)return;let r=Date.now();r-(this.lastBoostTime.get(t)??0)<this.cooldownMs||this.ctx.enabledDomains.has(t)||(this.lastBoostTime.set(t,r),e.info(`[ActivationController] Boosting domain "${t}" — reason: ${n}`),await A(this.ctx,{domain:t,ttlMinutes:_}),await this.eventBus.emit(`activation:domain_boosted`,{domain:t,reason:n,timestamp:new Date().toISOString()}))}evaluateCompoundConditions(){let e={platform:process.platform,activeDomains:this.ctx.enabledDomains,eventHistory:this.eventHistory,recentToolCalls:this.eventHistory.filter(e=>e.event===`tool:called`).map(e=>e.payload?.toolName??``)},t=this.compoundEngine.evaluate(e);for(let e of t)this.attemptBoost(e,`compound condition`)}getLastActivity(e){return this.lastActivity.get(e)}getEventHistory(){return this.eventHistory}getLastBoostTime(e){return this.lastBoostTime.get(e)}getPredictiveBooster(){return this.predictiveBooster}getAutoPruner(){return this.autoPruner}dispose(){this.disposed=!0;for(let e of this.unsubscribers)e();this.unsubscribers.length=0,this.lastBoostTime.clear(),this.lastActivity.clear(),this.eventHistory.length=0,this.autoPruner.dispose(),this.predictiveBooster.reset(),e.info(`[ActivationController] Disposed`)}};const xn=new Set([`true`,`1`,`yes`,`on`]),Sn=new Set([`false`,`0`,`no`,`off`]);function Cn(e){if(typeof e!=`string`)return e;let t=e.trim().toLowerCase();return xn.has(t)?!0:Sn.has(t)?!1:e}function wn(e){if(typeof e!=`string`)return e;let t=e.trim();if(t===``)return e;let n=Number(t);return Number.isFinite(n)?n:e}function Y(e){let t=e.type,n=typeof e.description==`string`?e.description:void 0;if(e.anyOf!==void 0||e.oneOf!==void 0){let t=(e.anyOf??e.oneOf).map(e=>Y(e)),r=V.union([t[0],...t.slice(1)]);return n?r.describe(n):r}let r;switch(t){case`string`:if(Array.isArray(e.enum)){let t=e.enum;r=V.enum(t)}else{let t=V.string();typeof e.pattern==`string`&&(t=t.regex(new RegExp(e.pattern))),r=t}break;case`number`:case`integer`:{let n=V.number();typeof e.minimum==`number`&&(n=n.min(e.minimum)),typeof e.maximum==`number`&&(n=n.max(e.maximum)),t===`integer`&&(n=n.int()),r=V.preprocess(wn,n);break}case`boolean`:r=V.preprocess(Cn,V.boolean());break;case`array`:r=e.items&&typeof e.items==`object`?V.array(Y(e.items)):V.array(V.unknown());break;case`object`:if(e.properties&&typeof e.properties==`object`){let t={},n=new Set(Array.isArray(e.required)?e.required:[]);for(let[r,i]of Object.entries(e.properties)){let e=Y(i);t[r]=n.has(r)?e:e.optional()}r=V.object(t)}else r=V.record(V.string(),V.unknown());break;default:r=V.unknown()}return n&&(r=r.describe(n)),r}function Tn(e){let t=e.properties??{},n=new Set(Array.isArray(e.required)?e.required:[]),r={};for(let[e,i]of Object.entries(t)){let t=Y(i&&typeof i==`object`?i:{});r[e]=n.has(e)?t:t.optional()}return r}function En(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Dn(e){let t=e._meta;return En(t)?t:null}function On(e,t){let n={...e},r={},i=Dn(e);return i&&Object.assign(r,i),En(t?._meta)&&Object.assign(r,t?._meta),typeof t?.sessionId==`string`&&t.sessionId.trim().length>0&&(r.sessionId=t.sessionId),Object.keys(r).length>0&&(n._meta=r),n}function kn(e){switch(e){case`VALIDATION`:return I.InvalidParams;case`NOT_FOUND`:return-32002;case`TIMEOUT`:return I.RequestTimeout;case`CONNECTION`:return I.ConnectionClosed;case`PREREQUISITE`:case`PERMISSION`:return I.InvalidRequest;default:return I.InternalError}}function An(t,n){if(n instanceof Et)throw e.error(`Tool validation failed: ${t}`,n),new L(I.InvalidParams,`Validation Error in ${t}: ${n.message}`);if(n instanceof L)throw n;if(n instanceof O){e.error(`Tool execution failed [${n.code}]: ${t} - ${n.message}`);let r=n.details?`\nDetails: ${JSON.stringify(n.details)}`:``;throw new L(kn(n.code),`[${n.code}] ${n.message}${r}`)}throw e.error(`Tool execution failed: ${t}`,n),new L(I.InternalError,`Execution Failed in ${t}: ${n instanceof Error?n.message:String(n)}`)}function X(e){let t={...e};if(t.properties){let e={};for(let[n,r]of Object.entries(t.properties)){let{description:t,...i}=r;e[n]=X(i)}t.properties=e}if(t.items&&typeof t.items==`object`){let{description:e,...n}=t.items;t.items=X(n)}return t.additionalProperties&&typeof t.additionalProperties==`object`&&!Array.isArray(t.additionalProperties)&&(t.additionalProperties=X(t.additionalProperties)),t}function jn(e,t){let n=t;n.autocompleteHandlers&&e.toolAutocompleteHandlers.set(t.name,n.autocompleteHandlers);let r=d&&t.inputSchema?X(t.inputSchema):t.inputSchema,i=r&&typeof r==`object`?Tn(r):{},a=t.description??t.name;if(Object.keys(i).length>0){let r=e.server.registerTool(t.name,{description:a,inputSchema:i},async(n,r)=>{try{let i=On(n,r);return await e.executeToolWithTracking(t.name,i)}catch(e){return An(t.name,e)}});if(n.execution){let r=e.server.registeredTools;r&&r[t.name]&&(r[t.name].execution=n.execution)}return r}let o=e.server.registerTool(t.name,{description:a},async(n,r)=>{try{let n=On({},r);return await e.executeToolWithTracking(t.name,n)}catch(e){return An(t.name,e)}});if(n.execution){let r=e.server.registeredTools;r&&r[t.name]&&(r[t.name].execution=n.execution)}return o}function Z(e){if(e?.type!==`object`||!e.properties)return{};let t={},n=new Set(Array.isArray(e.required)?e.required:[]);for(let[r,i]of Object.entries(e.properties)){let e=i;!n.has(r)&&e.default===void 0||(e.default===void 0?e.enum&&Array.isArray(e.enum)&&e.enum.length>0?t[r]=e.enum[0]:e.type===`string`?t[r]=`<${r}>`:e.type===`number`||e.type===`integer`?t[r]=0:e.type===`boolean`?t[r]=!1:e.type===`array`?t[r]=[]:e.type===`object`&&(t[r]={}):t[r]=e.default)}return t}function Mn(e,t){return`call_tool({ name: "${e}", args: ${JSON.stringify(Z(t))} })`}function Nn(e,t){let n=P(e),r=N(n,t);return r?{name:n,description:Xe(n,t),inputSchema:r}:null}async function Pn(t,n,r){let{task:i,context:a={}}=t,o=a.maxRecommendations||5;e.info(`[ToolRouter] Routing request`,{task:i,context:a}),await Pe(n);let s=Ie(i),c=k(n),l=Se(n),u=await We(n),d=ze(n),f=Qe(i,n),p=null,m=await r.search(i,o*2,c,l,xe(n)),h=!f&&!s?Ve(m.slice(0,10),d):null,g=[];if(h){let t=h.tools.filter(e=>d.has(e)).map((e,t)=>({name:e,domain:Be(e,n),shortDescription:m.find(t=>t.name===e)?.shortDescription??n.extensionToolsByName.get(e)?.tool.description??``,score:h.priority-t*.01,isActive:F(e,n)})),r=new Set(h.tools),i=m.filter(e=>!r.has(e.name));g=[...t,...i],e.info(`[ToolRouter] Cross-domain workflow detected`,{pattern:h.id,domains:h.domains})}else if(f?.workflow.route.kind===`preset`){let e=Ye(f,u,n,d);p=new Set(e.map(e=>e.name));let t=new Set(e.map(e=>e.name)),r=m.filter(e=>!t.has(e.name));g=[...e,...r]}else if(f?.workflow.route.kind===`workflow`){let e=Ue(f,n);g=[e,...m.filter(t=>t.name!==e.name)]}else if(s){let e=Re(i),t=Le(s,u,d),r=t.map((t,r)=>({name:t,domain:Be(t,n),shortDescription:m.find(e=>e.name===t)?.shortDescription??n.extensionToolsByName.get(t)?.tool.description??``,score:(e?90:s.priority)-r*.01,isActive:F(t,n)})),a=new Set(t),o=m.filter(e=>!a.has(e.name));g=[...r,...o]}else if(i&&!Ze(i,s)&&!$e(i)){let e=qe(i,n,d);if(e.length>0){let t=new Set(e.map(e=>e.name)),n=m.filter(e=>!t.has(e.name));g=[...e,...n]}else g=[...m]}else g=[...m];let _=[],v=new Set;for(let e of g)v.has(e.name)||(v.add(e.name),_.push(e));g=Je(_,i,s,u),a.preferredDomain&&g.length>0&&(g=g.map(e=>({...e,score:e.domain===a.preferredDomain?e.score*1.15:e.score})),g.sort((e,t)=>t.score-e.score));let ee=Math.max(o,p?.size??0);g=g.slice(0,ee);let y=f?Ge(f,n):void 0,b=g.map(e=>{let t=N(e.name,n),r=F(e.name,n),i={name:e.name,domain:e.domain,description:e.shortDescription,inputSchema:t||{type:`object`},score:e.score,isActive:r,callCommand:Mn(e.name,t||{type:`object`})};r||(i.activationCommand=`activate_tools with names: ["${e.name}"]`);let a=Ke()[e.name];return a&&a.length>0&&(i.prerequisites=a.map(e=>({condition:e.condition,satisfied:e.check(u),fix:e.fix}))),i}),x=[],S=p?b.filter(e=>p.has(e.name)):[],C=(S.length>0?S:b).filter(e=>!e.isActive),w=(()=>{if(S.length>0||!Ze(i,s)||$e(i))return C;let e=C.filter(e=>e.domain!==`maintenance`);return e.length>0?e:C})();if(y?.kind===`preset`&&S.length>0){let e=1;w.length>0&&x.push({step:e++,action:`activate`,toolName:w.length===1?w[0].name:void 0,command:`activate_tools with names: [${w.map(e=>`"${e.name}"`).join(`, `)}]`,description:`Activate ${w.length} preset tool${w.length===1?``:`s`} for ${y.name}`});let t=b.filter(e=>e.name===`browser_launch`||e.name===`browser_attach`);for(let n of t)x.push({step:e++,action:`call`,toolName:n.name,command:n.name,exampleArgs:Z(n.inputSchema),description:n.description});for(let t of y.steps){let r=S.find(e=>e.name===t.toolName);x.push({step:e++,action:`call`,toolName:t.toolName,command:t.toolName,exampleArgs:Z(r?.inputSchema??N(t.toolName,n)??{type:`object`}),description:`${t.id}: ${t.description}`})}}else if(y?.kind===`workflow`){let e=b.find(e=>e.name===`run_extension_workflow`),t=1;e.isActive||x.push({step:t++,action:`activate`,toolName:e.name,command:`activate_tools with names: ["${e.name}"]`,description:`Activate workflow runner for ${y.name}`}),x.push({step:t,action:`call`,toolName:`run_extension_workflow`,command:`run_extension_workflow`,exampleArgs:{...Z(e.inputSchema),workflowId:y.id},description:`Execute routed workflow ${y.name}`})}else if(b.length>0&&b[0]?.isActive)x.push({step:1,action:`call`,toolName:b[0].name,command:b[0].name,exampleArgs:Z(b[0].inputSchema),description:`Call ${b[0].name}. Use describe_tool("${b[0].name}") only if you need the full schema.`});else if(w.length>0){let e=w[0];x.push({step:1,action:`activate`,toolName:w.length===1?e.name:void 0,command:`activate_tools with names: [${w.map(e=>`"${e.name}"`).join(`, `)}]`,description:`Activate ${w.length} recommended tool${w.length===1?``:`s`}`}),x.push({step:2,action:`call`,toolName:e.name,command:e.name,exampleArgs:Z(e.inputSchema),description:`Call ${e.name}. Use describe_tool("${e.name}") only if you need the full schema.`})}return{recommendations:b,nextActions:x,workflowHint:y?`${y.kind===`preset`?`Preset`:`Workflow`} ${y.name}: ${y.description}`:s?.hint,routeMatch:y,autoActivated:!1}}async function Fn(t,n){if(n)try{await t.server.sendToolListChanged()}catch(t){e.warn(`sendToolListChanged failed:`,t)}}async function In(t,n){await de();let r=k(t),i=[],a=[],o=[];for(let e of n){let n=P(e);if(r.has(n)){a.push(n);continue}let s=(await Te(t)).get(n);if(!s){o.push(n);continue}let c=t.extensionToolsByName.get(n);if(c)je(t,c,`activate_tools`);else{let e=t.registerSingleTool(s);t.activatedToolNames.add(n),t.activatedRegisteredTools.set(n,e);let r=D(n);r&&t.enabledDomains.add(r);let i=new Set([n]),a=Ee(t.handlerDeps,i);t.router.addHandlers(a)}i.push(n),r.add(n)}return await Fn(t,i.length>0),e.info(`activate_tools: activated ${i.length}, already_active ${a.length}, not_found ${o.length}`),{activated:i,alreadyActive:a,notFound:o,totalActive:r.size}}async function Ln(e,t){let n=t.names;if(typeof n==`string`&&n.trim().startsWith(`[`))try{let e=JSON.parse(n);Array.isArray(e)&&(n=e)}catch{}let{names:r,error:i}=He({names:n});if(i)return T(JSON.stringify({success:!1,error:i}));let a=await In(e,r);return T(JSON.stringify({success:!0,...a,hint:a.activated.length>0?`Tools activated. If they do not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke them.`:void 0}))}async function Rn(t,n){let{names:r,error:i}=He(n);if(i)return T(JSON.stringify({success:!1,error:i}));let a=[],o=[];for(let n of r){let r=P(n);if(!t.activatedToolNames.has(r)){o.push(r);continue}let i=t.activatedRegisteredTools.get(r);if(i&&!t.extensionToolsByName.has(r))try{i.remove()}catch(t){e.warn(`Failed to remove activated tool "${r}":`,t)}let s=t.extensionToolsByName.get(r);s?Ae(t,s,{onRemoveError:t=>{e.warn(`Failed to remove activated tool "${r}":`,t)}}):(t.router.removeHandler(r),t.activatedToolNames.delete(r),t.activatedRegisteredTools.delete(r)),a.push(r)}return await Fn(t,a.length>0),e.info(`deactivate_tools: deactivated ${a.length}, not_activated ${o.length}`),T(JSON.stringify({success:!0,deactivated:a,notActivated:o,hint:`Deactivated tools are no longer available. Search again to find alternatives.`}))}async function zn(e,t){let n=t.query,r=t.top_k??10,i=t.auto_activate??!0,a=performance.now(),o=await j(e),s=k(e),c=Se(e),l=await o.search(n,r,s,c,xe(e)),u=Math.round(performance.now()-a);if(e.mcpLog.info(`jshookmcp`,{event:`search_executed`,query:n,resultCount:l.length,latencyMs:u}),i&&r>0){let t=l.filter(e=>!e.isActive);if(t.length>0){let n=new Set,r=[];for(let i of t)i.domain&&!e.enabledDomains.has(i.domain)?n.add(i.domain):i.domain||r.push(i.name);let{handleActivateDomain:i}=await import(`./MCPServer.search.handlers.domain-BbS-6LnX.mjs`).then(e=>e.t);for(let t of n)try{await i(e,{domain:t,ttlMinutes:_})}catch{}let a=new Set(n),o=t.filter(e=>!a.has(e.domain??``)).map(e=>e.name),s=[...new Set([...o,...r])];s.length>0&&await In(e,s)}}let d=i?k(e):s,f=l[0],p=f?Nn(f.name,e):null,m=p?Z(p.inputSchema):void 0,h=[];f&&(d.has(f.name)?h.push({step:1,action:`call`,command:f.name,exampleArgs:m,description:`Call ${f.name} directly. Use describe_tool("${f.name}") only if you need the full schema.`}):(h.push({step:1,action:`activate_tools`,command:`activate_tools({ names: ["${f.name}"] })`,description:`Activate ${f.name} before calling.`}),h.push({step:2,action:`call`,command:f.name,exampleArgs:m,description:`Call ${f.name}. Use describe_tool("${f.name}") only if you need the full schema.`})));let g=l.length<3?` Few results — try distilling your query to key concepts (e.g. "hook fetch" instead of "how to intercept fetch requests").`:``,v=l.map(e=>({...e,isActive:d.has(e.name)?!0:e.isActive})),ee={query:n,resultCount:l.length,results:v,nextActions:h,hint:`For guided tool discovery with workflow detection, use route_tool instead. Tools are auto-activated. If a tool does not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke it directly.`+g,autoActivated:i&&l.some(e=>!e.isActive&&d.has(e.name))},y=JSON.stringify(ee,null,2),b=o.getSearchQualityTracker().getEnhancementSuggestions(n,l.length,l[0]?.score??0);return b&&b.length>0&&(y+=`\n\n---\n**Search Enhancement Suggestions:**\n${b.map(e=>`- ${e}`).join(`
6
- `)}`),T(y)}function Bn(e){return{...e,recommendations:e.recommendations.map(e=>({...e,callCommand:e.callCommand??Mn(e.name,e.inputSchema)}))}}async function Vn(e,t){let n=t.task,r=t.context;if(typeof r==`string`&&r.trim().startsWith(`{`))try{let e=JSON.parse(r);e&&typeof e==`object`&&!Array.isArray(e)&&(r=e)}catch{}let i=r;if(!n||typeof n!=`string`)return T(JSON.stringify({success:!1,error:`task must be a non-empty string`}));let a=await j(e),o=i?.autoActivate===!0,s=Bn(await Pn({task:n,context:i},e,a));if(o){let t=s.recommendations.filter(e=>!e.isActive);if(t.length>0){let r=new Set,o=[];for(let n of t)n.domain&&!e.enabledDomains.has(n.domain)?r.add(n.domain):n.domain||o.push(n.name);let c=!1;for(let t of r)try{await A(e,{domain:t,ttlMinutes:_}),c=!0}catch{}let l=t.filter(e=>!r.has(e.domain??``)).map(e=>e.name);(l.length>0||o.length>0)&&(await In(e,[...new Set([...l,...o])])).activated.length>0&&(c=!0),c&&(s=Bn(await Pn({task:n,context:{...i,autoActivate:!1}},e,a)),s.autoActivated=!0,s.activatedNames=t.map(e=>e.name).filter(t=>e.activatedToolNames.has(t)),s.callToolHint=`Tools were auto-activated but may not appear in your tool list. Use call_tool({ name: "<tool_name>", args: {...} }) to invoke them directly.`)}}return T(JSON.stringify(s,null,2))}async function Hn(e,t){let n=t.name;if(!n||typeof n!=`string`)return T(JSON.stringify({success:!1,error:`name must be a non-empty string`}));let r=Nn(n,e);return T(r?JSON.stringify({success:!0,tool:r},null,2):JSON.stringify({success:!1,error:`Tool not found: ${n}`}))}function Un(e){return e.issues.map(e=>`${e.path.length>0?e.path.join(`.`):`(root)`}: ${e.message}`).join(`; `)}function Wn(e,t,n){if(!t||typeof t!=`object`)return n;let r=Tn(t);if(Object.keys(r).length===0)return n;try{return V.object(r).parse(n)}catch(t){throw t instanceof Et?Error(`Invalid arguments for "${e}": ${Un(t)}`,{cause:t}):t}}function Gn(e,t){return{wasAutoActivated:e,activatedTools:t}}function Kn(e,t){return!e?.content||!Array.isArray(e.content)?e:{...e,content:e.content.map(e=>{if(e.type!==`text`||!(`text`in e)||typeof e.text!=`string`)return e;try{let n=JSON.parse(e.text);return!n||typeof n!=`object`||Array.isArray(n)?e:{...e,text:JSON.stringify({...n,...t},null,2)}}catch{return e}})}}async function qn(t,n){let r=typeof n.name==`string`?n.name:``,i=Gn(!1,[]);if(!r)return T(JSON.stringify({success:!1,error:`name must be a non-empty string`,...i}));let a=P(r),o={},s=n.args??n.parameters??(typeof n.arguments==`string`?n.arguments:null);if(s&&typeof s==`object`&&!Array.isArray(s))o=s;else if(typeof s==`string`&&s.trim().length>0)try{let e=JSON.parse(s);e&&typeof e==`object`&&!Array.isArray(e)&&(o=e)}catch{}if(Object.keys(o).length===0&&!(`args`in n)&&!(`parameters`in n)&&!(`arguments`in n))for(let[e,t]of Object.entries(n))e!==`name`&&(o[e]=t);let c=i;if(!t.router.has(a))return T(JSON.stringify({success:!1,error:`Tool "${a}" is not currently active. Use activate_tools or activate_domain first, then call it directly.`,...c}));try{let e=Wn(a,N(a,t),o),n=await t.executeToolWithTracking(a,e);try{(await j(t)).recordToolCallFeedback(a,``)}catch{}return Kn(n,c)}catch(t){let n=t instanceof Error?t.message:String(t);return e.error(`call_tool: execution of "${a}" failed`,t),T(JSON.stringify({success:!1,error:`Tool "${a}" failed: ${n}`,...c}))}}async function Jn(e,t){await de();let n=M(e)?.getCoverageSummary(e)??{called:{},calledCount:0,uncataloguedCalls:[],uncataloguedCallCount:0,totalKnownTools:0,uncalled:[],uncalledCount:0};return{content:[{type:`text`,text:JSON.stringify({success:!0,...n},null,2)}]}}function Yn(e){return[{name:`search_tools`,description:we(e),inputSchema:{type:`object`,properties:{query:{type:`string`,description:`Before calling, distill your intent into 2-5 key concepts: what action, on what target, in which domain. Pass only those distilled keywords — not the original user request.`},top_k:{type:`number`,description:`Max results to return (default: 10, max: 30)`},auto_activate:{type:`boolean`,description:`Auto-activate found tools so they are immediately callable. Set false to only search without activating (default: true)`,default:!0}},required:[`query`]},handler:zn},{name:`route_tool`,description:`One-stop tool router: accepts a natural language task description, returns recommended tools and next actions. Automatically detects workflow patterns, recommends activation order, and provides example arguments. Use this instead of search_tools when you want guided tool discovery with actionable next steps.`,inputSchema:{type:`object`,properties:{task:{type:`string`,description:`Natural language description of the task you want to accomplish`},context:{type:`object`,description:`Optional context hints for routing`,properties:{preferredDomain:{type:`string`,description:`Domain preference (e.g., "browser", "network")`},autoActivate:{type:`boolean`,description:`Whether to auto-activate recommended tools (default: false)`},maxRecommendations:{type:`number`,description:`Maximum number of recommendations (default: 5)`}}}},required:[`task`]},handler:Vn},{name:`describe_tool`,description:`Get detailed information about a specific tool, including its input schema. Use this to see the exact parameters a tool expects before calling it.`,inputSchema:{type:`object`,properties:{name:{type:`string`,description:`Tool name to describe`}},required:[`name`]},handler:Hn},{name:`activate_tools`,description:`Dynamically register specific tools by name, regardless of current base tier. Use after search_tools to enable exactly the tools you need. In search-tier sessions this is usually enough; you do not need boost_profile just to use a few exact tools. Activated tools appear in the tool list immediately. If tools do not appear after activation, use call_tool to invoke them directly.`,inputSchema:{type:`object`,properties:{names:{anyOf:[{type:`array`,items:{type:`string`}},{type:`string`,description:`JSON stringified array for MCP clients that serialize arrays as strings`}],description:`Array of tool names to activate (from search_tools results). Also accepts a JSON stringified array for clients that serialize arrays as strings.`}},required:[`names`]},handler:Ln},{name:`deactivate_tools`,description:`Remove previously activated tools to free context. Only affects tools added via activate_tools, not base profile tools.`,inputSchema:{type:`object`,properties:{names:{anyOf:[{type:`array`,items:{type:`string`}},{type:`string`,description:`JSON stringified array`}],description:`Array of tool names to deactivate`}},required:[`names`]},handler:Rn},{name:`activate_domain`,description:`Activate all tools in a domain at once. Domains: ${[...be()].join(`, `)}. Use reload_extensions first to include external plugin/workflow domains.`,inputSchema:{type:`object`,properties:{domain:{type:`string`,description:`Domain name to activate (e.g. "debugger", "network")`},ttlMinutes:{type:`number`,description:`Auto-deactivate after N minutes (default: 30, set 0 for no expiry)`}},required:[`domain`]},handler:A},{name:`call_tool`,description:`Execute an already-active tool by name. Use this when activate_tools/activate_domain registered a tool but your client did not refresh its tool list. Does not auto-activate inactive tools.`,inputSchema:{type:`object`,properties:{name:{type:`string`,description:`The tool name to execute (from search_tools or describe_tool results)`},args:{type:`object`,description:`Arguments object to pass to the tool`,additionalProperties:!0},parameters:{type:`string`,description:`Alternative: JSON-serialized arguments string. Some MCP clients serialize the nested arguments as a single stringified-JSON field.`},arguments:{type:`string`,description:`Another alternative: MCP clients that stringify the entire arguments wrapper. Carries the same nested {name, args/parameters} payload as a JSON string.`}},required:[`name`]},handler:qn},{name:`coverage_report`,description:`Report which tools have been called in the current runtime and which known tools remain uncalled. Loads all domains first so the uncalled list reflects the full tool catalog, not just currently active tools.`,inputSchema:{type:`object`,properties:{}},handler:Jn}]}function Xn(t){let n=Yn(t);for(let r of n){let n=Tn(r.inputSchema);t.server.registerTool(r.name,{description:r.description,inputSchema:n},async(n,i)=>{try{let e=On(n,i),a=await r.handler(t,e);return M(t)?.recordToolCall(r.name,e),a}catch(t){return e.error(`${r.name} failed`,t),le(t)}}),t.metaToolsByName.set(r.name,{name:r.name,description:r.description.split(`
7
- `)[0]||r.description,inputSchema:r.inputSchema})}}function Q(e,t){return{contents:[{uri:e,mimeType:`application/json`,text:JSON.stringify(t,null,2)}]}}function Zn(e,t,n){return{contents:[{uri:e,mimeType:n,text:t}]}}function Qn(e){return e.getDomainInstance(`evidenceGraph`)}function $(e){return e.getDomainInstance(`instrumentationSessionManager`)}function $n(e){e.server.registerResource(`evidence_graph_json`,`jshook://evidence/graph`,{title:`Evidence Graph JSON`,description:`Serializable snapshot of the current reverse evidence graph.`,mimeType:`application/json`},async t=>{let n=Qn(e);return Q(t.toString(),n?n.exportJson():{version:1,nodes:[],edges:[],exportedAt:new Date().toISOString()})}),e.server.registerResource(`evidence_graph_markdown`,`jshook://evidence/graph.md`,{title:`Evidence Graph Markdown`,description:`Markdown report for the current reverse evidence graph.`,mimeType:`text/markdown`},async t=>{let n=Qn(e);return Zn(t.toString(),n?n.exportMarkdown():`# Reverse Evidence Graph Report
2
+ import{t as e}from"./rolldown-runtime-88NL7fhV.mjs";import{t}from"./logger-BGCcd-jJ.mjs";import{Aa as n,Ba as r,Ea as i,Fa as a,Ma as o,Na as s,Oa as c,Pa as l,Ra as u,Ta as d,aa as f,ai as p,ca as m,da as h,ga as g,ha as _,ia as v,ii as y,ja as b,ka as x,la as S,ni as C,oa as w,ri as T,sa as ee,ua as te,vi as ne,za as re}from"./constants-nvsLpSri.mjs";import{a as ie,i as ae,n as oe,r as se,t as ce}from"./artifactRetention-Bk6fW2uF.mjs";import{a as le,i as ue,t as de}from"./config-5ODJ3Aj0.mjs";import{a as fe,n as pe,r as E,t as me}from"./DetailedDataManager-Dgh402Gp.mjs";import{t as D}from"./ToolError-g3rjWzhx.mjs";import{_ as he,a as ge,c as _e,d as ve,f as ye,g as be,h as xe,i as Se,m as Ce,n as we,o as Te,p as O,r as Ee,s as De}from"./registry-7h8jJ9y9.mjs";import{t as Oe}from"./ToolHandlerMap-C40EmuLT.mjs";import{t as ke}from"./ProcessRegistry-C5W1Tkn9.mjs";import{r as k,t as Ae}from"./response-R8ghbZSb.mjs";import{n as je,r as Me,t as Ne}from"./ExtensionManager.tools-D3h818Xs.mjs";import{a as A,c as Pe,i as Fe,n as Ie,o as Le,r as j,s as Re}from"./MCPServer.search.helpers-DlassAew.mjs";import{n as M,r as ze,t as Be}from"./ServerRuntimeState-DGXNv8Ji.mjs";import{n as Ve,r as He,t as Ue}from"./MCPServer.activation.ttl-C2wOCMLV.mjs";import{t as We}from"./types-BzPBzmVB.mjs";import{_ as Ge,a as Ke,c as qe,d as Je,f as N,g as Ye,h as Xe,i as Ze,l as Qe,m as $e,n as et,o as tt,p as nt,r as rt,s as it,t as at,u as ot,v as st,y as ct}from"./ToolRouter.policy-Bgb3S8jc.mjs";import{n as lt,t as P}from"./MCPServer.search.validation-DnifPCCv.mjs";import{i as ut,r as dt}from"./HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs";import{n as ft}from"./EventBus-Cm-t-B65.mjs";import{n as pt,t as mt}from"./BrowserSessionCoordinator-Cdic8FsH.mjs";import{McpServer as ht,ResourceTemplate as gt}from"@modelcontextprotocol/sdk/server/mcp.js";import{CompleteRequestSchema as _t,ErrorCode as F,McpError as I,isJSONRPCErrorResponse as vt,isJSONRPCNotification as yt,isJSONRPCRequest as bt,isJSONRPCResultResponse as xt}from"@modelcontextprotocol/sdk/types.js";import{promises as L}from"fs";import{join as St}from"path";import{createHash as Ct}from"crypto";import{homedir as wt}from"node:os";import{appendFileSync as Tt,existsSync as R,mkdirSync as Et,readFileSync as Dt}from"node:fs";import{basename as Ot,dirname as z,isAbsolute as kt,join as B,relative as At,resolve as V}from"node:path";import{mkdir as jt,readFile as Mt,readdir as Nt,rename as Pt,writeFile as Ft}from"node:fs/promises";import{fileURLToPath as It,pathToFileURL as Lt}from"node:url";import{ZodError as Rt,z as H}from"zod";import{AsyncLocalStorage as zt}from"node:async_hooks";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 L.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 Ct(`md5`).update(e).digest(`hex`)}getCachePath(e){let t=this.generateKey(e);return St(this.config.dir,`${t}.json`)}async get(e){if(!this.config.enabled)return null;try{let n=this.getCachePath(e),r=await L.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 L.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 L.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 L.readdir(this.config.dir);await Promise.all(e.map(e=>L.unlink(St(this.config.dir,e)))),t.info(`Cache cleared`)}catch(e){if(e.code===`ENOENT`)return;t.error(`Failed to clear cache`,e)}}};const qt=new zt;function Jt(e){return Array.isArray(e)?e.find(e=>e.trim().length>0)?.trim()??null:typeof e==`string`&&e.trim().length>0?e.trim():null}function Yt(e){if(typeof e?.sessionId==`string`&&e.sessionId.trim().length>0)return e.sessionId.trim();let t=e?.requestInfo?.headers,n=t?Jt(t[`mcp-session-id`]??t[`Mcp-Session-Id`]):null;if(n)return n;let r=e?._meta;return typeof r!=`object`||!r||Array.isArray(r)?null:Jt(r.sessionId)}function Xt(e,t){return qt.run({sessionId:Yt(e),requestId:e?.requestId??null},t)}function Zt(){return qt.getStore()??null}var 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=Zt(),r={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}}:{}},i=(n?.requestId===null||n?.requestId===void 0?await this.mcpServer.server.createMessage(r):await this.mcpServer.server.createMessage(r,{relatedRequestId:n.requestId})).content;if(Array.isArray(i)){let e=i.filter(e=>e.type===`text`).map(e=>e.text);return e.length>0?e.join(``):null}return i&&typeof i==`object`&&`type`in i&&i.type===`text`?i.text:(t.warn(`sampling/createMessage returned non-text content`),null)}catch(e){return t.warn(`LLM sampling request failed:`,e),null}}},$t=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=Zt(),n=t?.requestId===null||t?.requestId===void 0?await this.mcpServer.server.elicitInput(e):await this.mcpServer.server.elicitInput(e,{relatedRequestId:t.requestId});return{action:n.action,content:n.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}}},en=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 D(`NOT_FOUND`,`Unknown tool: ${e}`,{toolName:e});return n(t)}};const tn=[`page_`,`console_`,`debugger_`,`network_`,`dom_`,`stealth_`,`framework_`,`indexeddb_`,`js_heap_`,`script_`,`captcha_`,`ai_hook_`,`instrumentation_`,`hook_preset_`,`ws_`,`evidence_`],nn=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`]),rn=new Set([`search_tools`,`route_tool`,`describe_tool`,`call_tool`,`activate_tools`,`deactivate_tools`,`activate_domain`]),an=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 on=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(nn.has(e))return this.contextSensitiveCache.set(e,!1),!1;let n=tn.some(t=>e.startsWith(t));return this.contextSensitiveCache.set(e,n),n}recordCall(e){return rn.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()&&!rn.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`]:an.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 sn=3e4;var cn=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>=sn?(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 sn}};const ln=/"_?offload"|detailId|_filePath/;var un=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 (${E(a)}) → detailId=${i}`),{_offload:{type:`detailId`,detailId:i,size:E(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=fe(s);e!==s&&(r[t]={...a,text:JSON.stringify(e,null,2)},i=!0);continue}if(ln.test(o))continue;if(pe.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:E(o.length),mimeType:o.match(pe)?.[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:E(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&&pe.test(n._offload.mimeType?`data:${n._offload.mimeType};base64,`:``)&&t.debug(`[Offloader] Skipping async write for already-placeholdered entry ${e}`)}catch{}}return n}};function dn(){let e=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),n=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase(),r=be(process.env.MCP_TOOL_DOMAINS);if(r&&r.length>0){let e=Ce(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=xe(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 fn(e){return(typeof e==`object`||typeof e==`function`)&&e!==null&&typeof e.then==`function`}function pn(e){let t=new Set;for(let n of e){let e=O(n.name);e&&t.add(e)}return t}function U(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 D(`RUNTIME`,`${r}: circular initialization detected for domain "${n}"`,{details:a});t.info(`Lazy-initializing ${r} for domain "${n}"`),l++;try{let e=i();return fn(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 fn(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 D(`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 fn(o)?p(i):u(o,i)}})}const mn=new Set([`http://127.0.0.1`,`http://localhost`,`http://[::1]`]);function hn(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 mn.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 gn(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 _n=(()=>{let e=parseInt(process.env.MCP_MAX_BODY_BYTES??``,10);return Number.isFinite(e)&&e>0?e:10*1024*1024})();function vn(e,t,n=_n){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 yn=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_WINDOW_MS??``,10);return Number.isFinite(e)&&e>0?e:6e4})(),bn=(()=>{let e=parseInt(process.env.MCP_RATE_LIMIT_MAX??``,10);return Number.isFinite(e)&&e>0?e:60})(),W=new Map,xn=i,Sn=d;let Cn=Date.now();function wn(e){if(e-Cn<Sn)return;Cn=e;let t=e-yn;for(let[e,n]of W)n.timestamps=n.timestamps.filter(e=>e>t),n.timestamps.length===0&&W.delete(e)}function Tn(){if(W.size<=xn)return;let e=Math.ceil(xn*.1),t=0;for(let n of W.keys()){if(t>=e)break;W.delete(n),t++}}function En(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 Dn(e,t,n=!1){if([`0`,`false`].includes((process.env.MCP_RATE_LIMIT_ENABLED??``).toLowerCase()))return!0;let r=n?bn*3:bn,i=Date.now();wn(i),Tn();let a=En(e),o=W.get(a);o||(o={timestamps:[]},W.set(a,o));let s=i-yn;if(o.timestamps=o.timestamps.filter(e=>e>s),o.timestamps.length>=r){let e=Math.ceil(yn/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 On(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 kn(e){return typeof e==`string`?`s:${e}`:`n:${String(e)}`}var An=class{options;onclose;onerror;onmessage;sessionId;started=!1;sessions=new Map;requestRoutes=new Map;sessionOriginalToInternal=new Map;requestSequence=0;constructor(e={}){this.options=e}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();for(let t of e)this.notifySessionClosed(t.sessionId);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=xt(e)||vt(e)?{...e,id:r.originalId}:e,a=t?.relatedRequestId===void 0?t:{...t,relatedRequestId:r.originalId};await r.transport.send(i,a),(xt(e)||vt(e))&&this.releaseRequestRoute(n,r);return}}let r=[...this.sessions.values()];if(r.length!==0){if(yt(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=On(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(bt(n)){let r=`http:${e}:${++this.requestSequence}`;this.requestRoutes.set(r,{sessionId:e,originalId:n.id,transport:t});let i=this.sessionOriginalToInternal.get(e);i||(i=new Map,this.sessionOriginalToInternal.set(e,i)),i.set(kn(n.id),r);let a=typeof n.params==`object`&&n.params!==null?n.params:{},o=typeof a._meta==`object`&&a._meta!==null?a._meta:{};return{...n,id:r,params:{...a,_meta:{...o,sessionId:e}}}}if(yt(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(kn(r));if(i)return{...n,params:{...t,requestId:i}}}}return n}resolveRouteKey(e,t){return t?.relatedRequestId===void 0?xt(e)||vt(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(kn(t.originalId)),n.size===0&&this.sessionOriginalToInternal.delete(t.sessionId))}dropSession(e){let n=this.sessions.delete(e);this.sessionOriginalToInternal.delete(e);for(let[t,n]of this.requestRoutes)n.sessionId===e&&this.requestRoutes.delete(t);n&&this.notifySessionClosed(e),t.info(`[http] MCP session closed: ${e}`)}notifySessionClosed(e){try{this.options.onSessionClosed?.(e)}catch(n){t.warn(`[http] session cleanup failed for ${e}: ${n instanceof Error?n.message:String(n)}`)}}};async function jn(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...`),Pn(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...`),Pn(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 Mn(e){let r=parseInt(process.env.MCP_PORT??`3000`,10),i=process.env.MCP_HOST??`127.0.0.1`,a=new An({onSessionClosed:t=>{e.getDomainInstance(`browserSessionCoordinator`)?.dropSession(t)}});await e.server.connect(a),e.httpServer=Bt((t,n)=>{let i=new URL(t.url??`/`,`http://localhost:${r}`);if(i.pathname===`/health`&&t.method===`GET`){Nn(e,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(!hn(t,n))return;let o=gn(t,n);if(o&&Dn(t,n,o)){if(t.method===`GET`||t.method===`DELETE`){a.handleRequest(t,n);return}if(t.method===`POST`){vn(t,n).then(e=>a.handleRequest(t,n,e)).catch(()=>{});return}n.writeHead(405,{"Content-Type":`text/plain`}),n.end(`Method Not Allowed`)}});let s=e.httpServer;if(!s)throw Error(`HTTP server initialization failed`);s.requestTimeout=o,s.headersTimeout=n,s.keepAliveTimeout=b,s.on(`connection`,t=>{e.httpSockets.add(t),t.on(`close`,()=>e.httpSockets.delete(t))}),await new Promise((e,n)=>{s.listen(r,i,()=>{t.success(`MCP Streamable HTTP server listening on http://${i}:${r}/mcp`),e()}),s.on(`error`,n)})}function Nn(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 Pn(e){return e.shutdownStarted?e.shutdownPromise??Promise.resolve():(e.shutdownStarted=!0,e.shutdownPromise=(async()=>{let n=typeof e.getDomainInstance==`function`?e.getDomainInstance.bind(e):null;if(n){let e=n(`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 r=typeof e.getDomainInstance==`function`?e.getDomainInstance(`activationController`):e.activationController??void 0;if(r&&typeof r.dispose==`function`)try{r.dispose()}catch(e){t.warn(`activationController cleanup failed:`,e)}if(e.httpServer){let t=e.httpServer,n=new Promise(e=>t.close(()=>e())),r=setTimeout(()=>{for(let t of e.httpSockets)t.destroy()},x);await n,clearTimeout(r),e.httpSockets.clear(),e.httpServer=void 0}let i=[[`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 i)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 ke.terminateAll()}catch(e){t.warn(`ProcessRegistry cleanup failed:`,e)}t.success(`MCP server closed`)})(),e.shutdownPromise)}const Fn={debug:0,info:1,warning:2,error:3},In={debug:`debug`,info:`info`,warning:`warning`,error:`error`};var Ln=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{Et(e,{recursive:!0});let t=new Date().toISOString().replace(/[:.]/g,`-`);this.filePath=B(e,`jshookmcp-${t}.log`)}catch{}}getFilePath(){return this.filePath}log(e,t,n){!this.enabled||!this.server||Fn[e]<Fn[this.minLevel]||(this.server.server.sendLoggingMessage({level:In[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
+ `;Tt(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)}},G=e({handleActivateDomain:()=>K});async function K(e,n){let r=typeof n.domain==`string`?n.domain:``;if(!r)return k(JSON.stringify({success:!1,error:`domain must be a non-empty string`}));let i=new Set(ge());for(let t of e.extensionToolsByName.values())i.add(t.domain);if(!i.has(r))return k(JSON.stringify({success:!1,error:`Unknown domain "${r}". Valid: ${[...i].join(`, `)}`}));await Ee(r);let a=typeof n.ttlMinutes==`number`?n.ttlMinutes:m,o=[...Ce([r]),...[...e.extensionToolsByName.values()].filter(e=>e.domain===r).map(e=>e.tool)],s=j(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)Ne(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=Oe(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})}He(e,r,a,c),M(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}),k(JSON.stringify({success:!0,domain:r,activated:c.length,activatedTools:c,totalDomainTools:o.length,ttlMinutes:a>0?a:`no expiry`,hint:c.length>0?`Tools activated. If they do not appear in your tool list, use call_tool({ name: "<tool>", args: {...} }) to invoke them.`:void 0}))}const Rn=[{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:_}],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:_}],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:g}],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:g}],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:g}],boostDomains:[`cross-domain`],priority:14}];var zn=class{conditions;constructor(e=[]){this.conditions=[...Rn,...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}},Bn=class{callHistory=[];maxHistory;confidenceThreshold;decayFactor;transitions=new Map;transitions2=new Map;maxSecondOrderKeys;constructor(e={}){this.maxHistory=e.maxHistory??y,this.confidenceThreshold=e.confidenceThreshold??C,this.decayFactor=e.decayFactor??T,this.maxSecondOrderKeys=e.maxSecondOrderKeys??p}recordCall(e){let t=this.callHistory.length>0?this.callHistory[this.callHistory.length-1]:null,n=this.callHistory.length>1?this.callHistory[this.callHistory.length-2]:null;if(this.callHistory.push(e),this.callHistory.length>this.maxHistory&&this.callHistory.splice(0,this.callHistory.length-this.maxHistory),this.applyDecay(this.transitions),this.applyDecay(this.transitions2),t&&this.bumpTransition(this.transitions,t,e),n&&t){let r=`${n}\u0001${t}`;this.bumpTransition(this.transitions2,r,e),this.enforceSecondOrderCap()}}predictNext(e){let t=this.callHistory.length>1?this.callHistory[this.callHistory.length-2]:null;if(t){let n=`${t}\u0001${e}`,r=this.transitions2.get(n),i=this.pickPredictions(r);if(i.length>0)return i}return this.pickPredictions(this.transitions.get(e))}predictNextDomains(e,t){let n=this.predictNext(e),r=new Set;for(let e of n){let n=t(e);n&&r.add(n)}return[...r]}get historyLength(){return this.callHistory.length}get transitionCount(){return this.transitions.size}get secondOrderTransitionCount(){return this.transitions2.size}reset(){this.callHistory.length=0,this.transitions.clear(),this.transitions2.clear()}applyDecay(e){if(!(this.decayFactor>=1))for(let[,t]of e)for(let[e,n]of t){let r=n*this.decayFactor;r<.01?t.delete(e):t.set(e,r)}}bumpTransition(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r)),r.set(n,(r.get(n)??0)+1)}enforceSecondOrderCap(){if(this.transitions2.size<=this.maxSecondOrderKeys)return;let e=this.transitions2.size-this.maxSecondOrderKeys,t=this.transitions2.keys();for(let n=0;n<e;n++){let{value:e,done:n}=t.next();if(n||!e)break;this.transitions2.delete(e)}}pickPredictions(e){if(!e||e.size===0)return[];let t=0;for(let n of e.values())t+=n;if(t===0)return[];let n=[];for(let[r,i]of e){let e=i/t;e>=this.confidenceThreshold&&n.push({tool:r,confidence:e})}return n.sort((e,t)=>t.confidence-e.confidence),n.map(e=>e.tool)}},Vn=class{lastActivity=new Map;baseDomains;autoActivatedDomains=new Set;autoInactivityMs;manualInactivityMs;checkIntervalMs;checkTimer=null;eventBus;onPrune;constructor(e,t,n,r={}){this.eventBus=e,this.baseDomains=t,this.onPrune=n,this.autoInactivityMs=r.autoActivatedInactivityMs??S,this.manualInactivityMs=r.manualActivatedInactivityMs??h,this.checkIntervalMs=r.checkIntervalMs??te,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 Hn=[{eventPattern:`debugger:breakpoint_hit`,targetDomains:[`debugger`],threshold:1,windowMs:v,priority:10},{eventPattern:`browser:navigated`,targetDomains:[`browser`],threshold:1,windowMs:v,priority:10},{eventPattern:`memory:scan_completed`,targetDomains:[`memory`],threshold:1,windowMs:v,priority:10},{eventPattern:`network:intercept_started`,targetDomains:[`network`,`instrumentation`],threshold:1,windowMs:v,priority:9},{eventPattern:`v8:heap_captured`,targetDomains:[`v8-inspector`],threshold:1,windowMs:v,priority:10},{eventPattern:`tls:keylog_started`,targetDomains:[`boringssl-inspector`],threshold:1,windowMs:v,priority:10},{eventPattern:`skia:scene_captured`,targetDomains:[`canvas`],threshold:1,windowMs:v,priority:10},{eventPattern:`frida:attached`,targetDomains:[`binary-instrument`],threshold:1,windowMs:v,priority:10},{eventPattern:`adb:device_connected`,targetDomains:[`adb-bridge`],threshold:1,windowMs:v,priority:10},{eventPattern:`mojo:message_captured`,targetDomains:[`mojo-ipc`],threshold:1,windowMs:v,priority:10},{eventPattern:`syscall:trace_started`,targetDomains:[`syscall-hook`],threshold:1,windowMs:v,priority:10},{eventPattern:`protocol:pattern_detected`,targetDomains:[`protocol-analysis`],threshold:1,windowMs:v,priority:10}];var Un=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??w,this.maxEventHistory=ee,this.compoundEvalEvery=Math.max(1,f);let i=r.boostRules??[];this.boostRules=[...Hn,...i].toSorted((e,t)=>t.priority-e.priority),this.compoundEngine=new zn,this.predictiveBooster=new Bn;let a=new Set(ye(n.baseTier));this.autoPruner=new Vn(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 K(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 Wn=new Set([`true`,`1`,`yes`,`on`]),Gn=new Set([`false`,`0`,`no`,`off`]);function Kn(e){if(typeof e!=`string`)return e;let t=e.trim().toLowerCase();return Wn.has(t)?!0:Gn.has(t)?!1:e}function qn(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 q(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=>q(e)),r=H.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=H.enum(t)}else{let t=H.string();typeof e.pattern==`string`&&(t=t.regex(new RegExp(e.pattern))),r=t}break;case`number`:case`integer`:{let n=H.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=H.preprocess(qn,n);break}case`boolean`:r=H.preprocess(Kn,H.boolean());break;case`array`:r=e.items&&typeof e.items==`object`?H.array(q(e.items)):H.array(H.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=q(i);t[r]=n.has(r)?e:e.optional()}r=H.object(t)}else r=H.record(H.string(),H.unknown());break;default:r=H.unknown()}return n&&(r=r.describe(n)),r}function Jn(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=q(i&&typeof i==`object`?i:{});r[e]=n.has(e)?t:t.optional()}return r}function Yn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Xn(e){let t=e._meta;return Yn(t)?t:null}function Zn(e,t){let n={...e},r={},i=Xn(e);i&&Object.assign(r,i),Yn(t?._meta)&&Object.assign(r,t?._meta);let a=Yt(t);return a&&(r.sessionId=a),Object.keys(r).length>0&&(n._meta=r),n}function Qn(e){switch(e){case`VALIDATION`:return F.InvalidParams;case`NOT_FOUND`:return-32002;case`TIMEOUT`:return F.RequestTimeout;case`CONNECTION`:return F.ConnectionClosed;case`PREREQUISITE`:case`PERMISSION`:return F.InvalidRequest;default:return F.InternalError}}function $n(e,n){if(n instanceof Rt)throw t.error(`Tool validation failed: ${e}`,n),new I(F.InvalidParams,`Validation Error in ${e}: ${n.message}`);if(n instanceof I)throw n;if(n instanceof D){t.error(`Tool execution failed [${n.code}]: ${e} - ${n.message}`);let r=n.details?`\nDetails: ${JSON.stringify(n.details)}`:``;throw new I(Qn(n.code),`[${n.code}] ${n.message}${r}`)}throw t.error(`Tool execution failed: ${e}`,n),new I(F.InternalError,`Execution Failed in ${e}: ${n instanceof Error?n.message:String(n)}`)}function er(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]=er(i)}t.properties=e}if(t.items&&typeof t.items==`object`){let{description:e,...n}=t.items;t.items=er(n)}return t.additionalProperties&&typeof t.additionalProperties==`object`&&!Array.isArray(t.additionalProperties)&&(t.additionalProperties=er(t.additionalProperties)),t}function tr(e,t){let n=t;n.autocompleteHandlers&&e.toolAutocompleteHandlers.set(t.name,n.autocompleteHandlers);let r=c&&t.inputSchema?er(t.inputSchema):t.inputSchema,i=r&&typeof r==`object`?Jn(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)=>Xt(r,async()=>{try{let i=Zn(n,r);return await e.executeToolWithTracking(t.name,i)}catch(e){return $n(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)=>Xt(r,async()=>{try{let n=Zn({},r);return await e.executeToolWithTracking(t.name,n)}catch(e){return $n(t.name,e)}}));if(n.execution){let r=e.server.registeredTools;r&&r[t.name]&&(r[t.name].execution=n.execution)}return o}function nr(e){let t=e;for(;;){if(R(B(t,`package.json`)))return t;let e=z(t);if(e===t)break;t=e}return V(e,`..`,`..`,`..`,`..`)}const rr=nr(It(new URL(`.`,import.meta.url))),ir=[B(rr,`plugins`)],ar=[B(rr,`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=rr){let n=e.map(e=>kt(e)?e:V(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 or(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 sr(e,t){let n=e.trim();if(!n||n===`*`)return!0;if(n.startsWith(`>=`)){let e=or(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=or(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=or(t,e);return a!==null&&a>=0&&r[0]===i[0]&&r[1]===i[1]}let r=or(t,n);return r!==null&&r===0}async function cr(e){let t=await Mt(e);return Ht(`sha256`).update(t).digest(`hex`)}function lr(e){return e.trim().toLowerCase().replace(/^0x/,``)}function ur(e){return[`1`,`true`].includes(e.toLowerCase())}function dr(){let e=process.env.MCP_PLUGIN_SIGNATURE_REQUIRED;return e===void 0||e.trim()===``?process.env.NODE_ENV===`production`:ur(e)}function fr(){let e=process.env.MCP_PLUGIN_STRICT_LOAD;return e===void 0||e.trim()===``?dr():ur(e)||dr()}function pr(e){let t=e?.trim();return t?new Set(t.split(`,`).map(e=>lr(e)).filter(e=>e.length>0)):new Set}async function mr(e,t){let n=[];return sr(e.compatibleCoreRange,t)||n.push(`Plugin ${e.id} incompatible with core ${t}; requires ${e.compatibleCoreRange}`),{ok:n.length===0,errors:n,warnings:[]}}function hr(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 gr(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 _r(e){return e.endsWith(`.js`)||e.endsWith(`.mjs`)||e.endsWith(`.cjs`)}function vr(e){return e.endsWith(`.ts`)||e.endsWith(`.mts`)||e.endsWith(`.cts`)}async function yr(e,t){let n=new Set;for(let r of e)try{await xr(r,t,n)}catch{continue}return[...n].toSorted((e,t)=>e.localeCompare(t))}const br=new Set([`node_modules`,`.git`,`.pnpm`]);async function xr(e,t,n){let r=[e];for(;r.length>0;){let e=r.pop();if(!e)continue;let i=await Nt(e,{withFileTypes:!0});for(let a of i){let i=V(e,a.name);if(a.isDirectory()){br.has(a.name)||r.push(i);continue}a.isFile()&&t(Ot(i))&&n.add(i)}}}function Sr(e,t){let n=e.replace(/\\/g,`/`).replace(/\/+/g,`/`).replace(/^\/+|\/+$/g,``).toLowerCase(),r=At(e,z(t)).replace(/^[/\\]+/,``).replace(/\\/g,`/`).replace(/\/+/g,`/`).replace(/^\/+|\/+$/g,``).toLowerCase();return!r||r===`dist`?`${n}::`:`${n}::${r.endsWith(`/dist`)?r.slice(0,-5):r}`}function Cr(e){return e.isJs?0:e.isTs?1:2}function wr(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 Tr(e,t){let n=[];for(let[r,i]of e.entries()){let e=await yr([i],e=>e===We);for(let a of e){let e;try{e=JSON.parse(await Mt(a,`utf8`))}catch{continue}if(!wr(e,t))continue;let o=e.source.entry.trim();if(!o)continue;let s=V(z(a),o);R(s)&&n.push({file:s,key:Sr(i,s),isJs:_r(s),isTs:vr(s),rootIndex:r,priority:0})}}return n}function Er(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=Cr(e),c=Cr(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 Dr(e){let t=await Tr(e,`plugin`);for(let[n,r]of e.entries()){let e=await yr([r],e=>e===`manifest.js`||e===`manifest.ts`);for(let i of e)t.push({file:i,key:Sr(r,i),isJs:_r(i),isTs:vr(i),rootIndex:n,priority:1})}return Er(t)}async function Or(e){let t=await Tr(e,`workflow`);for(let[n,r]of e.entries()){let e=await yr([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:Sr(r,i),isJs:_r(i),isTs:vr(i),rootIndex:n,priority:1})}return Er(t)}function kr(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 Ar(e,n){let r=new URL(Lt(e).href);return r.searchParams.set(`reloadTs`,String(Date.now())),t.debug(`[extensions] Loading fresh ${n} module: ${e}`),r.href}async function jr(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{Me(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)Ue(e,t);return e.extensionToolsByName.clear(),e.extensionPluginsById.clear(),e.extensionPluginRuntimeById.clear(),e.extensionWorkflowsById.clear(),e.extensionWorkflowRuntimeById.clear(),n}function Mr(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:je(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 Nr=e({ensureWorkflowsLoaded:()=>Kr,listExtensions:()=>Pr,reloadExtensions:()=>Gr});function Pr(e){return Mr(e,Y(J(process.env.MCP_PLUGIN_ROOTS,ir)),Y(J(process.env.MCP_WORKFLOW_ROOTS,ar)))}function Fr(e){try{let t=Dt(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 Ir(e){return e?.trim()||void 0}function Lr(e,t,n){let r=B(e,`meta.yaml`);return R(r)?Fr(r):(n.push(`Plugin "${t}" is missing meta.yaml; outward metadata now lives there.`),{})}function Rr(e){return{name:Ir(e.name),description:Ir(e.description),author:Ir(e.author),source_repo:Ir(e.source_repo)}}function zr(e){let t=e;for(;;){if(R(B(t,`.jshook-install.json`)))return t;let e=z(t);if(e===t)return null;t=e}}function Br(e){let t=z(e);return zr(t)||(Ot(t).toLowerCase()===`dist`?z(t):t)}let Vr=Promise.resolve();const Hr=new WeakSet,Ur=`[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 Wr(e){let t=Vr,n;Vr=new Promise(e=>{n=e}),await t;try{return await e()}finally{n()}}async function Gr(e){return Wr(()=>Zr(e))}async function Kr(e){e.extensionWorkflowRuntimeById.size>0||Hr.has(e)||await Wr(async()=>{if(e.extensionWorkflowRuntimeById.size>0||Hr.has(e))return;Hr.add(e);let n=[],r=[],i=Y(J(process.env.MCP_PLUGIN_ROOTS,ir)),a=Y(J(process.env.MCP_WORKFLOW_ROOTS,ar));await Xr(e,i,n,r),await qr(e,await Or(a),n,r);for(let e of n)t.warn(`[extensions] ${e}`);for(let e of r)t.error(`[extensions] ${e}`)})}async function qr(e,t,n,r){for(let i of t)try{let t=await import(Ar(i,`workflow`)),r=t.default??t;if(!gr(r)){n.push(`Skip workflow file without valid WorkflowContract: ${i}`);continue}Jr(e,r,i,n)}catch(e){r.push(`Failed to import workflow file ${i}: ${String(e)}`)}}function Jr(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 Yr(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 Xr(e,n,r,i){let a=pr(process.env.MCP_PLUGIN_ALLOWED_DIGESTS);if(fr()&&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(Ur);let o=await Dr(n),s=e.config?.mcp?.version??`0.0.0`;for(let t of o){let n;try{if(n=lr(await cr(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(Ar(t,`plugin`)),n=e.default??e;if(!hr(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=Lr(Br(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 mr(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(!gr(n)){r.push(`Skip invalid workflow contribution from plugin "${o.id}" in ${t}`);continue}Jr(e,n,`${t}#workflow:${n.id}`,r)&&l.push(n.id)}let d=o.tools.map(e=>e.name);e.extensionPluginsById.set(o.id,Yr(o,Rr(c),t,d,l))}}async function Zr(e){let n=[],r=[],i=await jr(e),a=Y(J(process.env.MCP_PLUGIN_ROOTS,ir)),o=Y(J(process.env.MCP_WORKFLOW_ROOTS,ar)),s=pr(process.env.MCP_PLUGIN_ALLOWED_DIGESTS),c=0;if(fr()&&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 qr(e,await Or(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(),{...Mr(e,a,o),addedTools:0,autoActivatedTools:[],removedTools:i,warnings:n,errors:r}}s.size===0&&t.warn(Ur);let l=new Set(ve.map(e=>e.name)),u=await Dr(a),d=e.config?.mcp?.version??`0.0.0`;for(let i of u){let a;try{if(a=lr(await cr(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(Ar(i,`plugin`)),t=e.default??e;if(!hr(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=Br(i),f=Lr(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 mr(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 kr(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),je(e.baseTier,s)&&Ne(e,s,`reload`)&&c++}}catch(n){for(let n of b.toReversed())try{Me(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(!gr(t)){n.push(`Skip invalid workflow contribution from plugin "${o.id}" in ${i}`);continue}Jr(e,t,`${i}#workflow:${t.id}`,n)&&x.push(t.id)}let C=Yr(o,Rr(f),i,y,x);e.extensionPluginsById.set(C.id,C)}if(await qr(e,await Or(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(),{...Mr(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 Qr(e,t){return`call_tool({ name: "${e}", args: ${JSON.stringify(Z(t))} })`}function $r(e,t){let n=P(e),r=N(n,t);return r?{name:n,description:ot(n,t),inputSchema:r}:null}async function ei(e,n,r){let{task:i,context:a={}}=e,o=a.maxRecommendations||5;t.info(`[ToolRouter] Routing request`,{task:i,context:a}),await Kr(n);let s=Xe(i),c=j(n),l=Re(n),u=await Qe(n),d=qe(n),f=ct(i,n),p=null,m=await r.search(i,o*2,c,l,Fe(n)),h=!f&&!s?$e(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:nt(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=at(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=Ze(f,n);g=[e,...m.filter(t=>t.name!==e.name)]}else if(s){let e=st(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:nt(t,n)})),a=new Set(t),o=m.filter(e=>!a.has(e.name));g=[...r,...o]}else if(i&&!Ye(i,s)&&!Ge(i)){let e=rt(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=it(_,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?et(f,n):void 0,x=g.map(e=>{let t=N(e.name,n),r=nt(e.name,n),i={name:e.name,domain:e.domain,description:e.shortDescription,inputSchema:t||{type:`object`},score:e.score,isActive:r,callCommand:Qr(e.name,t||{type:`object`})};r||(i.activationCommand=`activate_tools with names: ["${e.name}"]`);let a=tt()[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||!Ye(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??N(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 ti=e({activateToolNames:()=>Q,handleActivateTools:()=>ri,handleDeactivateTools:()=>ii});async function ni(e,n){if(n)try{await e.server.sendToolListChanged()}catch(e){t.warn(`sendToolListChanged failed:`,e)}}async function Q(e,n){await we();let r=j(e),i=[],a=[],o=[];for(let t of n){let n=P(t);if(r.has(n)){a.push(n);continue}let s=(await Le(e)).get(n);if(!s){o.push(n);continue}let c=e.extensionToolsByName.get(n);if(c)Ne(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=Oe(e.handlerDeps,i);e.router.addHandlers(a)}i.push(n),r.add(n)}return await ni(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 ri(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}=lt({names:n});if(i)return k(JSON.stringify({success:!1,error:i}));let a=await Q(e,r);return k(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 ii(e,n){let{names:r,error:i}=lt(n);if(i)return k(JSON.stringify({success:!1,error:i}));let a=[],o=[];for(let n of r){let r=P(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?Me(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 ni(e,a.length>0),t.info(`deactivate_tools: deactivated ${a.length}, not_activated ${o.length}`),k(JSON.stringify({success:!0,deactivated:a,notActivated:o,hint:`Deactivated tools are no longer available. Search again to find alternatives.`}))}async function ai(e,t){let n=t.query,r=t.top_k??10,i=t.auto_activate??!0,a=performance.now(),o=await A(e),s=j(e),c=Re(e),l=await o.search(n,r,s,c,Fe(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&&ne){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(()=>G);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=[...ge()].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(()=>G);for(let n of i)try{await t(e,{domain:n,ttlMinutes:m})}catch{}let a=j(e),s=Re(e),c=await o.search(n,r,a,s,Fe(e));c.length>0&&(l=c)}}}let d=i?j(e):s,f=l[0],p=f?$r(f.name,e):null,h=p?Z(p.inputSchema):void 0,g=[];f&&(d.has(f.name)?g.push({step:1,action:`call`,command:f.name,exampleArgs:h,description:`Call ${f.name} directly. Use describe_tool("${f.name}") only if you need the full schema.`}):(g.push({step:1,action:`activate_tools`,command:`activate_tools({ names: ["${f.name}"] })`,description:`Activate ${f.name} before calling.`}),g.push({step:2,action:`call`,command:f.name,exampleArgs:h,description:`Call ${f.name}. Use describe_tool("${f.name}") only if you need the full schema.`})));let _=l.length<3?` Few results — try distilling your query to key concepts (e.g. "hook fetch" instead of "how to intercept fetch requests").`:``,v=l.map(e=>({...e,isActive:d.has(e.name)?!0:e.isActive})),y={query:n,resultCount:l.length,results:v,nextActions:g,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.`+_,autoActivated:i&&l.some(e=>!e.isActive&&d.has(e.name))},b=JSON.stringify(y,null,2),x=o.getSearchQualityTracker().getEnhancementSuggestions(n,l.length,l[0]?.score??0);return x&&x.length>0&&(b+=`\n\n---\n**Search Enhancement Suggestions:**\n${x.map(e=>`- ${e}`).join(`
6
+ `)}`),k(b)}function oi(e){return{...e,recommendations:e.recommendations.map(e=>({...e,callCommand:e.callCommand??Qr(e.name,e.inputSchema)}))}}async function si(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 k(JSON.stringify({success:!1,error:`task must be a non-empty string`}));let a=await A(e),o=i?.autoActivate===!0,s=oi(await ei({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 K(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=oi(await ei({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 k(JSON.stringify(s,null,2))}async function ci(e,t){let n=t.name;if(!n||typeof n!=`string`)return k(JSON.stringify({success:!1,error:`name must be a non-empty string`}));let r=$r(n,e);return k(r?JSON.stringify({success:!0,tool:r},null,2):JSON.stringify({success:!1,error:`Tool not found: ${n}`}))}function li(e){return e.issues.map(e=>`${e.path.length>0?e.path.join(`.`):`(root)`}: ${e.message}`).join(`; `)}function ui(e,t,n){if(!t||typeof t!=`object`)return n;let r=Jn(t);if(Object.keys(r).length===0)return n;try{return H.object(r).parse(n)}catch(t){throw t instanceof Rt?Error(`Invalid arguments for "${e}": ${li(t)}`,{cause:t}):t}}function di(e,t){return{wasAutoActivated:e,activatedTools:t}}function fi(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 pi(e,n){let r=typeof n.name==`string`?n.name:``,i=di(!1,[]);if(!r)return k(JSON.stringify({success:!1,error:`name must be a non-empty string`,...i}));let a=P(r),o={},s=n.args??n.parameters??(typeof n.arguments==`string`?n.arguments:null);if(s&&typeof s==`object`&&!Array.isArray(s))o=s;else if(typeof s==`string`&&s.trim().length>0)try{let e=JSON.parse(s);e&&typeof e==`object`&&!Array.isArray(e)&&(o=e)}catch{}if(Object.keys(o).length===0&&!(`args`in n)&&!(`parameters`in n)&&!(`arguments`in n))for(let[e,t]of Object.entries(n))e!==`name`&&(o[e]=t);let c=i;if(!e.router.has(a)){let t=!1;try{let{ensureAllDomainsLoaded:n}=await import(`./registry-7h8jJ9y9.mjs`).then(e=>e.l);await n();let{getToolByName:r}=await import(`./MCPServer.search.helpers-DlassAew.mjs`).then(e=>e.t);if((await r(e)).get(a)){let{activateToolNames:n}=await Promise.resolve().then(()=>ti),{getToolDomain:r}=await import(`./registry-7h8jJ9y9.mjs`).then(e=>e.u),i=r(a);if(i&&!e.enabledDomains.has(i)){let{handleActivateDomain:t}=await Promise.resolve().then(()=>G);try{await t(e,{domain:i,ttlMinutes:(await import(`./constants-nvsLpSri.mjs`).then(e=>e.t)).ACTIVATION_TTL_MINUTES})}catch{}}e.router.has(a)||await n(e,[a]),c.wasAutoActivated=!0,c.activatedTools=[a],t=!0}}catch{}if(!t)return k(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=ui(a,N(a,e),o),n=await e.executeToolWithTracking(a,t);try{(await A(e)).recordToolCallFeedback(a,``)}catch{}return fi(n,c)}catch(e){let n=e instanceof Error?e.message:String(e);return t.error(`call_tool: execution of "${a}" failed`,e),k(JSON.stringify({success:!1,error:`Tool "${a}" failed: ${n}`,...c}))}}async function mi(e,t){await we();let n=M(e)?.getCoverageSummary(e)??{called:{},calledCount:0,uncataloguedCalls:[],uncataloguedCallCount:0,totalKnownTools:0,uncalled:[],uncalledCount:0};return{content:[{type:`text`,text:JSON.stringify({success:!0,...n},null,2)}]}}function hi(e){return[{name:`search_tools`,description:Ie(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:ai},{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:si},{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:ci},{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:ri},{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:ii},{name:`activate_domain`,description:`Activate all tools in a domain at once. Domains: ${[...Se()].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:K},{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:pi},{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:mi}]}function gi(e){let n=hi(e);for(let r of n){let n=Jn(r.inputSchema);e.server.registerTool(r.name,{description:r.description,inputSchema:n},async(n,i)=>Xt(i,async()=>{try{let t=Zn(n,i),a=await r.handler(e,t);return M(e)?.recordToolCall(r.name,t),a}catch(e){return t.error(`${r.name} failed`,e),Ae(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 _i(e,t,n){return{contents:[{uri:e,mimeType:n,text:t}]}}function vi(e){return e.getDomainInstance(`evidenceGraph`)}function yi(e){return e.getDomainInstance(`instrumentationSessionManager`)}function bi(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=vi(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=vi(e);return _i(t.toString(),n?n.exportMarkdown():`# Reverse Evidence Graph Report
8
8
 
9
9
  No evidence graph is available.
10
- `,`text/markdown`)}),e.server.registerResource(`instrumentation_sessions`,`jshook://instrumentation/sessions`,{title:`Instrumentation Sessions`,description:`Expanded snapshots for all active instrumentation sessions.`,mimeType:`application/json`},async t=>{let n=$(e);return Q(t.toString(),n?n.listSessionSnapshots():[])});let t=new ct(`jshook://instrumentation/session/{sessionId}`,{list:async()=>({resources:($(e)?.listSessions()??[]).map(e=>({name:e.name||`Instrumentation Session ${e.id}`,uri:`jshook://instrumentation/session/${e.id}`,mimeType:`application/json`,description:`operations=${e.operationCount}, artifacts=${e.artifactCount}, status=${e.status}`}))})});e.server.registerResource(`instrumentation_session_snapshot`,t,{title:`Instrumentation Session Snapshot`,description:`Expanded snapshot for a single instrumentation session.`,mimeType:`application/json`},async(t,n)=>{let r=String(n.sessionId??``),i=$(e)?.getSessionSnapshot(r);return Q(t.toString(),i??{success:!1,error:`Instrumentation session "${r}" not found`})}),e.server.registerResource(`search_engine_status`,`jshook://search/status`,{title:`Search Engine Status`,description:`Current status of the multi-signal tool search engine.`,mimeType:`application/json`},async t=>{let n=e.extensionToolsByName.size;try{n+=E().length}catch{}let r=0,i=0,a=!1,o=!1,s=!1,c=null;try{r=(await j(e)).getDomainSummary().reduce((e,t)=>e+t.count,0),a=!0,o=!0,s=e.config.search.vectorEnabled??!1,s&&(i=384),c=new Date().toISOString()}catch{}return Q(t.toString(),{totalTools:n,indexedTools:r,embeddingDimension:i,lastIndexedAt:c,bm25Available:a,trigramAvailable:o,embeddingAvailable:s})}),e.server.registerResource(`token_budget_stats`,`jshook://token-budget/stats`,{title:`Token Budget Statistics`,description:`Current token budget usage, top-10 tool distribution, and optimization suggestions.`,mimeType:`application/json`},async t=>Q(t.toString(),e.tokenBudget.getStats())),e.server.registerResource(`activation_state`,`jshook://activation/state`,{title:`Activation State`,description:`Currently activated tools, per-domain TTL remaining, and auto-pruner predictions.`,mimeType:`application/json`},async t=>{let n=[...e.activatedToolNames],r=[];for(let[t,n]of e.domainTtlEntries)r.push({domain:t,ttlMs:n.ttlMs,toolCount:n.toolNames.size,toolNames:[...n.toolNames]});let i=[...e.enabledDomains];return Q(t.toString(),{baseTier:e.baseTier,enabledDomains:i,activatedTools:n,activatedToolCount:n.length,domainTtls:r,clientSupportsListChanged:e.clientSupportsListChanged})}),e.server.registerResource(`tool_coverage`,`jshook://tools/coverage`,{title:`Tool Coverage`,description:`Called vs uncalled tools in the current runtime, with last-call metadata.`,mimeType:`application/json`},async t=>{let n=M(e)?.getCoverageSummary(e)??{called:{},calledCount:0,uncataloguedCalls:[],uncataloguedCallCount:0,totalKnownTools:0,uncalled:[],uncalledCount:0};return Q(t.toString(),n)}),e.server.registerResource(`cache_stats`,`jshook://cache/stats`,{title:`Cache Statistics`,description:`Global cache entry count, total size, and per-cache-instance hit rates.`,mimeType:`application/json`},async t=>Q(t.toString(),await e.unifiedCache.getGlobalStats())),e.server.registerResource(`browser_tabs`,`jshook://browser/tabs`,{title:`Browser Tabs`,description:`List of currently open browser tabs with URL, title, and tabIndex.`,mimeType:`application/json`},async t=>{let n=e.getDomainInstance(`browserHandlers`)?.getTabRegistry?.();if(!n)return Q(t.toString(),{tabs:[],currentTabId:null,message:`Browser domain not initialized`});let r=n.listTabs().map(e=>({pageId:e.pageId,index:e.index,url:e.url,title:e.title,aliases:e.aliases})),i=n.getContextMeta();return Q(t.toString(),{tabs:r,currentTabId:i.pageId,totalTabs:r.length})});let n=new ct(`jshook://domains/{domainName}`,{list:async()=>{let t=new Map;try{let e=E();for(let n of e){let e=n.domain??`unknown`;t.set(e,(t.get(e)??0)+1)}}catch{}for(let n of e.extensionToolsByName.values())t.set(n.domain,(t.get(n.domain)??0)+1);let n;try{n=fe()}catch{n=new Set(t.keys())}return{resources:[...n].map(e=>({name:`Domain: ${e}`,uri:`jshook://domains/${e}`,mimeType:`application/json`,description:`${t.get(e)??0} tools`}))}}});e.server.registerResource(`domain_status_template`,n,{title:`Domain Status`,description:`Per-domain tool listing and activation state.`,mimeType:`application/json`},async(t,n)=>{let r=String(n.domainName??``),i=[];try{i=E().filter(e=>(e.domain??`unknown`)===r).map(e=>e.tool.name)}catch{}let a=[];for(let t of e.extensionToolsByName.values())t.domain===r&&a.push(t.name);let o=[...i,...a],s=o.filter(t=>e.activatedToolNames.has(t)),c=e.domainTtlEntries.get(r),l=e.enabledDomains.has(r);return Q(t.toString(),{domain:r,totalTools:o.length,tools:o,enabled:l,activatedTools:s,activatedCount:s.length,ttl:c?{ttlMs:c.ttlMs,toolCount:c.toolNames.size}:null})});let r=e.mcpLog?.getFilePath?.();r&&e.server.registerResource(`mcp_log_file`,`jshook://logs/file`,{title:`MCP Log File Path`,description:`Path to the current MCP log file.`,mimeType:`text/plain`},async e=>({contents:[{uri:e.toString(),mimeType:`text/plain`,text:r}]}))}function er(e){e.server.prompt(`analyze_anti_debug`,`Runbook and scripts for defeating debugger protections and traps.`,()=>({messages:[{role:`user`,content:{type:`text`,text:`I am encountering infinite debugger loops and anti-tamper traps. What should I do?`}},{role:`assistant`,content:{type:`text`,text:`To defeat common anti-debugging techniques, inject the following bypass script prior to page load (using page_evaluateOnNewDocument if possible):
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=yi(e);return $(t.toString(),n?n.listSessionSnapshots():[])});let t=new gt(`jshook://instrumentation/session/{sessionId}`,{list:async()=>({resources:(yi(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=yi(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+=De().length}catch{}let r=0,i=0,a=!1,o=!1,s=!1,c=null;try{r=(await A(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=M(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 gt(`jshook://domains/{domainName}`,{list:async()=>{let t=new Map;try{let e=De();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=ge()}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=De().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 xi(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):
11
11
 
12
12
  \`\`\`javascript
13
- ${et()}
13
+ ${ut()}
14
14
  \`\`\`
15
15
 
16
- If execution still halts, use the 'memory_scan' tool with pattern 'debugger' or use the AST flattening tools on the suspected control-flow-flattened script.`}}]})),e.server.prompt(`hook_generation_guide`,`Instructions on how to deploy and use hooks generated by the hook builder.`,()=>({messages:[{role:`user`,content:{type:`text`,text:`How do I use generated function or storage hooks?`}},{role:`assistant`,content:{type:`text`,text:`${tt(`function`)}
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:`${dt(`function`)}
17
17
 
18
18
  Generally, you have three options to deploy hooks:
19
19
  1. **Immediate Execution**: Use the \`console_execute\` tool in the browser domain to run the generated hook script immediately on the active page.
20
20
  2. **Early Injection**: Use \`page_evaluateOnNewDocument\` to ensure the hook is installed before any target website scripts execute.
21
- 3. **Local Overrides**: Save the hook script via \`write_file\` and use browser overrides (or proxy mapping) to serve it in place of the original file.`}}]}))}var tr=class{sources=[];debounceTimer=null;periodicTimer=null;debounceMs;periodicMs;disposed=!1;started=!1;constructor(e){this.debounceMs=e?.debounceMs??2e3,this.periodicMs=e?.periodicMs??3e4}register(t,n){let r=this.sources.find(e=>e.filePath===t||e.source===n);if(r){(r.filePath!==t||r.source!==n)&&e.warn(`skipping conflicting snapshot registration for ${t}`);return}let i={source:n,filePath:t};this.sources.push(i),this.started&&this.restoreOne(i).catch(t=>e.warn(`snapshot restore failed for ${i.filePath}:`,t))}async start(){this.started||this.disposed||(this.started=!0,await this.restoreAll(),!(this.disposed||this.periodicTimer)&&(this.periodicTimer=setInterval(()=>{this.scheduleFlush().catch(t=>e.warn(`periodic snapshot failed:`,t))},this.periodicMs)))}notifyDirty(){this.disposed||(this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.scheduleFlush().catch(t=>e.warn(`debounce snapshot failed:`,t))},this.debounceMs))}async flushAll(){this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),await this.writeDirtySources()}dispose(){this.disposed=!0,this.debounceTimer&&=(clearTimeout(this.debounceTimer),null),this.periodicTimer&&=(clearInterval(this.periodicTimer),null)}async restoreAll(){for(let e of this.sources)await this.restoreOne(e)}async restoreOne(t){try{let n=await kt(t.filePath,`utf-8`),r=JSON.parse(n);t.source.restoreSnapshot(r),e.info(`restored snapshot from ${t.filePath}`)}catch{}}async scheduleFlush(){await this.writeDirtySources()}async writeDirtySources(){for(let t of this.sources)if(t.source.isPersistDirty())try{await this.writeSnapshot(t)}catch(n){e.warn(`snapshot write failed for ${t.filePath}:`,n)}}async writeSnapshot(e){await Ot(Ct(e.filePath),{recursive:!0});let t=JSON.stringify(e.source.exportSnapshot()),n=e.filePath+`.tmp`;await jt(n,t,`utf-8`),await At(n,e.filePath),e.source.markPersisted()}};function nr(){let e=process.env.JSHOOK_STATE_DIR;return typeof e==`string`&&e.trim().length>0?Tt(mt(),e):Tt(mt(),`.jshookmcp`,`state`)}function rr(){return process.env.E2E_COLLECT_PERFORMANCE===`1`}function ir(){let e=process.memoryUsage();return{source:`server`,rssBytes:e.rss,privateBytes:null,virtualBytes:null,heapUsedBytes:e.heapUsed,heapTotalBytes:e.heapTotal,externalBytes:e.external,arrayBuffersBytes:e.arrayBuffers}}function ar(e,t,n,r,i){let a=new Date().toISOString(),o=process.cpuUsage(r),s=ir();return{source:`server`,startedAt:e,finishedAt:a,elapsedMs:Number((performance.now()-t).toFixed(2)),timeoutMs:n,serverPid:process.pid,cpuUserMicros:o.user,cpuSystemMicros:o.system,memoryBefore:i,memoryAfter:s,memoryDelta:{rssBytes:s.rssBytes-i.rssBytes,privateBytes:null,virtualBytes:null,heapUsedBytes:s.heapUsedBytes-i.heapUsedBytes,heapTotalBytes:s.heapTotalBytes-i.heapTotalBytes,externalBytes:s.externalBytes-i.externalBytes,arrayBuffersBytes:s.arrayBuffersBytes-i.arrayBuffersBytes}}}function or(e,t){let n=e.content;if(!Array.isArray(n))return e;let r=n.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`);if(!r)return e;try{let n=JSON.parse(r.text);if(typeof n!=`object`||!n||Array.isArray(n))return e;let i=n;`_executionMetrics`in i||(i._executionMetrics=t,r.text=JSON.stringify(i))}catch{return e}return e}var sr=class{config;server;cache;tokenBudget;unifiedCache;detailedData;eventBus;samplingBridge;elicitationBridge;selectedTools;enabledDomains;router;contextGuard;circuitBreaker=new Ht;circuitBrokenTools=new Set;searchQualityTracker=new Ce;largeDataOffloader;handlerDeps;toolAutocompleteHandlers=new Map;degradedMode=!1;clientInitialized=!1;cacheAdaptersRegistered=!1;cacheRegistrationPromise;mcpLog=new mn;baseTier;activatedToolNames=new Set;activatedRegisteredTools=new Map;domainTtlEntries=new Map;metaToolsByName=new Map;clientSupportsListChanged=!0;extensionToolsByName=new Map;extensionPluginsById=new Map;extensionPluginRuntimeById=new Map;extensionWorkflowsById=new Map;extensionWorkflowRuntimeById=new Map;lastExtensionReloadAt;httpServer;httpSockets=new Set;domainInstanceMap=new Map;getDomainInstance(e){return this.domainInstanceMap.get(e)}setDomainInstance(e,t){this.domainInstanceMap.set(e,t)}constructor(t){this.config=t,this.cache=new Mt(t.cache),this.tokenBudget=new re,this.unifiedCache=new ie,this.detailedData=new ce,this.eventBus=nt(),this.tokenBudget.setExternalCleanup(()=>this.detailedData.clear());let{tools:n,profile:r}=Gt();this.selectedTools=n,this.baseTier=r,this.enabledDomains=this.resolveEnabledDomains(this.selectedTools);let i=[],a=pe(),o=new Map(a.map(e=>[e.domain,e])),c=me();if(!Array.isArray(c))e.warn(`[MCPServer] getLoaderMetadata returned non-array, skipping domain proxy setup`);else for(let e of c){let t=o.get(e.domain);if(t){if(i.push([e.depKey,W(this,e.domain,`${e.domain}:${e.depKey}`,()=>t.ensure(this))]),t.secondaryDepKeys)for(let n of t.secondaryDepKeys)i.some(([e])=>e===n)||i.push([n,W(this,e.domain,`${e.domain}:${n}`,async()=>(await t.ensure(this),this[n]))])}else{i.push([e.depKey,W(this,e.domain,`${e.domain}:${e.depKey}`,async()=>{let t=await ge(e.domain);if(!t)throw Error(`Failed to load domain ${e.domain}`);return t.ensure(this)})]);for(let t of e.secondaryDepKeys)i.some(([e])=>e===t)||i.push([t,W(this,e.domain,`${e.domain}:${t}`,async()=>{let n=await ge(e.domain);if(!n)throw Error(`Failed to load domain ${e.domain}`);return await n.ensure(this),this[t]})])}}this.handlerDeps=Object.fromEntries(i);let l=new Set(this.selectedTools.map(e=>e.name));this.router=new Ft(Ee(this.handlerDeps,l)),this.contextGuard=new Bt(()=>{let e=this.handlerDeps.browserHandlers;return e&&typeof e.getTabRegistry==`function`?e.getTabRegistry():null}),this.largeDataOffloader=new Wt(this.detailedData),this.server=new st({name:t.mcp.name,version:t.mcp.version},{capabilities:{tools:{listChanged:!0},logging:{},completions:{},prompts:{listChanged:!0}}}),this.mcpLog.attach(this.server,p),new Set([`debug`,`info`,`warning`,`error`]).has(s)&&this.mcpLog.setLevel(s),g&&this.mcpLog.enableFileLogging(g),this.circuitBreaker.onChange((e,t)=>{e===`opened`?this.circuitBreakerDeactivate(t):this.circuitBreakerReactivate(t)}),this.server.server.oninitialized=()=>{this.clientInitialized=!0},e.onLog((e,t,n)=>{if(this.clientInitialized)try{let r=e===`warn`?`Warning`:e===`error`?`Error`:e===`debug`?`Debug`:`Info`,i=n.length>0?` `+JSON.stringify(n):``;this.server.server.sendLoggingMessage({level:r,data:`${t}${i}`,logger:`jshookmcp`}).catch(()=>void 0)}catch{}}),this.samplingBridge=new Nt(this.server),this.elicitationBridge=new Pt(this.server),this.setDomainInstance(`activationController`,new bn(this.eventBus,this));let u=nr(),d=new tr,f=new Oe,m=new it(()=>this.collector);this.setDomainInstance(`snapshotScheduler`,d),this.setDomainInstance(`snapshotStateDir`,u),this.setDomainInstance(`serverRuntimeState`,f),this.setDomainInstance(`browserSessionCoordinator`,m),d.register(`${u}/runtime-state.json`,f),d.start().then(async()=>{await De(this)}).catch(t=>e.warn(`snapshot scheduler start failed:`,t)),this.eventBus.on(`tool:progress`,async e=>{try{await this.server.server.notification({method:`notifications/progress`,params:{progressToken:e.progressToken,progress:e.progress,total:e.total}})}catch{}}),this.eventBus.on(`evidence:updated`,()=>{try{this.server.server.sendResourceUpdated({uri:`jshook://evidence/graph`})}catch{}}),this.eventBus.on(`activation:domain_pruned`,e=>{this.mcpLog.info(`jshookmcp`,{event:`domain_pruned`,domain:e.domain,reason:e.reason})}),this.server.server.setRequestHandler(lt,async t=>{try{let e=t.params.ref.name;if(!e)return{completion:{values:[],total:0,hasMore:!1}};let n=t.params.argument.name,r=t.params.argument.value,i=this.toolAutocompleteHandlers.get(e);if(!i)return{completion:{values:[],total:0,hasMore:!1}};let a=i[n];if(!a)return{completion:{values:[],total:0,hasMore:!1}};let o=await a(r);return{completion:{values:o.slice(0,100),total:o.length,hasMore:o.length>100}}}catch(t){return e.error(`Autocomplete failed:`,t),{completion:{values:[],total:0,hasMore:!1}}}}),this.registerTools()}resolveEnabledDomains(e){return Kt(e)}registerSingleTool(e){return jn(this,e)}async reloadExtensions(){return Ne(this)}listExtensions(){return Fe(this)}async registerCaches(){if(!this.cacheAdaptersRegistered&&this.collector){if(this.cacheRegistrationPromise){await this.cacheRegistrationPromise;return}this.cacheRegistrationPromise=(async()=>{try{let{createCacheAdapters:t}=await import(`./CacheAdapters-CsNtQIR8.mjs`),n=this.collector.getCache(),r=this.collector.getCompressor(),i=t(this.detailedData,n,r);for(let e of i)this.unifiedCache.registerCache(e);this.cacheAdaptersRegistered=!0,e.info(`Registered ${i.length} cache adapters.`)}catch(t){e.error(`Cache registration failed:`,t)}finally{this.cacheRegistrationPromise=void 0}})();try{await this.cacheRegistrationPromise}catch(t){e.error(`Cache registration failed:`,t)}}}async executeToolWithTracking(t,n){let r,i=3e4,a=rr(),o=a?new Date().toISOString():null,s=a?performance.now():0,c=a?process.cpuUsage():null,l=a?ir():null;try{if(this.setDomainInstance(`activeToolArgs`,n),r=setTimeout(()=>{try{let r=JSON.stringify(n).slice(0,500);e.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${t}'. Args preview: ${r}...`)}catch{e.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${t}'.`)}},i),r.unref(),this.circuitBreaker.shouldBlock(t)){let e=this.circuitBreaker.getState(t),n=e?Math.ceil((this.circuitBreaker.getRecoveryMs()-(Date.now()-e.lastFailureTime))/1e3):30;return r&&clearTimeout(r),{content:[{type:`text`,text:JSON.stringify({success:!1,error:`Circuit breaker open for tool "${t}"`,reason:`Tool has failed consecutively ${e?.failureCount??0} times`,retryAfterSeconds:n})}],isError:!0}}let u;try{let e=D(t)===`browser`?this.getDomainInstance(`browserSessionCoordinator`):null,r=n._meta?.sessionId??null;u=e?await e.runExclusive(r,async()=>(await e.restoreSessionContext(r),await this.router.execute(t,n))):await this.router.execute(t,n)}finally{r&&clearTimeout(r)}if(this.largeDataOffloader.offload(t,u),D(t)===`browser`){let e=this.getDomainInstance(`browserSessionCoordinator`),r=n._meta?.sessionId??null;e?.noteToolResult(r,t,rt(u))}this.contextGuard.recordCall(t),this.getDomainInstance(`serverRuntimeState`)?.recordToolCall(t,n);let d=this.contextGuard.enrichResponse(t,u);a&&o&&c&&l&&(d=or(d,ar(o,s,i,c,l)));try{this.tokenBudget.recordToolCall(t,n,d)}catch(t){e.warn(`Token tracking failed, continuing without tracking this call:`,t)}this.activatedToolNames.has(t)&&ke(this,t);let f=!d.isError;if(d?.structuredContent&&typeof d.structuredContent==`object`)f=d.structuredContent.success!==!1;else if(d?.content?.[0]?.type===`text`&&`text`in d.content[0])try{f=JSON.parse(d.content[0].text).success!==!1}catch{f=!d.isError}return f?this.circuitBreaker.recordSuccess(t):this.circuitBreaker.recordFailure(t),this.eventBus.emit(`tool:called`,{toolName:t,domain:D(t)??null,timestamp:new Date().toISOString(),success:f,args:n,result:{success:f,isError:d.isError===!0}}),this.searchQualityTracker.associateLastSearch(t),this.mcpLog.info(`jshookmcp`,{event:`tool_called`,toolName:t,domain:D(t)??null,success:f}),this.getDomainInstance(`evidenceGraph`)?.commit(),d}catch(r){this.circuitBreaker.recordFailure(t);let i=le(r);try{this.tokenBudget.recordToolCall(t,n,i)}catch(t){e.warn(`Token tracking failed on error path:`,t)}throw this.getDomainInstance(`evidenceGraph`)?.commit(),r}finally{this.setDomainInstance(`activeToolArgs`,void 0)}}enterDegradedMode(t){this.degradedMode||(this.degradedMode=!0,e.warn(`Entering degraded mode: ${t}`),this.tokenBudget.setTrackingEnabled(!1),e.setLevel(`warn`))}circuitBreakerDeactivate(t){if(this.circuitBrokenTools.has(t))return;let n=this.activatedRegisteredTools.get(t);if(n)try{n.remove()}catch(n){e.warn(`CircuitBreaker: failed to remove tool "${t}":`,n);return}else if(!this.activatedToolNames.has(t))return;this.router.removeHandler(t),this.activatedToolNames.delete(t),this.activatedRegisteredTools.delete(t),this.circuitBrokenTools.add(t);let r=this.extensionToolsByName.get(t);r&&(r.registeredTool=void 0),this.clientSupportsListChanged&&this.server.sendToolListChanged(),e.info(`CircuitBreaker: deactivated "${t}" from tool list`)}circuitBreakerReactivate(t){if(!this.circuitBrokenTools.has(t))return;this.circuitBrokenTools.delete(t);let n=this.selectedTools.find(e=>e.name===t);if(!n){e.warn(`CircuitBreaker: cannot reactivate "${t}" — no tool definition found`);return}let r=this.registerSingleTool(n);this.activatedRegisteredTools.set(t,r),this.activatedToolNames.add(t),this.clientSupportsListChanged&&this.server.sendToolListChanged(),e.info(`CircuitBreaker: reactivated "${t}" in tool list`)}async start(){await this.registerCaches(),await this.cache.init(),(process.env.MCP_TRANSPORT??`stdio`).toLowerCase()===`http`?await un(this):await ln(this)}async close(){return J(this)}registerTools(){for(let e of this.selectedTools)this.registerSingleTool(e);Xn(this),$n(this),er(this);let t=this.metaToolsByName.size;e.info(`Registered ${this.selectedTools.length} base tools + ${t} meta tools with McpServer`),this.mcpLog.info(`jshookmcp`,{event:`registry_discovered`,domainCount:this.enabledDomains.size,toolCount:this.selectedTools.length})}};for(let e of`collector.pageController.domInspector.scriptManager.debuggerManager.runtimeInspector.consoleMonitor.browserHandlers.v8InspectorHandlers.boringsslInspectorHandlers.skiaCaptureHandlers.binaryInstrumentHandlers.adbBridgeHandlers.mojoIpcHandlers.syscallHookHandlers.protocolAnalysisHandlers.extensionRegistryHandlers.crossDomainHandlers.debuggerHandlers.advancedHandlers.aiHookHandlers.hookPresetHandlers.deobfuscator.advancedDeobfuscator.astOptimizer.obfuscationDetector.analyzer.cryptoDetector.hookManager.coreAnalysisHandlers.coreMaintenanceHandlers.extensionManagementHandlers.processHandlers.workflowHandlers.wasmHandlers.streamingHandlers.encodingHandlers.antidebugHandlers.graphqlHandlers.platformHandlers.sourcemapHandlers.transformHandlers.coordinationHandlers.evidenceHandlers.instrumentationHandlers`.split(`.`))e===`domainInstanceMap`||e===`getDomainInstance`||e===`setDomainInstance`||Object.defineProperty(sr.prototype,e,{get(){return this.domainInstanceMap.get(e)},set(t){t===void 0?this.domainInstanceMap.delete(e):this.domainInstanceMap.set(e,t)},enumerable:!0,configurable:!0});function cr(e){try{let t=new URL(`.`,e);for(let e=0;e<5;e++){try{let e=Dt(new URL(`package.json`,t)),n=JSON.parse(St(e,`utf8`));if(n.version)return n.version}catch{}let e=new URL(`../`,t);if(e.href===t.href)break;t=e}}catch{}return process.env.npm_package_version??`0.0.0`}function lr(e){return[`@jshookmcp/jshook ${e}`,``,`Usage:`,` jshook [--help] [--version]`,` jshookmcp [--help] [--version]`,``,`Behavior:`,` Starts the MCP server by default.`,``,`Common environment variables:`,` MCP_TRANSPORT=stdio|http`,` MCP_TOOL_PROFILE=search|workflow|full`,``].join(`
22
- `)}function ur(e,t){let n=e.map(e=>e.trim()).filter(Boolean),r=n.includes(`--help`)||n.includes(`-h`)||n[0]===`help`,i=n.includes(`--version`)||n.includes(`-v`)||n.includes(`-V`)||n[0]===`version`;return r?{handled:!0,exitCode:0,output:lr(cr(t))}:i?{handled:!0,exitCode:0,output:`${cr(t)}\n`}:{handled:!1,exitCode:0}}const dr=new Set([`ERR_WORKER_OUT_OF_MEMORY`,`ERR_MEMORY_ALLOCATION_FAILED`]),fr=new Set([`ENOMEM`,`ENOSPC`,`EMFILE`,`ENFILE`]);function pr(e){if(!(e instanceof Error))return!1;let t=`code`in e&&typeof e.code==`string`?e.code:void 0;return!!(t&&dr.has(t)||t&&fr.has(t)||e instanceof RangeError&&e.message.includes(`allocation`))}function mr(e){if(e instanceof Error)return`${e.name}: ${e.message}`;try{return typeof e==`string`?e:JSON.stringify(e)}catch{return String(e)}}async function hr(){try{let n=ur(process.argv.slice(2),import.meta.url);if(n.handled){n.output&&process.stdout.write(n.output),process.exit(n.exitCode);return}let r=ot();e.debug(`Configuration loaded:`,r);let i=at(r);if(!i.valid){e.error(`Configuration validation failed:`),i.errors.forEach(t=>e.error(` - ${t}`)),process.exit(1);return}let a=ae();if(a.cleanupOnStart&&a.enabled){let t=await se();t.removedFiles>0&&e.info(`[artifacts] Startup cleanup removed ${t.removedFiles} files (${t.removedBytes} bytes)`)}e.info(`Creating MCP server instance...`);let o=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),s=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase();await _e(s===`full`||s===`workflow`||s===`search`?s:`search`);let c=new sr(r),l=oe(),d=Math.max(1e3,m),f=Math.max(1,t),p={windowStart:Date.now(),errorCount:0,degradedMode:!1},h=(t,n)=>{pr(n)&&(e.error(`[${t}] FATAL unrecoverable error — forcing exit: ${mr(n)}`),process.exit(1));let r=Date.now();r-p.windowStart>d&&(p.windowStart=r,p.errorCount=0),p.errorCount+=1,e.error(`[${t}] Runtime failure captured (${p.errorCount}/${f}): ${mr(n)}`),!p.degradedMode&&p.errorCount>=f&&(p.degradedMode=!0,c.enterDegradedMode(`Runtime failures reached ${p.errorCount} within ${d}ms`),e.warn(`Degraded mode enabled. Server keeps running without forced process exit.`))};process.on(`SIGINT`,async()=>{e.info(`Received SIGINT, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out, forcing exit`),process.exit(1)},u);t.unref();try{l?.(),await c.close()}catch(t){e.error(`Error during SIGINT shutdown:`,t)}clearTimeout(t),process.exit(0)}),process.on(`SIGTERM`,async()=>{e.info(`Received SIGTERM, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out, forcing exit`),process.exit(1)},u);t.unref();try{l?.(),await c.close()}catch(t){e.error(`Error during SIGTERM shutdown:`,t)}clearTimeout(t),process.exit(0)}),process.on(`uncaughtException`,e=>{h(`uncaughtException`,e)}),process.on(`unhandledRejection`,e=>{h(`unhandledRejection`,e)}),e.info(`Starting MCP server...`),await c.start(),e.info(`MCP server started successfully`),o===`stdio`&&(process.stdin.resume(),process.stdin.on(`end`,async()=>{e.info(`stdin EOF — parent disconnected, shutting down...`);let t=setTimeout(()=>{e.error(`Graceful shutdown timed out after stdin EOF, forcing exit`),process.exit(1)},u);t.unref();try{l?.(),await c.close()}catch(t){e.error(`Error during stdin EOF shutdown:`,t)}clearTimeout(t),process.exit(0)})),e.info(`MCP server is running. Press Ctrl+C to stop.`)}catch(t){e.error(`Failed to start MCP server:`),t instanceof Error&&(e.error(`Error name:`,t.name),e.error(`Error message:`,t.message),e.error(`Error stack:`,t.stack)),e.error(`Full error object:`,JSON.stringify(t,null,2));let n=t?.code,r=t instanceof Error?t.message:String(t);n===`EADDRINUSE`&&e.error(`Port is already in use. Please check if another instance is running.`),r?.includes(`credentials`)&&e.error(`Authentication failed. Please check your API keys or credentials.`),process.exit(1)}}hr();export{hr as main};
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 Si=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 Mt(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 jt(z(e.filePath),{recursive:!0});let t=JSON.stringify(e.source.exportSnapshot()),n=e.filePath+`.tmp`;await Ft(n,t,`utf-8`),await Pt(n,e.filePath),e.source.markPersisted()}};function Ci(){let e=process.env.JSHOOK_STATE_DIR;return typeof e==`string`&&e.trim().length>0?V(wt(),e):V(wt(),`.jshookmcp`,`state`)}function wi(){return process.env.E2E_COLLECT_PERFORMANCE===`1`}function Ti(){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 Ei(e,t,n,r,i){let a=new Date().toISOString(),o=process.cpuUsage(r),s=Ti();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 Di(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}async function Oi(e,n,r){let i,a=3e4,o=wi(),s=o?new Date().toISOString():null,c=o?performance.now():0,l=o?process.cpuUsage():null,u=o?Ti():null;try{if(i=setTimeout(()=>{try{let e=JSON.stringify(r).slice(0,500);t.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${n}'. Args preview: ${e}...`)}catch{t.warn(`Telemetry Alert [ERR-03]: Tool execution hung (>30s) for '${n}'.`)}},a),i.unref(),e.circuitBreaker.shouldBlock(n)){let t=e.circuitBreaker.getState(n),r=t?Math.ceil((e.circuitBreaker.getRecoveryMs()-(Date.now()-t.lastFailureTime))/1e3):30;return i&&clearTimeout(i),{content:[{type:`text`,text:JSON.stringify({success:!1,error:`Circuit breaker open for tool "${n}"`,reason:`Tool has failed consecutively ${t?.failureCount??0} times`,retryAfterSeconds:r})}],isError:!0}}let d;try{let t=O(n)===`browser`?e.getDomainInstance(`browserSessionCoordinator`):null,i=r._meta?.sessionId??null;d=t?await t.runExclusive(i,async()=>(await t.restoreSessionContext(i),await e.router.execute(n,r))):await e.router.execute(n,r)}finally{i&&clearTimeout(i)}if(e.largeDataOffloader.offload(n,d),O(n)===`browser`){let t=e.getDomainInstance(`browserSessionCoordinator`),i=r._meta?.sessionId??null;t?.noteToolResult(i,n,pt(d))}e.contextGuard.recordCall(n),e.getDomainInstance(`serverRuntimeState`)?.recordToolCall(n,r);let f=e.contextGuard.enrichResponse(n,d);o&&s&&l&&u&&(f=Di(f,Ei(s,c,a,l,u)));try{e.tokenBudget.recordToolCall(n,r,f)}catch(e){t.warn(`Token tracking failed, continuing without tracking this call:`,e)}e.activatedToolNames.has(n)&&Ve(e,n);let p=!f.isError;if(f?.structuredContent&&typeof f.structuredContent==`object`)p=f.structuredContent.success!==!1;else if(f?.content?.[0]?.type===`text`&&`text`in f.content[0])try{p=JSON.parse(f.content[0].text).success!==!1}catch{p=!f.isError}return p?e.circuitBreaker.recordSuccess(n):e.circuitBreaker.recordFailure(n),e.eventBus.emit(`tool:called`,{toolName:n,domain:O(n)??null,timestamp:new Date().toISOString(),success:p,args:r,result:{success:p,isError:f.isError===!0}}),e.getDomainInstance(`searchQualityTracker`)?.associateLastSearch(n),e.mcpLog.info(`jshookmcp`,{event:`tool_called`,toolName:n,domain:O(n)??null,success:p}),e.getDomainInstance(`evidenceGraph`)?.commit(),f}catch(i){e.circuitBreaker.recordFailure(n);let a=Ae(i);try{e.tokenBudget.recordToolCall(n,r,a)}catch(e){t.warn(`Token tracking failed on error path:`,e)}throw e.getDomainInstance(`evidenceGraph`)?.commit(),i}finally{i&&clearTimeout(i)}}var ki=class{config;server;cache;tokenBudget;unifiedCache;detailedData;eventBus;samplingBridge;elicitationBridge;selectedTools;enabledDomains;router;contextGuard;circuitBreaker=new cn;circuitBrokenTools=new Set;searchQualityTracker=new Pe;largeDataOffloader;handlerDeps;toolAutocompleteHandlers=new Map;degradedMode=!1;clientInitialized=!1;cacheAdaptersRegistered=!1;cacheRegistrationPromise;mcpLog=new Ln;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 ie,this.unifiedCache=new ae,this.detailedData=new me,this.eventBus=ft(),this.tokenBudget.setExternalCleanup(()=>this.detailedData.clear());let{tools:n,profile:r}=dn();this.selectedTools=n,this.baseTier=r,this.enabledDomains=this.resolveEnabledDomains(this.selectedTools);let i=[],o=Te(),c=new Map(o.map(e=>[e.domain,e])),u=he();if(!Array.isArray(u))t.warn(`[MCPServer] getLoaderMetadata returned non-array, skipping domain proxy setup`);else for(let e of u){let t=c.get(e.domain);if(t){if(i.push([e.depKey,U(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,U(this,e.domain,`${e.domain}:${n}`,async()=>(await t.ensure(this),this[n]))])}else{i.push([e.depKey,U(this,e.domain,`${e.domain}:${e.depKey}`,async()=>{let t=await Ee(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,U(this,e.domain,`${e.domain}:${t}`,async()=>{let n=await Ee(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 d=new Set(this.selectedTools.map(e=>e.name));this.router=new en(Oe(this.handlerDeps,d)),this.contextGuard=new on(()=>{let e=this.handlerDeps.browserHandlers;return e&&typeof e.getTabRegistry==`function`?e.getTabRegistry():null}),this.largeDataOffloader=new un(this.detailedData),this.server=new ht({name:e.mcp.name,version:e.mcp.version},{capabilities:{tools:{listChanged:!0},logging:{},completions:{},prompts:{listChanged:!0}}}),this.mcpLog.attach(this.server,s),new Set([`debug`,`info`,`warning`,`error`]).has(a)&&this.mcpLog.setLevel(a),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 $t(this.server),this.setDomainInstance(`activationController`,new Un(this.eventBus,this)),this.setDomainInstance(`searchQualityTracker`,this.searchQualityTracker);let f=Ci(),p=new Si,m=new Be,h=new mt(()=>this.collector);this.setDomainInstance(`snapshotScheduler`,p),this.setDomainInstance(`snapshotStateDir`,f),this.setDomainInstance(`serverRuntimeState`,m),this.setDomainInstance(`browserSessionCoordinator`,h),p.register(`${f}/runtime-state.json`,m),p.start().then(async()=>{await ze(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(_t,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 pn(e)}registerSingleTool(e){return tr(this,e)}async reloadExtensions(){return Gr(this)}listExtensions(){return Pr(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,t){return Oi(this,e,t)}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 Mn(this):await jn(this)}async close(){return Pn(this)}registerTools(){for(let e of this.selectedTools)this.registerSingleTool(e);gi(this),bi(this),xi(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(ki.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 Ai(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 ji(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:Ai(le(t))}:i?{handled:!0,exitCode:0,output:`${le(t)}\n`}:{handled:!1,exitCode:0}}const Mi=new Set([`ERR_WORKER_OUT_OF_MEMORY`,`ERR_MEMORY_ALLOCATION_FAILED`]),Ni=new Set([`ENOMEM`,`ENOSPC`,`EMFILE`,`ENFILE`]);function Pi(e){if(!(e instanceof Error))return!1;let t=`code`in e&&typeof e.code==`string`?e.code:void 0;return!!(t&&Mi.has(t)||t&&Ni.has(t)||e instanceof RangeError&&e.message.includes(`allocation`))}function Fi(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 Ii(){try{let e=ji(process.argv.slice(2),import.meta.url);if(e.handled){e.output&&process.stdout.write(e.output),process.exit(e.exitCode);return}let n=de();t.debug(`Configuration loaded:`,n);let i=ue(n);if(!i.valid){t.error(`Configuration validation failed:`),i.errors.forEach(e=>t.error(` - ${e}`)),process.exit(1);return}let a=oe();if(a.cleanupOnStart&&a.enabled){let e=await ce();e.removedFiles>0&&t.info(`[artifacts] Startup cleanup removed ${e.removedFiles} files (${e.removedBytes} bytes)`)}t.info(`Creating MCP server instance...`);let o=(process.env.MCP_TRANSPORT??`stdio`).toLowerCase(),s=(process.env.MCP_TOOL_PROFILE??``).trim().toLowerCase();await _e(s===`full`||s===`workflow`||s===`search`?s:`search`);let c=new ki(n),l=se(),d=Math.max(1e3,re),f=Math.max(1,u),p={windowStart:Date.now(),errorCount:0,degradedMode:!1},m=(e,n)=>{Pi(n)&&(t.error(`[${e}] FATAL unrecoverable error — forcing exit: ${Fi(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}): ${Fi(n)}`),!p.degradedMode&&p.errorCount>=f&&(p.degradedMode=!0,c.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)},r);e.unref();try{l?.(),await c.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)},r);e.unref();try{l?.(),await c.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 c.start(),t.info(`MCP server started successfully`),o===`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)},r);e.unref();try{l?.(),await c.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)}}Ii();export{Ii as main,G as n,Nr as t};
@@ -0,0 +1 @@
1
+ const e=`[REDACTED]`,t=/^(auth(orization)?|cookie|set[_-]?cookie|x[_-]?api[_-]?key|token|access[_-]?token|refresh[_-]?token|id[_-]?token|secret|client[_-]?secret|password|passwd|api[_-]?key|private[_-]?key|credentials?|session[_-]?id|csrf[_-]?token)$/i,n=[/\bBearer\s+[A-Za-z0-9._~+/=-]+\b/gi,/\beyJ[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_-]+){0,2}\b/g,/\bsk[_-][A-Za-z0-9]{20,}\b/g,/\b[A-Fa-f0-9]{32,}\b/g];function r(e){return e.length>0&&t.test(e)}function i(t){let r=t;for(let t of n)t.lastIndex=0,r=r.replace(t,e);return r}function a(t,n){return r(t)?e:typeof n==`string`?i(n):n}function o(e){return s(e,``,new WeakSet)}function s(t,n,a){if(r(n))return e;if(typeof t==`string`)return i(t);if(typeof t!=`object`||!t)return t;if(a.has(t))return`[Circular]`;if(a.add(t),Array.isArray(t)){let e=t.map(e=>s(e,``,a));return a.delete(t),e}let o={};for(let[e,n]of Object.entries(t))o[e]=s(n,e,a);return a.delete(t),o}const c={gray:`\x1B[90m`,blue:`\x1B[34m`,yellow:`\x1B[33m`,red:`\x1B[31m`,green:`\x1B[32m`,reset:`\x1B[0m`},l=(e,t)=>`${e}${t}${c.reset}`,u=new class{level;listeners=[];constructor(e=`info`){this.level=e}shouldLog(e){let t=[`debug`,`info`,`warn`,`error`];return t.indexOf(e)>=t.indexOf(this.level)}formatMessage(e,t,...n){let r=`[${new Date().toISOString()}] [${e.toUpperCase()}]`,i=``;if(n.length>0)try{i=` `+JSON.stringify(n,a,void 0)}catch{i=` [unserializable]`}return`${r} ${t}${i}`}emit(e,t,n){for(let r of this.listeners)try{r(e,t,n)}catch{}}onLog(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}debug(e,...t){this.shouldLog(`debug`)&&(console.error(l(c.gray,this.formatMessage(`debug`,e,...t))),this.emit(`debug`,e,t))}info(e,...t){this.shouldLog(`info`)&&(console.error(l(c.blue,this.formatMessage(`info`,e,...t))),this.emit(`info`,e,t))}warn(e,...t){this.shouldLog(`warn`)&&(console.error(l(c.yellow,this.formatMessage(`warn`,e,...t))),this.emit(`warn`,e,t))}error(e,...t){this.shouldLog(`error`)&&(console.error(l(c.red,this.formatMessage(`error`,e,...t))),this.emit(`error`,e,t))}success(e,...t){this.shouldLog(`info`)&&(console.error(l(c.green,this.formatMessage(`info`,e,...t))),this.emit(`info`,e,t))}setLevel(e){this.level=e}}(process.env.LOG_LEVEL||`info`);export{o as n,i as r,u as t};
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./logger-BGCcd-jJ.mjs";import{c as t,l as n}from"./constants-nvsLpSri.mjs";import{i as r}from"./outputPaths-CHtELDyi.mjs";import{r as i}from"./ResponseBuilder-BLicSCjn.mjs";import{i as a,t as o}from"./retry-policy-DtYv0kDi.mjs";import"./definitions-9csunmeX.mjs";import{extname as s,resolve as c}from"node:path";import{readFile as l,readdir as u}from"node:fs/promises";function d(e){return`kind`in e?e:e.build()}function f(e,t){return t?.(e),e}function p(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 m(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 h(e,t){return e.step=n=>(t.push(n),e),e.tool=(n,r,i)=>(t.push(m(p(n,r),i)),e),e.sequence=(n,r)=>(t.push(f(g(n),r)),e),e.parallel=(n,r)=>(t.push(f(_(n),r)),e),e.branch=(n,r,i)=>(t.push(f(v(n,r),i)),e),e.fallback=(n,r)=>(t.push(f(y(n),r)),e),e}function g(e){let t=[],n=h({},t);return n.build=()=>({kind:`sequence`,id:e,steps:t.map(d)}),n}function _(e){let t=[],n=h({},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(d),maxConcurrency:r,failFast:i}),n}function v(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:d(i),whenFalse:a?d(a):void 0}},n}function y(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:d(n),fallback:d(r)}},t}function b(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 x(e,t,n){let r=b(e,t);return n(r),r.build()}function S(e,t,n){return m(p(e,t),n).build()}function C(e,t){return f(g(e),t).build()}function w(e,t){return f(_(e),t).build()}function T(e,t,n){return f(v(e,t),n).build()}function E(e,t){return f(y(e),t).build()}var D=class{ctx;constructor(e){this.ctx=e}buildWorkflowFromDefinition(e){return x(e.id,e.displayName,t=>t.description(e.description).tags(e.tags).timeoutMs(e.timeoutMs??n).buildGraph(()=>C(`${e.id}-root`,t=>{for(let n of e.steps)t.step(this.buildNodeFromStep(n))})).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})}))}buildNodeFromStep(e){let t=this.buildCoreNodeFromStep(e);return e.optional?E(`${e.id}-optional`,n=>{n.primary(t),n.fallback(C(`${e.id}-optional-skip`))}):t}buildCoreNodeFromStep(e){if([typeof e.toolName==`string`&&e.toolName.length>0,Array.isArray(e.sequenceSteps),Array.isArray(e.parallelSteps),e.branchStep!==void 0,e.fallbackStep!==void 0].filter(Boolean).length!==1)throw Error(`Macro step "${e.id}" must define exactly one of toolName, sequenceSteps, parallelSteps, branchStep, or fallbackStep`);return e.sequenceSteps?C(e.id,t=>{for(let n of e.sequenceSteps??[])t.step(this.buildNodeFromStep(n))}):e.parallelSteps?w(e.id,t=>{e.maxConcurrency!==void 0&&t.maxConcurrency(e.maxConcurrency),e.failFast!==void 0&&t.failFast(e.failFast);for(let n of e.parallelSteps??[])t.step(this.buildNodeFromStep(n))}):e.branchStep?T(e.id,e.branchStep.predicateId,t=>{t.whenTrue(this.buildNodeFromStep(e.branchStep.whenTrue)),e.branchStep?.whenFalse&&t.whenFalse(this.buildNodeFromStep(e.branchStep.whenFalse))}):e.fallbackStep?E(e.id,t=>{t.primary(this.buildNodeFromStep(e.fallbackStep.primary)),t.fallback(this.buildNodeFromStep(e.fallbackStep.fallback))}):S(e.id,e.toolName,t=>{t.input(e.input??{}),e.timeoutMs!==void 0&&t.timeout(e.timeoutMs),e.retry&&t.retry(e.retry),e.inputFrom&&t.inputFrom(e.inputFrom)})}summarizeDefinition(e){let t=e.steps.map(e=>this.summarizeNode(this.buildNodeFromStep(e)));return{macroId:e.id,displayName:e.displayName,timeoutMs:e.timeoutMs??n,nodes:t}}summarizeNode(e){switch(e.kind){case`tool`:return{id:e.id,kind:`tool`,toolName:e.toolName,retry:e.retry,timeoutMs:e.timeoutMs,inputFrom:e.inputFrom};case`sequence`:return{id:e.id,kind:`sequence`,children:e.steps.map(e=>this.summarizeNode(e))};case`parallel`:return{id:e.id,kind:`parallel`,maxConcurrency:e.maxConcurrency,failFast:e.failFast,children:e.steps.map(e=>this.summarizeNode(e))};case`branch`:return{id:e.id,kind:`branch`,predicateId:e.predicateId,whenTrue:this.summarizeNode(e.whenTrue),whenFalse:e.whenFalse?this.summarizeNode(e.whenFalse):void 0};case`fallback`:return{id:e.id,kind:`fallback`,primary:this.summarizeNode(e.primary),fallback:this.summarizeNode(e.fallback)}}}async execute(e,t,n){let r=this.buildWorkflowFromDefinition(e),i=Date.now();try{let i=await a(this.ctx,r,{nodeInputOverrides:t,retryPolicy:n}),o=this.buildProgress(e,i.spans,i.stepResults);return{macroId:e.id,displayName:e.displayName,ok:!0,durationMs:i.durationMs,stepsCompleted:o.filter(e=>e.status===`complete`).length,totalSteps:e.steps.length,stepResults:i.stepResults,progress:o}}catch(t){let n=Date.now()-i,r=t instanceof Error?t.message:String(t),a=this.buildPartialProgress(e,r);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:r}}}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 O(t){let n;try{n=await u(t)}catch{return[]}let r=n.filter(e=>s(e)===`.json`),i=[];for(let n of r){let r=c(t,n);try{let t=JSON.parse(await l(r,`utf-8`));k(t)?(i.push(I(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 k(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(!A(e))return!1;return!0}function A(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id!=`string`||!t.id||[typeof t.toolName==`string`&&t.toolName.length>0,Array.isArray(t.sequenceSteps),Array.isArray(t.parallelSteps),M(t.branchStep),M(t.fallbackStep)].filter(Boolean).length!==1||t.retry!==void 0&&!j(t.retry)||t.input!==void 0&&!M(t.input)||t.inputFrom!==void 0&&!N(t.inputFrom)||t.timeoutMs!==void 0&&!F(t.timeoutMs)||t.optional!==void 0&&typeof t.optional!=`boolean`||t.maxConcurrency!==void 0&&!P(t.maxConcurrency)||t.failFast!==void 0&&typeof t.failFast!=`boolean`?!1:t.sequenceSteps===void 0?t.parallelSteps===void 0?M(t.branchStep)?typeof t.branchStep.predicateId!=`string`||!t.branchStep.predicateId||!A(t.branchStep.whenTrue)?!1:t.branchStep.whenFalse===void 0||A(t.branchStep.whenFalse):M(t.fallbackStep)?A(t.fallbackStep.primary)&&A(t.fallbackStep.fallback):!0:!Array.isArray(t.parallelSteps)||t.parallelSteps.length===0?!1:t.parallelSteps.every(e=>A(e)):!Array.isArray(t.sequenceSteps)||t.sequenceSteps.length===0?!1:t.sequenceSteps.every(e=>A(e))}function j(e){return M(e)?P(e.maxAttempts)&&F(e.backoffMs)&&(e.multiplier===void 0||F(e.multiplier)):!1}function M(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function N(e){return M(e)&&Object.values(e).every(e=>typeof e==`string`)}function P(e){return Number.isInteger(e)&&Number(e)>0}function F(e){return Number.isFinite(e)&&Number(e)>=0}function I(e){return{id:e.id,displayName:e.displayName,description:e.description??``,tags:e.tags??[],timeoutMs:e.timeoutMs,steps:e.steps.map(L)}}function L(e){return{id:e.id,toolName:e.toolName,input:e.input,inputFrom:e.inputFrom,timeoutMs:e.timeoutMs,retry:e.retry,optional:e.optional,sequenceSteps:e.sequenceSteps?.map(L),parallelSteps:e.parallelSteps?.map(L),maxConcurrency:e.maxConcurrency,failFast:e.failFast,branchStep:e.branchStep?{predicateId:e.branchStep.predicateId,whenTrue:L(e.branchStep.whenTrue),whenFalse:e.branchStep.whenFalse?L(e.branchStep.whenFalse):void 0}:void 0,fallbackStep:e.fallbackStep?{primary:L(e.fallbackStep.primary),fallback:L(e.fallbackStep.fallback)}:void 0}}const R={loadFromDirectory:O,validate:k},z=[{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 B=class{runner;macros=null;constructor(e){this.runner=new D(e)}async ensureMacrosLoaded(){if(this.macros)return this.macros;this.macros=new Map;for(let e of z)this.macros.set(e.id,e);try{let e=await R.loadFromDirectory(c(r(),`macros`));for(let t of e)this.macros.set(t.id,t)}catch{}return this.macros}async handleRunMacroTool(e){return i(async()=>await this.handleRunMacro(e))}async handleListMacrosTool(){return i(async()=>await this.handleListMacros())}async handleRunMacro(e){let t=e.macroId,n=e.inputOverrides,r=e.dryRun===!0;if(!t||typeof t!=`string`)return{content:[{type:`text`,text:JSON.stringify({ok:!1,error:`macroId parameter is required`})}]};let i=await this.ensureMacrosLoaded(),a=i.get(t);if(!a)return{content:[{type:`text`,text:JSON.stringify({ok:!1,error:`Macro "${t}" not found`,available:Array.from(i.keys())})}]};if(r){let e;try{e=this.runner.summarizeDefinition(a)}catch(e){return{content:[{type:`text`,text:JSON.stringify({ok:!1,dryRun:!0,macroId:t,error:e instanceof Error?e.message:String(e)})}]}}return{content:[{type:`text`,text:JSON.stringify({ok:!0,dryRun:!0,inputOverrides:n,...e})}]}}let s=await this.runner.execute(a,n,o());return{content:[{type:`text`,text:this.runner.formatProgressReport(s)}]}}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{B as MacroToolHandlers};