@jshookmcp/jshook 0.2.2 → 0.2.5

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 (414) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +15 -6
  3. package/README.zh.md +19 -4
  4. package/dist/native/scripts/linux/enum-windows.sh +12 -12
  5. package/dist/native/scripts/macos/enum-windows.applescript +22 -22
  6. package/dist/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  7. package/dist/native/scripts/windows/enum-windows.ps1 +44 -44
  8. package/dist/native/scripts/windows/inject-dll.ps1 +21 -21
  9. package/dist/packages/extension-sdk/src/bridges/shared.js +2 -2
  10. package/dist/packages/extension-sdk/src/plugin.d.ts +5 -0
  11. package/dist/packages/extension-sdk/src/plugin.js +119 -33
  12. package/dist/packages/extension-sdk/src/workflow.d.ts +156 -0
  13. package/dist/packages/extension-sdk/src/workflow.js +236 -0
  14. package/dist/src/config/search-defaults.js +161 -0
  15. package/dist/src/constants.d.ts +3 -0
  16. package/dist/src/constants.js +4 -1
  17. package/dist/src/index.d.ts +1 -1
  18. package/dist/src/index.js +13 -17
  19. package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -3
  20. package/dist/src/modules/analyzer/CodeAnalyzer.js +16 -28
  21. package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.d.ts +1 -2
  22. package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.js +1 -45
  23. package/dist/src/modules/analyzer/IntelligentAnalyzer.d.ts +1 -37
  24. package/dist/src/modules/analyzer/IntelligentAnalyzer.js +9 -142
  25. package/dist/src/modules/analyzer/PatternDetector.js +3 -3
  26. package/dist/src/modules/analyzer/PatternDetectorAuthPatterns.js +1 -1
  27. package/dist/src/modules/browser/BrowserDiscovery.d.ts +6 -5
  28. package/dist/src/modules/browser/BrowserDiscovery.js +3 -3
  29. package/dist/src/modules/browser/BrowserModeManager.d.ts +1 -1
  30. package/dist/src/modules/browser/BrowserModeManager.js +11 -10
  31. package/dist/src/modules/browser/TabRegistry.js +2 -2
  32. package/dist/src/modules/browser/UnifiedBrowserManager.d.ts +1 -0
  33. package/dist/src/modules/browser/UnifiedBrowserManager.js +19 -4
  34. package/dist/src/modules/captcha/AICaptchaDetector.d.ts +14 -23
  35. package/dist/src/modules/captcha/AICaptchaDetector.js +8 -202
  36. package/dist/src/modules/captcha/CaptchaDetector.d.ts +31 -17
  37. package/dist/src/modules/captcha/CaptchaDetector.js +1 -1
  38. package/dist/src/modules/collector/CodeCache.d.ts +2 -2
  39. package/dist/src/modules/collector/CodeCollector.d.ts +12 -9
  40. package/dist/src/modules/collector/CodeCollector.js +5 -6
  41. package/dist/src/modules/collector/DOMInspector.d.ts +3 -2
  42. package/dist/src/modules/collector/DOMInspector.js +49 -59
  43. package/dist/src/modules/collector/PageController.d.ts +17 -4
  44. package/dist/src/modules/collector/PageController.js +2 -5
  45. package/dist/src/modules/collector/PageScriptCollectors.js +3 -3
  46. package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -4
  47. package/dist/src/modules/crypto/CryptoDetector.js +2 -42
  48. package/dist/src/modules/crypto/CryptoRules.js +1 -1
  49. package/dist/src/modules/debugger/BlackboxManager.js +1 -1
  50. package/dist/src/modules/debugger/DebuggerManager.impl.core.scope.js +1 -1
  51. package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +5 -3
  52. package/dist/src/modules/debugger/WatchExpressionManager.js +1 -1
  53. package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -4
  54. package/dist/src/modules/deobfuscator/Deobfuscator.js +4 -39
  55. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.d.ts +0 -3
  56. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.js +2 -8
  57. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +2 -3
  58. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +5 -57
  59. package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
  60. package/dist/src/modules/deobfuscator/PackerDeobfuscator.js +1 -1
  61. package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +2 -10
  62. package/dist/src/modules/deobfuscator/VMDeobfuscator.js +3 -128
  63. package/dist/src/modules/deobfuscator/webcrack.js +15 -2
  64. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.d.ts +5 -8
  65. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +10 -102
  66. package/dist/src/modules/emulator/EnvironmentEmulator.d.ts +1 -5
  67. package/dist/src/modules/emulator/EnvironmentEmulator.js +7 -91
  68. package/dist/src/modules/emulator/EnvironmentEmulatorFetch.js +58 -61
  69. package/dist/src/modules/emulator/templates/chrome-env.d.ts +17 -7
  70. package/dist/src/modules/emulator/templates/chrome-env.js +14 -7
  71. package/dist/src/modules/external/ExternalToolRunner.d.ts +1 -1
  72. package/dist/src/modules/external/ExternalToolRunner.js +26 -23
  73. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.d.ts +13 -0
  74. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.js +42 -0
  75. package/dist/src/modules/monitor/FetchInterceptor.d.ts +46 -0
  76. package/dist/src/modules/monitor/FetchInterceptor.js +191 -0
  77. package/dist/src/modules/monitor/PerformanceMonitor.js +8 -7
  78. package/dist/src/modules/process/BaseMemoryManager.d.ts +1 -1
  79. package/dist/src/modules/process/LinuxProcessManager.js +4 -2
  80. package/dist/src/modules/process/MacProcessManager.js +1 -1
  81. package/dist/src/modules/process/MemoryManager.d.ts +1 -1
  82. package/dist/src/modules/process/MemoryManager.js +2 -2
  83. package/dist/src/modules/process/ProcessManager.impl.js +1 -1
  84. package/dist/src/modules/process/memory/AuditTrail.js +1 -1
  85. package/dist/src/modules/process/memory/reader.js +35 -3
  86. package/dist/src/modules/process/memory/regions.enumerate.js +1 -1
  87. package/dist/src/modules/process/memory/regions.protection.js +42 -9
  88. package/dist/src/modules/process/memory/scanner.d.ts +5 -1
  89. package/dist/src/modules/process/memory/scanner.darwin.js +57 -0
  90. package/dist/src/modules/process/memory/scanner.js +88 -4
  91. package/dist/src/modules/process/memory/writer.js +44 -4
  92. package/dist/src/modules/security/ExecutionSandbox.js +7 -8
  93. package/dist/src/modules/stealth/FingerprintManager.js +1 -1
  94. package/dist/src/modules/stealth/StealthScripts.d.ts +4 -2
  95. package/dist/src/modules/stealth/StealthScripts.js +53 -14
  96. package/dist/src/modules/stealth/StealthVerifier.d.ts +1 -1
  97. package/dist/src/modules/stealth/StealthVerifier.js +2 -4
  98. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.d.ts +14 -0
  99. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.js +181 -2
  100. package/dist/src/modules/trace/TraceDB.js +12 -6
  101. package/dist/src/modules/trace/TraceRecorder.js +1 -5
  102. package/dist/src/native/AntiCheatDetector.js +67 -16
  103. package/dist/src/native/CodeInjector.js +4 -4
  104. package/dist/src/native/HardwareBreakpoint.js +25 -16
  105. package/dist/src/native/HeapAnalyzer.js +2 -2
  106. package/dist/src/native/MemoryController.js +1 -1
  107. package/dist/src/native/MemoryScanSession.js +2 -2
  108. package/dist/src/native/MemoryScanner.js +4 -8
  109. package/dist/src/native/NativeMemoryManager.impl.js +2 -2
  110. package/dist/src/native/PEAnalyzer.js +14 -15
  111. package/dist/src/native/PointerChainEngine.js +2 -4
  112. package/dist/src/native/ScriptLoader.js +4 -9
  113. package/dist/src/native/Speedhack.js +1 -1
  114. package/dist/src/native/StructureAnalyzer.js +52 -33
  115. package/dist/src/native/Win32API.d.ts +1 -0
  116. package/dist/src/native/Win32API.js +13 -0
  117. package/dist/src/native/Win32Debug.js +19 -19
  118. package/dist/src/native/platform/darwin/DarwinAPI.d.ts +2 -0
  119. package/dist/src/native/platform/darwin/DarwinAPI.js +8 -0
  120. package/dist/src/native/platform/darwin/DarwinMemoryProvider.js +6 -1
  121. package/dist/src/server/MCPServer.context.d.ts +2 -1
  122. package/dist/src/server/MCPServer.d.ts +2 -1
  123. package/dist/src/server/MCPServer.domain.d.ts +1 -1
  124. package/dist/src/server/MCPServer.domain.js +81 -16
  125. package/dist/src/server/MCPServer.js +42 -14
  126. package/dist/src/server/MCPServer.resources.d.ts +2 -0
  127. package/dist/src/server/MCPServer.resources.js +91 -0
  128. package/dist/src/server/MCPServer.search.handlers.call.js +2 -1
  129. package/dist/src/server/MCPServer.search.helpers.js +2 -2
  130. package/dist/src/server/MCPServer.tools.js +1 -1
  131. package/dist/src/server/MCPServer.transport.js +12 -0
  132. package/dist/src/server/ToolCallContextGuard.d.ts +5 -0
  133. package/dist/src/server/ToolCallContextGuard.js +85 -0
  134. package/dist/src/server/ToolRouter.d.ts +26 -10
  135. package/dist/src/server/ToolRouter.intent.d.ts +26 -0
  136. package/dist/src/server/ToolRouter.intent.js +77 -0
  137. package/dist/src/server/ToolRouter.js +103 -284
  138. package/dist/src/server/ToolRouter.policy.d.ts +22 -0
  139. package/dist/src/server/ToolRouter.policy.js +163 -0
  140. package/dist/src/server/ToolRouter.probe.d.ts +17 -0
  141. package/dist/src/server/ToolRouter.probe.js +103 -0
  142. package/dist/src/server/ToolRouter.renderer.d.ts +9 -0
  143. package/dist/src/server/ToolRouter.renderer.js +52 -0
  144. package/dist/src/server/activation/ActivationController.js +15 -12
  145. package/dist/src/server/activation/CompoundConditionEngine.js +1 -1
  146. package/dist/src/server/activation/PredictiveBooster.js +1 -3
  147. package/dist/src/server/domains/analysis/definitions.js +155 -655
  148. package/dist/src/server/domains/analysis/handlers.impl.d.ts +8 -8
  149. package/dist/src/server/domains/analysis/handlers.impl.js +34 -28
  150. package/dist/src/server/domains/analysis/handlers.web-tools.js +4 -3
  151. package/dist/src/server/domains/analysis/manifest.js +6 -4
  152. package/dist/src/server/domains/antidebug/definitions.js +25 -111
  153. package/dist/src/server/domains/browser/definitions.tools.advanced.js +59 -88
  154. package/dist/src/server/domains/browser/definitions.tools.behavior.js +120 -227
  155. package/dist/src/server/domains/browser/definitions.tools.page-core.js +157 -386
  156. package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
  157. package/dist/src/server/domains/browser/definitions.tools.runtime.js +61 -174
  158. package/dist/src/server/domains/browser/definitions.tools.security.js +92 -237
  159. package/dist/src/server/domains/browser/handlers/camoufox-browser.js +3 -2
  160. package/dist/src/server/domains/browser/handlers/captcha-solver.js +3 -3
  161. package/dist/src/server/domains/browser/handlers/dom-query.js +2 -1
  162. package/dist/src/server/domains/browser/handlers/facade-initializer.d.ts +3 -3
  163. package/dist/src/server/domains/browser/handlers/facade-initializer.js +3 -3
  164. package/dist/src/server/domains/browser/handlers/framework-state.js +231 -3
  165. package/dist/src/server/domains/browser/handlers/indexeddb-dump.js +21 -20
  166. package/dist/src/server/domains/browser/handlers/script-management.js +1 -1
  167. package/dist/src/server/domains/browser/handlers/stealth-injection.js +8 -2
  168. package/dist/src/server/domains/browser/handlers.impl.d.ts +15 -12
  169. package/dist/src/server/domains/browser/handlers.impl.js +5 -6
  170. package/dist/src/server/domains/browser/manifest.js +37 -13
  171. package/dist/src/server/domains/coordination/definitions.js +50 -149
  172. package/dist/src/server/domains/coordination/index.d.ts +20 -1
  173. package/dist/src/server/domains/coordination/index.js +133 -0
  174. package/dist/src/server/domains/coordination/manifest.js +15 -0
  175. package/dist/src/server/domains/debugger/definitions.tools.advanced.js +72 -189
  176. package/dist/src/server/domains/debugger/definitions.tools.core.js +114 -288
  177. package/dist/src/server/domains/debugger/manifest.js +9 -2
  178. package/dist/src/server/domains/encoding/definitions.js +43 -153
  179. package/dist/src/server/domains/encoding/handlers.base.js +2 -2
  180. package/dist/src/server/domains/evidence/definitions.d.ts +2 -0
  181. package/dist/src/server/domains/evidence/definitions.js +42 -0
  182. package/dist/src/server/domains/evidence/handlers.d.ts +582 -0
  183. package/dist/src/server/domains/evidence/handlers.js +60 -0
  184. package/dist/src/server/domains/evidence/index.d.ts +2 -0
  185. package/dist/src/server/domains/evidence/index.js +2 -0
  186. package/dist/src/server/domains/evidence/manifest.d.ts +63 -0
  187. package/dist/src/server/domains/evidence/manifest.js +78 -0
  188. package/dist/src/server/domains/graphql/definitions.js +53 -141
  189. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +92 -114
  190. package/dist/src/server/domains/hooks/ai-handlers.d.ts +0 -7
  191. package/dist/src/server/domains/hooks/ai-handlers.js +4 -70
  192. package/dist/src/server/domains/hooks/definitions.js +69 -335
  193. package/dist/src/server/domains/hooks/manifest.d.ts +1 -1
  194. package/dist/src/server/domains/hooks/manifest.js +1 -2
  195. package/dist/src/server/domains/instrumentation/definitions.d.ts +2 -0
  196. package/dist/src/server/domains/instrumentation/definitions.js +99 -0
  197. package/dist/src/server/domains/instrumentation/handlers.d.ts +78 -0
  198. package/dist/src/server/domains/instrumentation/handlers.js +206 -0
  199. package/dist/src/server/domains/instrumentation/index.d.ts +2 -0
  200. package/dist/src/server/domains/instrumentation/index.js +2 -0
  201. package/dist/src/server/domains/instrumentation/manifest.d.ts +63 -0
  202. package/dist/src/server/domains/instrumentation/manifest.js +114 -0
  203. package/dist/src/server/domains/macro/definitions.js +16 -43
  204. package/dist/src/server/domains/maintenance/definitions.js +60 -219
  205. package/dist/src/server/domains/maintenance/handlers.d.ts +2 -2
  206. package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
  207. package/dist/src/server/domains/maintenance/handlers.js +2 -2
  208. package/dist/src/server/domains/memory/definitions.js +387 -559
  209. package/dist/src/server/domains/memory/handlers/hooks.d.ts +55 -0
  210. package/dist/src/server/domains/memory/handlers/hooks.js +115 -0
  211. package/dist/src/server/domains/memory/handlers/integrity.d.ts +77 -0
  212. package/dist/src/server/domains/memory/handlers/integrity.js +180 -0
  213. package/dist/src/server/domains/memory/handlers/pointer-chain.d.ts +29 -0
  214. package/dist/src/server/domains/memory/handlers/pointer-chain.js +82 -0
  215. package/dist/src/server/domains/memory/handlers/readwrite.d.ts +41 -0
  216. package/dist/src/server/domains/memory/handlers/readwrite.js +78 -0
  217. package/dist/src/server/domains/memory/handlers/scan.d.ts +35 -0
  218. package/dist/src/server/domains/memory/handlers/scan.js +97 -0
  219. package/dist/src/server/domains/memory/handlers/session.d.ts +23 -0
  220. package/dist/src/server/domains/memory/handlers/session.js +49 -0
  221. package/dist/src/server/domains/memory/handlers/structure.d.ts +29 -0
  222. package/dist/src/server/domains/memory/handlers/structure.js +74 -0
  223. package/dist/src/server/domains/memory/handlers.impl.d.ts +49 -54
  224. package/dist/src/server/domains/memory/handlers.impl.js +63 -494
  225. package/dist/src/server/domains/memory/manifest.js +236 -64
  226. package/dist/src/server/domains/native-bridge/definitions.js +54 -192
  227. package/dist/src/server/domains/native-bridge/index.d.ts +1 -0
  228. package/dist/src/server/domains/native-bridge/index.js +2 -1
  229. package/dist/src/server/domains/network/auth-extractor.js +1 -1
  230. package/dist/src/server/domains/network/definitions.js +175 -578
  231. package/dist/src/server/domains/network/handlers.base.core.d.ts +64 -0
  232. package/dist/src/server/domains/network/handlers.base.core.js +623 -0
  233. package/dist/src/server/domains/network/handlers.base.d.ts +2 -124
  234. package/dist/src/server/domains/network/handlers.base.js +3 -878
  235. package/dist/src/server/domains/network/handlers.base.performance.d.ts +63 -0
  236. package/dist/src/server/domains/network/handlers.base.performance.js +193 -0
  237. package/dist/src/server/domains/network/handlers.base.types.d.ts +42 -0
  238. package/dist/src/server/domains/network/handlers.base.types.js +89 -0
  239. package/dist/src/server/domains/network/handlers.impl.core.runtime.d.ts +1 -1
  240. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.d.ts +21 -0
  241. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.js +186 -0
  242. package/dist/src/server/domains/network/handlers.impl.core.runtime.js +1 -1
  243. package/dist/src/server/domains/network/manifest.js +15 -0
  244. package/dist/src/server/domains/network/replay.js +1 -4
  245. package/dist/src/server/domains/platform/definitions.js +121 -112
  246. package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +5 -1
  247. package/dist/src/server/domains/platform/handlers/bridge-handlers.js +194 -5
  248. package/dist/src/server/domains/platform/handlers/electron-asar-helpers.js +26 -6
  249. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.d.ts +3 -0
  250. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.js +170 -0
  251. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.d.ts +3 -0
  252. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.js +193 -0
  253. package/dist/src/server/domains/platform/handlers/electron-handlers.d.ts +6 -0
  254. package/dist/src/server/domains/platform/handlers/electron-handlers.js +95 -2
  255. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.d.ts +2 -0
  256. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.js +370 -0
  257. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.d.ts +2 -0
  258. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.js +78 -0
  259. package/dist/src/server/domains/platform/handlers/miniapp-handlers.d.ts +1 -1
  260. package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +4 -4
  261. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.d.ts +2 -0
  262. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.js +207 -0
  263. package/dist/src/server/domains/platform/handlers.d.ts +48 -0
  264. package/dist/src/server/domains/platform/handlers.js +29 -0
  265. package/dist/src/server/domains/platform/manifest.js +38 -0
  266. package/dist/src/server/domains/process/definitions.js +163 -647
  267. package/dist/src/server/domains/process/handlers.base.d.ts +3 -95
  268. package/dist/src/server/domains/process/handlers.base.js +7 -462
  269. package/dist/src/server/domains/process/handlers.base.process.d.ts +61 -0
  270. package/dist/src/server/domains/process/handlers.base.process.js +417 -0
  271. package/dist/src/server/domains/process/handlers.base.types.d.ts +57 -0
  272. package/dist/src/server/domains/process/handlers.base.types.js +50 -0
  273. package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +19 -17
  274. package/dist/src/server/domains/process/manifest.js +6 -1
  275. package/dist/src/server/domains/sandbox/definitions.js +11 -33
  276. package/dist/src/server/domains/sandbox/handlers.js +8 -3
  277. package/dist/src/server/domains/shared/ResponseBuilder.d.ts +209 -0
  278. package/dist/src/server/domains/shared/ResponseBuilder.js +48 -0
  279. package/dist/src/server/domains/shared/modules.d.ts +0 -2
  280. package/dist/src/server/domains/shared/modules.js +0 -1
  281. package/dist/src/server/domains/sourcemap/definitions.js +27 -111
  282. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-common.js +7 -2
  283. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-main.js +1 -1
  284. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-parse-base.js +1 -1
  285. package/dist/src/server/domains/sourcemap/manifest.d.ts +1 -1
  286. package/dist/src/server/domains/sourcemap/manifest.js +1 -1
  287. package/dist/src/server/domains/streaming/definitions.js +36 -148
  288. package/dist/src/server/domains/streaming/handlers.impl.streaming-sse.js +163 -164
  289. package/dist/src/server/domains/streaming/handlers.impl.streaming-ws.js +1 -1
  290. package/dist/src/server/domains/trace/TraceSummarizer.d.ts +60 -0
  291. package/dist/src/server/domains/trace/TraceSummarizer.js +112 -0
  292. package/dist/src/server/domains/trace/definitions.tools.js +51 -176
  293. package/dist/src/server/domains/trace/handlers.d.ts +2 -1
  294. package/dist/src/server/domains/trace/handlers.js +62 -9
  295. package/dist/src/server/domains/trace/index.d.ts +2 -1
  296. package/dist/src/server/domains/trace/index.js +2 -1
  297. package/dist/src/server/domains/trace/manifest.js +18 -4
  298. package/dist/src/server/domains/transform/definitions.js +50 -210
  299. package/dist/src/server/domains/transform/handlers.impl.transform-base.js +6 -6
  300. package/dist/src/server/domains/transform/handlers.impl.transform-crypto.js +18 -19
  301. package/dist/src/server/domains/transform/manifest.d.ts +1 -1
  302. package/dist/src/server/domains/transform/manifest.js +1 -1
  303. package/dist/src/server/domains/wasm/definitions.js +55 -232
  304. package/dist/src/server/domains/wasm/handlers.js +3 -3
  305. package/dist/src/server/domains/workflow/definitions.js +144 -414
  306. package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +2 -2
  307. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.d.ts +2 -0
  308. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +126 -87
  309. package/dist/src/server/domains/workflow/handlers.impl.workflow-batch.js +5 -5
  310. package/dist/src/server/evidence/ReverseEvidenceGraph.d.ts +20 -0
  311. package/dist/src/server/evidence/ReverseEvidenceGraph.js +208 -0
  312. package/dist/src/server/evidence/index.d.ts +2 -0
  313. package/dist/src/server/evidence/index.js +1 -0
  314. package/dist/src/server/evidence/types.d.ts +22 -0
  315. package/dist/src/server/evidence/types.js +1 -0
  316. package/dist/src/server/extensions/ExtensionManager.d.ts +1 -0
  317. package/dist/src/server/extensions/ExtensionManager.discovery.js +72 -9
  318. package/dist/src/server/extensions/ExtensionManager.integrity.js +1 -1
  319. package/dist/src/server/extensions/ExtensionManager.js +193 -40
  320. package/dist/src/server/extensions/ExtensionManager.roots.d.ts +1 -1
  321. package/dist/src/server/extensions/ExtensionManager.roots.js +19 -9
  322. package/dist/src/server/extensions/plugin-config.js +1 -1
  323. package/dist/src/server/extensions/plugin-env.d.ts +1 -1
  324. package/dist/src/server/extensions/plugin-env.js +10 -4
  325. package/dist/src/server/extensions/types.d.ts +17 -0
  326. package/dist/src/server/extensions/types.js +1 -1
  327. package/dist/src/server/http/HttpMiddleware.js +1 -1
  328. package/dist/src/server/instrumentation/EvidenceGraphBridge.d.ts +13 -0
  329. package/dist/src/server/instrumentation/EvidenceGraphBridge.js +150 -0
  330. package/dist/src/server/instrumentation/InstrumentationSession.d.ts +60 -0
  331. package/dist/src/server/instrumentation/InstrumentationSession.js +269 -0
  332. package/dist/src/server/instrumentation/index.d.ts +2 -0
  333. package/dist/src/server/instrumentation/index.js +2 -0
  334. package/dist/src/server/instrumentation/types.d.ts +62 -0
  335. package/dist/src/server/instrumentation/types.js +7 -0
  336. package/dist/src/server/macros/MacroConfigLoader.d.ts +6 -5
  337. package/dist/src/server/macros/MacroConfigLoader.js +61 -59
  338. package/dist/src/server/macros/MacroRunner.js +6 -2
  339. package/dist/src/server/macros/builtins/index.d.ts +2 -3
  340. package/dist/src/server/macros/builtins/index.js +51 -7
  341. package/dist/src/server/plugins/PluginContract.d.ts +1 -1
  342. package/dist/src/server/registry/contracts.d.ts +7 -1
  343. package/dist/src/server/registry/discovery.js +5 -4
  344. package/dist/src/server/registry/ensure-browser-core.js +0 -3
  345. package/dist/src/server/registry/index.js +4 -4
  346. package/dist/src/server/registry/tool-builder.d.ts +46 -0
  347. package/dist/src/server/registry/tool-builder.js +105 -0
  348. package/dist/src/server/sandbox/MCPBridge.d.ts +9 -0
  349. package/dist/src/server/sandbox/MCPBridge.js +22 -0
  350. package/dist/src/server/sandbox/QuickJSSandbox.d.ts +4 -1
  351. package/dist/src/server/sandbox/QuickJSSandbox.js +162 -2
  352. package/dist/src/server/sandbox/types.d.ts +13 -0
  353. package/dist/src/server/search/AffinityGraph.d.ts +7 -1
  354. package/dist/src/server/search/AffinityGraph.js +24 -3
  355. package/dist/src/server/search/EmbeddingWorker.js +5 -3
  356. package/dist/src/server/search/FeedbackTracker.d.ts +9 -0
  357. package/dist/src/server/search/FeedbackTracker.js +26 -0
  358. package/dist/src/server/search/QueryNormalizer.d.ts +6 -0
  359. package/dist/src/server/search/QueryNormalizer.js +94 -0
  360. package/dist/src/server/search/ToolSearchEngineImpl.d.ts +2 -3
  361. package/dist/src/server/search/ToolSearchEngineImpl.js +38 -88
  362. package/dist/src/server/workflows/WorkflowContract.d.ts +24 -0
  363. package/dist/src/server/workflows/WorkflowContract.js +12 -0
  364. package/dist/src/server/workflows/WorkflowEngine.d.ts +1 -0
  365. package/dist/src/server/workflows/WorkflowEngine.js +136 -3
  366. package/dist/src/types/config.d.ts +0 -14
  367. package/dist/src/types/deobfuscator.d.ts +0 -1
  368. package/dist/src/types/index.d.ts +1 -1
  369. package/dist/src/utils/DetailedDataManager.js +2 -0
  370. package/dist/src/utils/RingBuffer.js +5 -5
  371. package/dist/src/utils/TokenBudgetManager.js +1 -1
  372. package/dist/src/utils/UnifiedCacheManager.d.ts +1 -1
  373. package/dist/src/utils/UnifiedCacheManager.js +3 -3
  374. package/dist/src/utils/artifactRetention.js +2 -2
  375. package/dist/src/utils/betterSqlite3.d.ts +11 -0
  376. package/dist/src/utils/betterSqlite3.js +88 -0
  377. package/dist/src/utils/browserExecutable.js +2 -2
  378. package/dist/src/utils/cliFastPath.js +17 -6
  379. package/dist/src/utils/config.js +4 -26
  380. package/dist/src/utils/environmentDoctor.js +138 -11
  381. package/dist/src/utils/outputPaths.js +16 -9
  382. package/dist/src/utils/parallel.js +1 -3
  383. package/package.json +76 -72
  384. package/scripts/postinstall.cjs +37 -37
  385. package/src/native/scripts/linux/enum-windows.sh +12 -12
  386. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  387. package/src/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  388. package/src/native/scripts/windows/enum-windows.ps1 +44 -44
  389. package/src/native/scripts/windows/inject-dll.ps1 +21 -21
  390. package/workflows/.gitkeep +0 -0
  391. package/dist/src/modules/analyzer/AISummarizer.d.ts +0 -39
  392. package/dist/src/modules/analyzer/AISummarizer.js +0 -122
  393. package/dist/src/modules/hook/AIHookGenerator.d.ts +0 -52
  394. package/dist/src/modules/hook/AIHookGenerator.js +0 -360
  395. package/dist/src/modules/hook/AIHookGeneratorTemplates.d.ts +0 -9
  396. package/dist/src/modules/hook/AIHookGeneratorTemplates.js +0 -157
  397. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.d.ts +0 -2
  398. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.js +0 -25
  399. package/dist/src/server/macros/builtins/unpacker-flow.d.ts +0 -2
  400. package/dist/src/server/macros/builtins/unpacker-flow.js +0 -25
  401. package/dist/src/services/LLMService.d.ts +0 -37
  402. package/dist/src/services/LLMService.js +0 -233
  403. package/dist/src/services/prompts/analysis.d.ts +0 -9
  404. package/dist/src/services/prompts/analysis.js +0 -158
  405. package/dist/src/services/prompts/crypto.d.ts +0 -2
  406. package/dist/src/services/prompts/crypto.js +0 -108
  407. package/dist/src/services/prompts/deobfuscation.d.ts +0 -6
  408. package/dist/src/services/prompts/deobfuscation.js +0 -300
  409. package/dist/src/services/prompts/environment.d.ts +0 -16
  410. package/dist/src/services/prompts/environment.js +0 -372
  411. package/dist/src/services/prompts/intelligence.d.ts +0 -4
  412. package/dist/src/services/prompts/intelligence.js +0 -250
  413. package/dist/src/services/prompts/taint.d.ts +0 -2
  414. package/dist/src/services/prompts/taint.js +0 -54
@@ -1,247 +1,46 @@
1
1
  import { logger } from '../utils/logger.js';
2
- import { allTools, getToolDomain } from './ToolCatalog.js';
2
+ import {} from './ToolSearch.js';
3
+ import { ensureWorkflowsLoaded } from './extensions/ExtensionManager.js';
3
4
  import { getActiveToolNames } from './MCPServer.search.helpers.js';
4
- import { normalizeToolName } from './MCPServer.search.validation.js';
5
- import { ToolSearchEngine } from './ToolSearch.js';
6
- import { getAllManifests } from './registry/index.js';
7
- let _allToolsByName = null;
8
- function getAllToolsByName() {
9
- if (!_allToolsByName)
10
- _allToolsByName = new Map(allTools.map((t) => [t.name, t]));
11
- return _allToolsByName;
12
- }
13
- let _cachedWorkflowRules = null;
14
- function getEffectiveWorkflowRules() {
15
- if (_cachedWorkflowRules)
16
- return _cachedWorkflowRules;
17
- const rules = [];
18
- for (const m of getAllManifests()) {
19
- if (m.workflowRule) {
20
- rules.push({
21
- patterns: [...m.workflowRule.patterns],
22
- domain: m.domain,
23
- priority: m.workflowRule.priority,
24
- tools: [...m.workflowRule.tools],
25
- hint: m.workflowRule.hint,
26
- });
27
- }
28
- }
29
- _cachedWorkflowRules = rules.sort((a, b) => b.priority - a.priority);
30
- return _cachedWorkflowRules;
31
- }
32
- const BROWSER_OR_NETWORK_TASK_PATTERN = /(browser|page|navigate|click|type|screenshot|scrape|network|request|response|api|traffic|hook|capture|intercept|monitor|浏览器|页面|导航|点击|输入|截图|爬取|网络|请求|响应|接口|流量|抓包|拦截|监控)/i;
33
- const MAINTENANCE_TASK_PATTERN = /(token budget|cache|artifact|extension|plugin|reload|doctor|cleanup|memory|profile|tool list|令牌预算|缓存|工件|扩展|插件|重载|环境诊断|清理|内存|配置)/i;
34
- let _cachedPrerequisites = null;
35
- function getEffectivePrerequisites() {
36
- if (_cachedPrerequisites)
37
- return _cachedPrerequisites;
38
- const merged = {};
39
- for (const m of getAllManifests()) {
40
- if (m.prerequisites) {
41
- for (const [toolName, entries] of Object.entries(m.prerequisites)) {
42
- merged[toolName] = entries.map((e) => ({
43
- condition: e.condition,
44
- check: () => false,
45
- fix: e.fix,
46
- }));
47
- }
48
- }
49
- }
50
- _cachedPrerequisites = merged;
51
- return _cachedPrerequisites;
52
- }
53
- function detectWorkflowIntent(query) {
54
- const matches = [];
55
- for (const rule of getEffectiveWorkflowRules()) {
56
- for (const pattern of rule.patterns) {
57
- if (pattern.test(query)) {
58
- matches.push(rule);
59
- break;
60
- }
61
- }
62
- }
63
- if (matches.length === 0)
64
- return null;
65
- matches.sort((a, b) => b.priority - a.priority);
66
- return matches[0];
67
- }
68
- function getToolInputSchema(toolName, ctx) {
69
- const canonicalName = normalizeToolName(toolName);
70
- const builtInTool = getAllToolsByName().get(canonicalName);
71
- if (builtInTool) {
72
- return builtInTool.inputSchema;
73
- }
74
- const extTool = ctx.extensionToolsByName.get(canonicalName);
75
- if (extTool) {
76
- return extTool.tool.inputSchema;
77
- }
78
- const metaTool = ctx.metaToolsByName.get(canonicalName);
79
- if (metaTool) {
80
- return metaTool.inputSchema;
81
- }
82
- return undefined;
83
- }
84
- function getToolDescription(toolName, ctx) {
85
- const canonicalName = normalizeToolName(toolName);
86
- const builtInTool = getAllToolsByName().get(canonicalName);
87
- if (builtInTool?.description) {
88
- return builtInTool.description.split('\n')[0] || 'No description available';
89
- }
90
- const extTool = ctx.extensionToolsByName.get(canonicalName);
91
- if (extTool?.tool?.description) {
92
- return extTool.tool.description.split('\n')[0] || 'No description available';
93
- }
94
- const metaTool = ctx.metaToolsByName.get(canonicalName);
95
- if (metaTool?.description) {
96
- return metaTool.description.split('\n')[0] || 'No description available';
97
- }
98
- return 'No description available';
99
- }
100
- function isActive(toolName, ctx) {
101
- const canonicalName = normalizeToolName(toolName);
102
- const activeTools = new Set([
103
- ...ctx.selectedTools.map((tool) => tool.name),
104
- ...ctx.activatedToolNames,
105
- ]);
106
- return activeTools.has(canonicalName);
107
- }
108
- function getAvailableToolNames(ctx) {
109
- return new Set([...allTools.map((tool) => tool.name), ...ctx.extensionToolsByName.keys()]);
110
- }
111
- async function probeActivePage(ctx) {
112
- if (!ctx.pageController || typeof ctx.pageController.getPage !== 'function')
113
- return false;
114
- try {
115
- return Boolean(await ctx.pageController.getPage());
116
- }
117
- catch {
118
- return false;
119
- }
120
- }
121
- function probeNetworkEnabled(ctx) {
122
- if (!ctx.consoleMonitor)
123
- return false;
124
- try {
125
- if (typeof ctx.consoleMonitor.getNetworkStatus === 'function') {
126
- return Boolean(ctx.consoleMonitor.getNetworkStatus().enabled);
127
- }
128
- if (typeof ctx.consoleMonitor.isNetworkEnabled === 'function') {
129
- return Boolean(ctx.consoleMonitor.isNetworkEnabled());
130
- }
131
- }
132
- catch { }
133
- return false;
134
- }
135
- function probeCapturedRequests(ctx) {
136
- if (!ctx.consoleMonitor || typeof ctx.consoleMonitor.getNetworkRequests !== 'function')
137
- return 0;
138
- try {
139
- const requests = ctx.consoleMonitor.getNetworkRequests({ limit: 1 });
140
- return Array.isArray(requests) ? requests.length : 0;
141
- }
142
- catch {
143
- try {
144
- const requests = ctx.consoleMonitor.getNetworkRequests();
145
- return Array.isArray(requests) ? requests.length : 0;
146
- }
147
- catch {
148
- return 0;
149
- }
150
- }
151
- }
152
- async function getRoutingState(ctx) {
153
- return {
154
- hasActivePage: await probeActivePage(ctx),
155
- networkEnabled: probeNetworkEnabled(ctx),
156
- capturedRequestCount: probeCapturedRequests(ctx),
157
- };
158
- }
159
- function buildWorkflowToolSequence(workflow, state, availableToolNames) {
160
- const sequence = [];
161
- const pushIfAvailable = (toolName) => {
162
- if (availableToolNames.has(toolName) && !sequence.includes(toolName)) {
163
- sequence.push(toolName);
164
- }
165
- };
166
- if ((workflow.domain === 'browser' || workflow.domain === 'network') && !state.hasActivePage) {
167
- pushIfAvailable('browser_launch');
168
- pushIfAvailable('browser_attach');
169
- }
170
- if (workflow.domain === 'network') {
171
- if (state.hasActivePage && !state.networkEnabled) {
172
- pushIfAvailable('network_enable');
173
- }
174
- if (state.hasActivePage && state.networkEnabled && state.capturedRequestCount > 0) {
175
- pushIfAvailable('network_get_requests');
176
- }
177
- }
178
- for (const toolName of workflow.tools) {
179
- pushIfAvailable(toolName);
180
- }
181
- if (workflow.domain === 'network' && state.hasActivePage && state.networkEnabled) {
182
- pushIfAvailable('network_get_requests');
183
- }
184
- return sequence;
185
- }
186
- function isBrowserOrNetworkTask(task, workflow) {
187
- return (workflow?.domain === 'browser' ||
188
- workflow?.domain === 'network' ||
189
- BROWSER_OR_NETWORK_TASK_PATTERN.test(task));
190
- }
191
- function isMaintenanceTask(task) {
192
- return MAINTENANCE_TASK_PATTERN.test(task);
193
- }
194
- function rerankResultsForContext(results, task, workflow, state) {
195
- const browserOrNetworkTask = isBrowserOrNetworkTask(task, workflow);
196
- const maintenanceTask = isMaintenanceTask(task);
197
- const reranked = results.map((result) => {
198
- let score = result.score;
199
- if (browserOrNetworkTask && !maintenanceTask && result.domain === 'maintenance') {
200
- score *= 0.1;
201
- }
202
- if (browserOrNetworkTask) {
203
- if (!state.hasActivePage && result.name === 'browser_launch') {
204
- score *= 1.4;
205
- }
206
- if (!state.hasActivePage && result.name === 'browser_attach') {
207
- score *= 1.2;
208
- }
209
- if (state.hasActivePage && !state.networkEnabled && result.name === 'network_enable') {
210
- score *= 1.35;
211
- }
212
- if (state.hasActivePage &&
213
- state.networkEnabled &&
214
- state.capturedRequestCount > 0 &&
215
- result.name === 'network_get_requests') {
216
- score *= 1.5;
217
- }
218
- }
219
- return {
220
- ...result,
221
- score,
222
- };
223
- });
224
- reranked.sort((a, b) => b.score - a.score);
225
- return reranked;
226
- }
5
+ import { detectWorkflowIntent, matchWorkflowRoute, isBrowserOrNetworkTask, isMaintenanceTask, } from './ToolRouter.intent.js';
6
+ import { getAvailableToolNames, getRoutingState, isToolActive, getToolDomainFromContext, getToolInputSchema, } from './ToolRouter.probe.js';
7
+ import { getEffectivePrerequisites, buildWorkflowToolSequence, buildPresetRecommendations, buildWorkflowRouteRecommendation, buildRouteMatchMetadata, rerankResultsForContext, } from './ToolRouter.policy.js';
8
+ import { buildCallToolCommand, generateExampleArgs } from './ToolRouter.renderer.js';
227
9
  export async function routeToolRequest(request, ctx, searchEngine) {
228
10
  const { task, context = {} } = request;
229
11
  const maxRecommendations = context.maxRecommendations || 5;
230
12
  logger.info('[ToolRouter] Routing request', { task, context });
13
+ await ensureWorkflowsLoaded(ctx);
231
14
  const workflow = detectWorkflowIntent(task);
232
15
  const activeNames = getActiveToolNames(ctx);
233
16
  const routingState = await getRoutingState(ctx);
234
17
  const availableToolNames = getAvailableToolNames(ctx);
18
+ const routeMatch = matchWorkflowRoute(task, ctx);
19
+ let presetPlannedToolNames = null;
235
20
  const searchResults = await searchEngine.search(task, maxRecommendations * 2, activeNames);
236
21
  let finalResults = [];
237
- if (workflow) {
22
+ if (routeMatch?.workflow.route.kind === 'preset') {
23
+ const presetTools = buildPresetRecommendations(routeMatch, routingState, ctx, availableToolNames);
24
+ presetPlannedToolNames = new Set(presetTools.map((tool) => tool.name));
25
+ const presetNames = new Set(presetTools.map((tool) => tool.name));
26
+ const otherResults = searchResults.filter((result) => !presetNames.has(result.name));
27
+ finalResults = [...presetTools, ...otherResults];
28
+ }
29
+ else if (routeMatch?.workflow.route.kind === 'workflow') {
30
+ const workflowResult = buildWorkflowRouteRecommendation(routeMatch, ctx);
31
+ const otherResults = searchResults.filter((result) => result.name !== workflowResult.name);
32
+ finalResults = [workflowResult, ...otherResults];
33
+ }
34
+ else if (workflow) {
238
35
  const workflowSequence = buildWorkflowToolSequence(workflow, routingState, availableToolNames);
239
36
  const workflowTools = workflowSequence.map((name, index) => ({
240
37
  name,
241
- domain: getToolDomain(name) ?? ctx.extensionToolsByName.get(name)?.domain ?? null,
242
- shortDescription: getToolDescription(name, ctx),
38
+ domain: getToolDomainFromContext(name, ctx),
39
+ shortDescription: searchResults.find((r) => r.name === name)?.shortDescription ??
40
+ ctx.extensionToolsByName.get(name)?.tool.description ??
41
+ '',
243
42
  score: workflow.priority - index * 0.01,
244
- isActive: isActive(name, ctx),
43
+ isActive: isToolActive(name, ctx),
245
44
  }));
246
45
  const workflowNames = new Set(workflowSequence);
247
46
  const otherResults = searchResults.filter((result) => !workflowNames.has(result.name));
@@ -268,10 +67,12 @@ export async function routeToolRequest(request, ctx, searchEngine) {
268
67
  }));
269
68
  finalResults.sort((a, b) => b.score - a.score);
270
69
  }
271
- finalResults = finalResults.slice(0, maxRecommendations);
70
+ const recommendationLimit = Math.max(maxRecommendations, presetPlannedToolNames?.size ?? 0);
71
+ finalResults = finalResults.slice(0, recommendationLimit);
72
+ const routeMatchMetadata = routeMatch ? buildRouteMatchMetadata(routeMatch, ctx) : undefined;
272
73
  const recommendations = finalResults.map((result) => {
273
74
  const schema = getToolInputSchema(result.name, ctx);
274
- const toolIsActive = isActive(result.name, ctx);
75
+ const toolIsActive = isToolActive(result.name, ctx);
275
76
  const recommendation = {
276
77
  name: result.name,
277
78
  domain: result.domain,
@@ -295,15 +96,79 @@ export async function routeToolRequest(request, ctx, searchEngine) {
295
96
  return recommendation;
296
97
  });
297
98
  const nextActions = [];
298
- const inactiveTools = recommendations.filter((recommendation) => !recommendation.isActive);
99
+ const presetRecommendations = presetPlannedToolNames
100
+ ? recommendations.filter((recommendation) => presetPlannedToolNames.has(recommendation.name))
101
+ : [];
102
+ const inactiveTools = (presetRecommendations.length > 0 ? presetRecommendations : recommendations).filter((recommendation) => !recommendation.isActive);
299
103
  const activationCandidates = (() => {
300
- if (!isBrowserOrNetworkTask(task, workflow) || isMaintenanceTask(task)) {
104
+ if (presetRecommendations.length > 0 ||
105
+ !isBrowserOrNetworkTask(task, workflow) ||
106
+ isMaintenanceTask(task)) {
301
107
  return inactiveTools;
302
108
  }
303
109
  const nonMaintenanceTools = inactiveTools.filter((tool) => tool.domain !== 'maintenance');
304
110
  return nonMaintenanceTools.length > 0 ? nonMaintenanceTools : inactiveTools;
305
111
  })();
306
- if (recommendations.length > 0 && recommendations[0]?.isActive) {
112
+ if (routeMatchMetadata?.kind === 'preset' && presetRecommendations.length > 0) {
113
+ let stepNumber = 1;
114
+ if (activationCandidates.length > 0) {
115
+ nextActions.push({
116
+ step: stepNumber++,
117
+ action: 'activate',
118
+ toolName: activationCandidates.length === 1 ? activationCandidates[0].name : undefined,
119
+ command: `activate_tools with names: [${activationCandidates.map((tool) => `"${tool.name}"`).join(', ')}]`,
120
+ description: `Activate ${activationCandidates.length} preset tool${activationCandidates.length === 1 ? '' : 's'} for ${routeMatchMetadata.name}`,
121
+ });
122
+ }
123
+ const bootstrapRecommendations = recommendations.filter((recommendation) => recommendation.name === 'browser_launch' || recommendation.name === 'browser_attach');
124
+ for (const bootstrap of bootstrapRecommendations) {
125
+ nextActions.push({
126
+ step: stepNumber++,
127
+ action: 'call',
128
+ toolName: bootstrap.name,
129
+ command: bootstrap.name,
130
+ exampleArgs: generateExampleArgs(bootstrap.inputSchema),
131
+ description: bootstrap.description,
132
+ });
133
+ }
134
+ for (const step of routeMatchMetadata.steps) {
135
+ const recommendation = presetRecommendations.find((item) => item.name === step.toolName);
136
+ nextActions.push({
137
+ step: stepNumber++,
138
+ action: 'call',
139
+ toolName: step.toolName,
140
+ command: step.toolName,
141
+ exampleArgs: generateExampleArgs(recommendation?.inputSchema ??
142
+ getToolInputSchema(step.toolName, ctx) ?? { type: 'object' }),
143
+ description: `${step.id}: ${step.description}`,
144
+ });
145
+ }
146
+ }
147
+ else if (routeMatchMetadata?.kind === 'workflow') {
148
+ const workflowRecommendation = recommendations.find((recommendation) => recommendation.name === 'run_extension_workflow');
149
+ let stepNumber = 1;
150
+ if (!workflowRecommendation.isActive) {
151
+ nextActions.push({
152
+ step: stepNumber++,
153
+ action: 'activate',
154
+ toolName: workflowRecommendation.name,
155
+ command: `activate_tools with names: ["${workflowRecommendation.name}"]`,
156
+ description: `Activate workflow runner for ${routeMatchMetadata.name}`,
157
+ });
158
+ }
159
+ nextActions.push({
160
+ step: stepNumber,
161
+ action: 'call',
162
+ toolName: 'run_extension_workflow',
163
+ command: 'run_extension_workflow',
164
+ exampleArgs: {
165
+ ...generateExampleArgs(workflowRecommendation.inputSchema),
166
+ workflowId: routeMatchMetadata.id,
167
+ },
168
+ description: `Execute routed workflow ${routeMatchMetadata.name}`,
169
+ });
170
+ }
171
+ else if (recommendations.length > 0 && recommendations[0]?.isActive) {
307
172
  nextActions.push({
308
173
  step: 1,
309
174
  action: 'call',
@@ -334,57 +199,11 @@ export async function routeToolRequest(request, ctx, searchEngine) {
334
199
  return {
335
200
  recommendations,
336
201
  nextActions,
337
- workflowHint: workflow?.hint,
202
+ workflowHint: routeMatchMetadata
203
+ ? `${routeMatchMetadata.kind === 'preset' ? 'Preset' : 'Workflow'} ${routeMatchMetadata.name}: ${routeMatchMetadata.description}`
204
+ : workflow?.hint,
205
+ routeMatch: routeMatchMetadata,
338
206
  autoActivated: false,
339
207
  };
340
208
  }
341
- export function buildCallToolCommand(toolName, schema) {
342
- return `call_tool({ name: "${toolName}", args: ${JSON.stringify(generateExampleArgs(schema))} })`;
343
- }
344
- export function generateExampleArgs(schema) {
345
- if (!schema || schema.type !== 'object' || !schema.properties) {
346
- return {};
347
- }
348
- const example = {};
349
- const required = new Set(Array.isArray(schema.required) ? schema.required : []);
350
- for (const [key, prop] of Object.entries(schema.properties)) {
351
- const propSchema = prop;
352
- if (!required.has(key) && propSchema.default === undefined) {
353
- continue;
354
- }
355
- if (propSchema.default !== undefined) {
356
- example[key] = propSchema.default;
357
- }
358
- else if (propSchema.enum && Array.isArray(propSchema.enum) && propSchema.enum.length > 0) {
359
- example[key] = propSchema.enum[0];
360
- }
361
- else if (propSchema.type === 'string') {
362
- example[key] = `<${key}>`;
363
- }
364
- else if (propSchema.type === 'number' || propSchema.type === 'integer') {
365
- example[key] = 0;
366
- }
367
- else if (propSchema.type === 'boolean') {
368
- example[key] = false;
369
- }
370
- else if (propSchema.type === 'array') {
371
- example[key] = [];
372
- }
373
- else if (propSchema.type === 'object') {
374
- example[key] = {};
375
- }
376
- }
377
- return example;
378
- }
379
- export function describeTool(toolName, ctx) {
380
- const canonicalName = normalizeToolName(toolName);
381
- const schema = getToolInputSchema(canonicalName, ctx);
382
- if (!schema) {
383
- return null;
384
- }
385
- return {
386
- name: canonicalName,
387
- description: getToolDescription(canonicalName, ctx),
388
- inputSchema: schema,
389
- };
390
- }
209
+ export { buildCallToolCommand, describeTool, generateExampleArgs, } from './ToolRouter.renderer.js';
@@ -0,0 +1,22 @@
1
+ import type { MCPServerContext } from './MCPServer.context.js';
2
+ import type { ToolSearchResult } from './ToolSearch.js';
3
+ import type { WorkflowRule, RoutedWorkflowMatch } from './ToolRouter.intent.js';
4
+ import type { RoutingState } from './ToolRouter.probe.js';
5
+ import type { RouterResponse } from './ToolRouter.js';
6
+ export interface PrerequisiteEntry {
7
+ condition: string;
8
+ check: (state: RoutingState) => boolean;
9
+ fix: string;
10
+ }
11
+ interface PlannedTool {
12
+ name: string;
13
+ description: string;
14
+ }
15
+ export declare function getEffectivePrerequisites(): Record<string, PrerequisiteEntry[]>;
16
+ export declare function buildWorkflowToolSequence(workflow: WorkflowRule, state: RoutingState, availableToolNames: Set<string>): string[];
17
+ export declare function buildPresetToolSequence(match: RoutedWorkflowMatch, state: RoutingState, availableToolNames: Set<string>): PlannedTool[];
18
+ export declare function buildPresetRecommendations(match: RoutedWorkflowMatch, state: RoutingState, ctx: MCPServerContext, availableToolNames: Set<string>): ToolSearchResult[];
19
+ export declare function buildWorkflowRouteRecommendation(match: RoutedWorkflowMatch, ctx: MCPServerContext): ToolSearchResult;
20
+ export declare function buildRouteMatchMetadata(match: RoutedWorkflowMatch, ctx: MCPServerContext): NonNullable<RouterResponse['routeMatch']>;
21
+ export declare function rerankResultsForContext(results: ToolSearchResult[], task: string, workflow: WorkflowRule | null, state: RoutingState): ToolSearchResult[];
22
+ export {};
@@ -0,0 +1,163 @@
1
+ import { getToolDomain } from './ToolCatalog.js';
2
+ import { getAllManifests } from './registry/index.js';
3
+ import { isBrowserOrNetworkTask, isMaintenanceTask } from './ToolRouter.intent.js';
4
+ import { isToolActive, getToolDomainFromContext } from './ToolRouter.probe.js';
5
+ function buildPrerequisiteCheck(condition) {
6
+ if (condition.includes('Browser must be launched')) {
7
+ return (state) => state.hasActivePage;
8
+ }
9
+ if (condition.includes('Network monitoring must be enabled')) {
10
+ return (state) => state.networkEnabled;
11
+ }
12
+ if (condition.includes('Debugger must be enabled')) {
13
+ return (state) => state.hasActivePage;
14
+ }
15
+ if (condition.includes('Debugger must be attached')) {
16
+ return (state) => state.hasActivePage;
17
+ }
18
+ if (condition.includes('Page must be navigated')) {
19
+ return (state) => state.hasActivePage;
20
+ }
21
+ if (condition.includes('WebSocket monitoring')) {
22
+ return (state) => state.hasActivePage;
23
+ }
24
+ return () => false;
25
+ }
26
+ let _cachedPrerequisites = null;
27
+ export function getEffectivePrerequisites() {
28
+ if (_cachedPrerequisites)
29
+ return _cachedPrerequisites;
30
+ const merged = {};
31
+ for (const m of getAllManifests()) {
32
+ if (m.prerequisites) {
33
+ for (const [toolName, entries] of Object.entries(m.prerequisites)) {
34
+ merged[toolName] = entries.map((e) => ({
35
+ condition: e.condition,
36
+ check: buildPrerequisiteCheck(e.condition),
37
+ fix: e.fix,
38
+ }));
39
+ }
40
+ }
41
+ }
42
+ _cachedPrerequisites = merged;
43
+ return _cachedPrerequisites;
44
+ }
45
+ export function buildWorkflowToolSequence(workflow, state, availableToolNames) {
46
+ const sequence = [];
47
+ const pushIfAvailable = (toolName) => {
48
+ if (availableToolNames.has(toolName) && !sequence.includes(toolName)) {
49
+ sequence.push(toolName);
50
+ }
51
+ };
52
+ if ((workflow.domain === 'browser' || workflow.domain === 'network') && !state.hasActivePage) {
53
+ pushIfAvailable('browser_launch');
54
+ pushIfAvailable('browser_attach');
55
+ }
56
+ if (workflow.domain === 'network') {
57
+ if (state.hasActivePage && !state.networkEnabled) {
58
+ pushIfAvailable('network_enable');
59
+ }
60
+ if (state.hasActivePage && state.networkEnabled && state.capturedRequestCount > 0) {
61
+ pushIfAvailable('network_get_requests');
62
+ }
63
+ }
64
+ for (const toolName of workflow.tools) {
65
+ pushIfAvailable(toolName);
66
+ }
67
+ if (workflow.domain === 'network' && state.hasActivePage && state.networkEnabled) {
68
+ pushIfAvailable('network_get_requests');
69
+ }
70
+ return sequence;
71
+ }
72
+ export function buildPresetToolSequence(match, state, availableToolNames) {
73
+ const sequence = [];
74
+ const seen = new Set();
75
+ const requiresBrowserSession = match.workflow.route.requiredDomains.includes('browser') ||
76
+ match.workflow.route.requiredDomains.includes('network');
77
+ const pushIfAvailable = (toolName, description) => {
78
+ if (!availableToolNames.has(toolName) || seen.has(toolName)) {
79
+ return;
80
+ }
81
+ seen.add(toolName);
82
+ sequence.push({ name: toolName, description });
83
+ };
84
+ if (!state.hasActivePage && requiresBrowserSession) {
85
+ pushIfAvailable('browser_launch', 'Launch a browser session before executing the preset');
86
+ pushIfAvailable('browser_attach', 'Attach preset tooling to the active browser session before capture begins');
87
+ }
88
+ for (const step of match.workflow.route.steps) {
89
+ pushIfAvailable(step.toolName, step.description);
90
+ }
91
+ return sequence;
92
+ }
93
+ export function buildPresetRecommendations(match, state, ctx, availableToolNames) {
94
+ return buildPresetToolSequence(match, state, availableToolNames).map((plannedTool, index) => ({
95
+ name: plannedTool.name,
96
+ domain: getToolDomainFromContext(plannedTool.name, ctx),
97
+ shortDescription: plannedTool.description,
98
+ score: match.workflow.route.priority + match.confidence - index * 0.01,
99
+ isActive: isToolActive(plannedTool.name, ctx),
100
+ }));
101
+ }
102
+ export function buildWorkflowRouteRecommendation(match, ctx) {
103
+ return {
104
+ name: 'run_extension_workflow',
105
+ domain: getToolDomainFromContext('run_extension_workflow', ctx),
106
+ shortDescription: `Execute routed workflow ${match.workflow.name} (${match.workflow.id}) via run_extension_workflow`,
107
+ score: match.workflow.route.priority + match.confidence,
108
+ isActive: isToolActive('run_extension_workflow', ctx),
109
+ };
110
+ }
111
+ export function buildRouteMatchMetadata(match, ctx) {
112
+ return {
113
+ kind: match.workflow.route.kind,
114
+ id: match.workflow.id,
115
+ name: match.workflow.name,
116
+ description: match.workflow.description,
117
+ confidence: match.confidence,
118
+ matchedPattern: match.matchedPattern,
119
+ requiredDomains: [...match.workflow.route.requiredDomains],
120
+ steps: match.workflow.route.steps.map((step) => ({
121
+ id: step.id,
122
+ toolName: step.toolName,
123
+ domain: getToolDomain(step.toolName) ?? ctx.extensionToolsByName.get(step.toolName)?.domain ?? null,
124
+ description: step.description,
125
+ prerequisites: [...step.prerequisites],
126
+ parallel: step.parallel,
127
+ isActive: isToolActive(step.toolName, ctx),
128
+ })),
129
+ };
130
+ }
131
+ export function rerankResultsForContext(results, task, workflow, state) {
132
+ const browserOrNetworkTask = isBrowserOrNetworkTask(task, workflow);
133
+ const maintenanceTask = isMaintenanceTask(task);
134
+ const reranked = results.map((result) => {
135
+ let score = result.score;
136
+ if (browserOrNetworkTask && !maintenanceTask && result.domain === 'maintenance') {
137
+ score *= 0.1;
138
+ }
139
+ if (browserOrNetworkTask) {
140
+ if (!state.hasActivePage && result.name === 'browser_launch') {
141
+ score *= 1.4;
142
+ }
143
+ if (!state.hasActivePage && result.name === 'browser_attach') {
144
+ score *= 1.2;
145
+ }
146
+ if (state.hasActivePage && !state.networkEnabled && result.name === 'network_enable') {
147
+ score *= 1.35;
148
+ }
149
+ if (state.hasActivePage &&
150
+ state.networkEnabled &&
151
+ state.capturedRequestCount > 0 &&
152
+ result.name === 'network_get_requests') {
153
+ score *= 1.5;
154
+ }
155
+ }
156
+ return {
157
+ ...result,
158
+ score,
159
+ };
160
+ });
161
+ reranked.sort((a, b) => b.score - a.score);
162
+ return reranked;
163
+ }
@@ -0,0 +1,17 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { MCPServerContext } from './MCPServer.context.js';
3
+ export interface RoutingState {
4
+ hasActivePage: boolean;
5
+ networkEnabled: boolean;
6
+ capturedRequestCount: number;
7
+ }
8
+ export declare function getAllToolsByName(): Map<string, Tool>;
9
+ export declare function getToolInputSchema(toolName: string, ctx: MCPServerContext): Tool['inputSchema'] | undefined;
10
+ export declare function getToolDescription(toolName: string, ctx: MCPServerContext): string;
11
+ export declare function isToolActive(toolName: string, ctx: MCPServerContext): boolean;
12
+ export declare function getAvailableToolNames(ctx: MCPServerContext): Set<string>;
13
+ export declare function getToolDomainFromContext(toolName: string, ctx: MCPServerContext): string | null;
14
+ export declare function probeActivePage(ctx: MCPServerContext): Promise<boolean>;
15
+ export declare function probeNetworkEnabled(ctx: MCPServerContext): boolean;
16
+ export declare function probeCapturedRequests(ctx: MCPServerContext): number;
17
+ export declare function getRoutingState(ctx: MCPServerContext): Promise<RoutingState>;