@jshookmcp/jshook 0.2.3 → 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 (385) hide show
  1. package/README.md +14 -5
  2. package/README.zh.md +18 -3
  3. package/dist/packages/extension-sdk/src/bridges/shared.js +2 -2
  4. package/dist/packages/extension-sdk/src/plugin.d.ts +5 -0
  5. package/dist/packages/extension-sdk/src/plugin.js +119 -33
  6. package/dist/packages/extension-sdk/src/workflow.d.ts +156 -0
  7. package/dist/packages/extension-sdk/src/workflow.js +236 -0
  8. package/dist/src/config/search-defaults.js +161 -0
  9. package/dist/src/constants.d.ts +3 -0
  10. package/dist/src/constants.js +4 -1
  11. package/dist/src/index.d.ts +1 -1
  12. package/dist/src/index.js +13 -17
  13. package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -3
  14. package/dist/src/modules/analyzer/CodeAnalyzer.js +16 -28
  15. package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.d.ts +1 -2
  16. package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.js +1 -45
  17. package/dist/src/modules/analyzer/IntelligentAnalyzer.d.ts +1 -37
  18. package/dist/src/modules/analyzer/IntelligentAnalyzer.js +9 -142
  19. package/dist/src/modules/analyzer/PatternDetector.js +3 -3
  20. package/dist/src/modules/analyzer/PatternDetectorAuthPatterns.js +1 -1
  21. package/dist/src/modules/browser/BrowserDiscovery.js +2 -2
  22. package/dist/src/modules/browser/BrowserModeManager.js +11 -10
  23. package/dist/src/modules/browser/TabRegistry.js +2 -2
  24. package/dist/src/modules/browser/UnifiedBrowserManager.d.ts +1 -0
  25. package/dist/src/modules/browser/UnifiedBrowserManager.js +18 -3
  26. package/dist/src/modules/captcha/AICaptchaDetector.d.ts +1 -10
  27. package/dist/src/modules/captcha/AICaptchaDetector.js +7 -201
  28. package/dist/src/modules/collector/CodeCollector.js +4 -5
  29. package/dist/src/modules/collector/DOMInspector.js +48 -58
  30. package/dist/src/modules/collector/PageController.d.ts +17 -4
  31. package/dist/src/modules/collector/PageController.js +2 -5
  32. package/dist/src/modules/collector/PageScriptCollectors.js +3 -3
  33. package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -4
  34. package/dist/src/modules/crypto/CryptoDetector.js +2 -42
  35. package/dist/src/modules/crypto/CryptoRules.js +1 -1
  36. package/dist/src/modules/debugger/BlackboxManager.js +1 -1
  37. package/dist/src/modules/debugger/DebuggerManager.impl.core.scope.js +1 -1
  38. package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +4 -2
  39. package/dist/src/modules/debugger/WatchExpressionManager.js +1 -1
  40. package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -4
  41. package/dist/src/modules/deobfuscator/Deobfuscator.js +4 -39
  42. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.d.ts +0 -3
  43. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.js +2 -8
  44. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +1 -2
  45. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +3 -55
  46. package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
  47. package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +2 -10
  48. package/dist/src/modules/deobfuscator/VMDeobfuscator.js +3 -128
  49. package/dist/src/modules/deobfuscator/webcrack.js +15 -2
  50. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.d.ts +5 -8
  51. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +10 -102
  52. package/dist/src/modules/emulator/EnvironmentEmulator.d.ts +1 -5
  53. package/dist/src/modules/emulator/EnvironmentEmulator.js +7 -91
  54. package/dist/src/modules/emulator/EnvironmentEmulatorFetch.js +58 -61
  55. package/dist/src/modules/emulator/templates/chrome-env.d.ts +17 -7
  56. package/dist/src/modules/emulator/templates/chrome-env.js +14 -7
  57. package/dist/src/modules/external/ExternalToolRunner.js +25 -22
  58. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.compose.js +5 -5
  59. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.network.js +311 -311
  60. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.runtime.js +410 -410
  61. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.storage.js +122 -122
  62. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.d.ts +13 -0
  63. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.js +42 -0
  64. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.dynamic.js +194 -194
  65. package/dist/src/modules/monitor/FetchInterceptor.d.ts +46 -0
  66. package/dist/src/modules/monitor/FetchInterceptor.js +191 -0
  67. package/dist/src/modules/monitor/PerformanceMonitor.js +8 -7
  68. package/dist/src/modules/monitor/PlaywrightNetworkMonitor.js +62 -62
  69. package/dist/src/modules/process/BaseMemoryManager.d.ts +1 -1
  70. package/dist/src/modules/process/LinuxProcessManager.js +2 -0
  71. package/dist/src/modules/process/MacProcessManager.js +25 -25
  72. package/dist/src/modules/process/MemoryManager.d.ts +1 -1
  73. package/dist/src/modules/process/MemoryManager.js +2 -2
  74. package/dist/src/modules/process/memory/AuditTrail.js +1 -1
  75. package/dist/src/modules/process/memory/availability.js +49 -49
  76. package/dist/src/modules/process/memory/injector.js +185 -185
  77. package/dist/src/modules/process/memory/reader.js +85 -53
  78. package/dist/src/modules/process/memory/regions.dump.js +51 -51
  79. package/dist/src/modules/process/memory/regions.enumerate.js +108 -108
  80. package/dist/src/modules/process/memory/regions.modules.js +80 -80
  81. package/dist/src/modules/process/memory/regions.protection.js +148 -115
  82. package/dist/src/modules/process/memory/scanner.d.ts +5 -1
  83. package/dist/src/modules/process/memory/scanner.darwin.js +98 -41
  84. package/dist/src/modules/process/memory/scanner.js +88 -4
  85. package/dist/src/modules/process/memory/scanner.windows.js +124 -124
  86. package/dist/src/modules/process/memory/writer.js +98 -58
  87. package/dist/src/modules/security/ExecutionSandbox.js +51 -52
  88. package/dist/src/modules/stealth/FingerprintManager.js +1 -1
  89. package/dist/src/modules/stealth/StealthScripts.d.ts +1 -0
  90. package/dist/src/modules/stealth/StealthScripts.js +18 -13
  91. package/dist/src/modules/stealth/StealthVerifier.js +1 -3
  92. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.d.ts +14 -0
  93. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.js +181 -2
  94. package/dist/src/modules/trace/TraceDB.js +75 -69
  95. package/dist/src/modules/trace/TraceRecorder.js +1 -5
  96. package/dist/src/native/AntiCheatDetector.js +67 -16
  97. package/dist/src/native/CodeInjector.js +3 -3
  98. package/dist/src/native/HardwareBreakpoint.js +24 -15
  99. package/dist/src/native/HeapAnalyzer.js +2 -2
  100. package/dist/src/native/MemoryController.js +1 -1
  101. package/dist/src/native/MemoryScanSession.js +2 -2
  102. package/dist/src/native/MemoryScanner.js +4 -8
  103. package/dist/src/native/NativeMemoryManager.impl.js +2 -2
  104. package/dist/src/native/PEAnalyzer.js +14 -15
  105. package/dist/src/native/PointerChainEngine.js +2 -4
  106. package/dist/src/native/ScriptLoader.js +4 -9
  107. package/dist/src/native/Speedhack.js +1 -1
  108. package/dist/src/native/StructureAnalyzer.js +52 -33
  109. package/dist/src/native/Win32API.d.ts +1 -0
  110. package/dist/src/native/Win32API.js +13 -0
  111. package/dist/src/native/Win32Debug.js +19 -19
  112. package/dist/src/native/platform/darwin/DarwinAPI.d.ts +2 -0
  113. package/dist/src/native/platform/darwin/DarwinAPI.js +8 -0
  114. package/dist/src/native/platform/darwin/DarwinMemoryProvider.js +6 -1
  115. package/dist/src/server/MCPServer.context.d.ts +2 -1
  116. package/dist/src/server/MCPServer.d.ts +2 -1
  117. package/dist/src/server/MCPServer.domain.d.ts +1 -1
  118. package/dist/src/server/MCPServer.domain.js +81 -16
  119. package/dist/src/server/MCPServer.js +41 -14
  120. package/dist/src/server/MCPServer.resources.d.ts +2 -0
  121. package/dist/src/server/MCPServer.resources.js +91 -0
  122. package/dist/src/server/MCPServer.search.handlers.call.js +2 -1
  123. package/dist/src/server/MCPServer.search.helpers.js +1 -1
  124. package/dist/src/server/MCPServer.transport.js +12 -0
  125. package/dist/src/server/ToolCallContextGuard.js +8 -0
  126. package/dist/src/server/ToolRouter.d.ts +25 -9
  127. package/dist/src/server/ToolRouter.intent.d.ts +26 -0
  128. package/dist/src/server/ToolRouter.intent.js +77 -0
  129. package/dist/src/server/ToolRouter.js +103 -284
  130. package/dist/src/server/ToolRouter.policy.d.ts +22 -0
  131. package/dist/src/server/ToolRouter.policy.js +163 -0
  132. package/dist/src/server/ToolRouter.probe.d.ts +17 -0
  133. package/dist/src/server/ToolRouter.probe.js +103 -0
  134. package/dist/src/server/ToolRouter.renderer.d.ts +9 -0
  135. package/dist/src/server/ToolRouter.renderer.js +52 -0
  136. package/dist/src/server/activation/ActivationController.js +15 -12
  137. package/dist/src/server/activation/CompoundConditionEngine.js +1 -1
  138. package/dist/src/server/activation/PredictiveBooster.js +1 -3
  139. package/dist/src/server/domains/analysis/definitions.js +155 -655
  140. package/dist/src/server/domains/analysis/handlers.impl.js +26 -20
  141. package/dist/src/server/domains/analysis/handlers.web-tools.js +2 -1
  142. package/dist/src/server/domains/analysis/manifest.js +6 -4
  143. package/dist/src/server/domains/antidebug/definitions.js +25 -111
  144. package/dist/src/server/domains/browser/definitions.tools.advanced.js +59 -88
  145. package/dist/src/server/domains/browser/definitions.tools.behavior.js +120 -227
  146. package/dist/src/server/domains/browser/definitions.tools.page-core.js +210 -439
  147. package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
  148. package/dist/src/server/domains/browser/definitions.tools.runtime.js +98 -211
  149. package/dist/src/server/domains/browser/definitions.tools.security.js +194 -339
  150. package/dist/src/server/domains/browser/handlers/camoufox-browser.js +3 -2
  151. package/dist/src/server/domains/browser/handlers/captcha-solver.js +3 -3
  152. package/dist/src/server/domains/browser/handlers/dom-query.js +2 -1
  153. package/dist/src/server/domains/browser/handlers/framework-state.js +27 -9
  154. package/dist/src/server/domains/browser/handlers/indexeddb-dump.js +21 -20
  155. package/dist/src/server/domains/browser/handlers/script-management.js +1 -1
  156. package/dist/src/server/domains/browser/handlers.impl.d.ts +1 -2
  157. package/dist/src/server/domains/browser/handlers.impl.js +2 -3
  158. package/dist/src/server/domains/browser/manifest.js +37 -13
  159. package/dist/src/server/domains/coordination/definitions.js +50 -216
  160. package/dist/src/server/domains/coordination/index.d.ts +2 -1
  161. package/dist/src/server/domains/coordination/index.js +1 -0
  162. package/dist/src/server/domains/debugger/definitions.tools.advanced.js +72 -189
  163. package/dist/src/server/domains/debugger/definitions.tools.core.js +114 -288
  164. package/dist/src/server/domains/debugger/manifest.js +9 -2
  165. package/dist/src/server/domains/encoding/definitions.js +43 -153
  166. package/dist/src/server/domains/encoding/handlers.base.js +2 -2
  167. package/dist/src/server/domains/evidence/definitions.d.ts +2 -0
  168. package/dist/src/server/domains/evidence/definitions.js +42 -0
  169. package/dist/src/server/domains/evidence/handlers.d.ts +582 -0
  170. package/dist/src/server/domains/evidence/handlers.js +60 -0
  171. package/dist/src/server/domains/evidence/index.d.ts +2 -0
  172. package/dist/src/server/domains/evidence/index.js +2 -0
  173. package/dist/src/server/domains/evidence/manifest.d.ts +63 -0
  174. package/dist/src/server/domains/evidence/manifest.js +78 -0
  175. package/dist/src/server/domains/graphql/definitions.js +53 -141
  176. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +92 -114
  177. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.shared.js +77 -77
  178. package/dist/src/server/domains/hooks/ai-handlers.d.ts +0 -7
  179. package/dist/src/server/domains/hooks/ai-handlers.js +1 -67
  180. package/dist/src/server/domains/hooks/definitions.js +69 -335
  181. package/dist/src/server/domains/hooks/manifest.d.ts +1 -1
  182. package/dist/src/server/domains/hooks/manifest.js +1 -2
  183. package/dist/src/server/domains/instrumentation/definitions.d.ts +2 -0
  184. package/dist/src/server/domains/instrumentation/definitions.js +99 -0
  185. package/dist/src/server/domains/instrumentation/handlers.d.ts +78 -0
  186. package/dist/src/server/domains/instrumentation/handlers.js +206 -0
  187. package/dist/src/server/domains/instrumentation/index.d.ts +2 -0
  188. package/dist/src/server/domains/instrumentation/index.js +2 -0
  189. package/dist/src/server/domains/instrumentation/manifest.d.ts +63 -0
  190. package/dist/src/server/domains/instrumentation/manifest.js +114 -0
  191. package/dist/src/server/domains/macro/definitions.js +16 -43
  192. package/dist/src/server/domains/maintenance/definitions.js +60 -219
  193. package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
  194. package/dist/src/server/domains/memory/definitions.js +387 -559
  195. package/dist/src/server/domains/memory/handlers/hooks.d.ts +55 -0
  196. package/dist/src/server/domains/memory/handlers/hooks.js +115 -0
  197. package/dist/src/server/domains/memory/handlers/integrity.d.ts +77 -0
  198. package/dist/src/server/domains/memory/handlers/integrity.js +180 -0
  199. package/dist/src/server/domains/memory/handlers/pointer-chain.d.ts +29 -0
  200. package/dist/src/server/domains/memory/handlers/pointer-chain.js +82 -0
  201. package/dist/src/server/domains/memory/handlers/readwrite.d.ts +41 -0
  202. package/dist/src/server/domains/memory/handlers/readwrite.js +78 -0
  203. package/dist/src/server/domains/memory/handlers/scan.d.ts +35 -0
  204. package/dist/src/server/domains/memory/handlers/scan.js +97 -0
  205. package/dist/src/server/domains/memory/handlers/session.d.ts +23 -0
  206. package/dist/src/server/domains/memory/handlers/session.js +49 -0
  207. package/dist/src/server/domains/memory/handlers/structure.d.ts +29 -0
  208. package/dist/src/server/domains/memory/handlers/structure.js +74 -0
  209. package/dist/src/server/domains/memory/handlers.impl.d.ts +49 -54
  210. package/dist/src/server/domains/memory/handlers.impl.js +63 -494
  211. package/dist/src/server/domains/memory/manifest.js +236 -64
  212. package/dist/src/server/domains/native-bridge/definitions.js +54 -192
  213. package/dist/src/server/domains/native-bridge/index.d.ts +1 -0
  214. package/dist/src/server/domains/native-bridge/index.js +2 -1
  215. package/dist/src/server/domains/network/auth-extractor.js +1 -1
  216. package/dist/src/server/domains/network/definitions.js +175 -578
  217. package/dist/src/server/domains/network/handlers.base.core.d.ts +64 -0
  218. package/dist/src/server/domains/network/handlers.base.core.js +623 -0
  219. package/dist/src/server/domains/network/handlers.base.d.ts +2 -124
  220. package/dist/src/server/domains/network/handlers.base.js +3 -878
  221. package/dist/src/server/domains/network/handlers.base.performance.d.ts +63 -0
  222. package/dist/src/server/domains/network/handlers.base.performance.js +193 -0
  223. package/dist/src/server/domains/network/handlers.base.types.d.ts +42 -0
  224. package/dist/src/server/domains/network/handlers.base.types.js +89 -0
  225. package/dist/src/server/domains/network/handlers.impl.core.runtime.d.ts +1 -1
  226. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.d.ts +21 -0
  227. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.js +186 -0
  228. package/dist/src/server/domains/network/handlers.impl.core.runtime.js +1 -1
  229. package/dist/src/server/domains/network/manifest.js +15 -0
  230. package/dist/src/server/domains/network/replay.js +1 -4
  231. package/dist/src/server/domains/platform/definitions.js +121 -112
  232. package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +4 -0
  233. package/dist/src/server/domains/platform/handlers/bridge-handlers.js +193 -4
  234. package/dist/src/server/domains/platform/handlers/electron-asar-helpers.js +26 -6
  235. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.d.ts +3 -0
  236. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.js +170 -0
  237. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.d.ts +3 -0
  238. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.js +193 -0
  239. package/dist/src/server/domains/platform/handlers/electron-handlers.d.ts +6 -0
  240. package/dist/src/server/domains/platform/handlers/electron-handlers.js +95 -2
  241. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.d.ts +2 -0
  242. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.js +370 -0
  243. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.d.ts +2 -0
  244. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.js +78 -0
  245. package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +3 -3
  246. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.d.ts +2 -0
  247. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.js +207 -0
  248. package/dist/src/server/domains/platform/handlers.d.ts +48 -0
  249. package/dist/src/server/domains/platform/handlers.js +29 -0
  250. package/dist/src/server/domains/platform/manifest.js +38 -0
  251. package/dist/src/server/domains/process/definitions.js +163 -647
  252. package/dist/src/server/domains/process/handlers.base.d.ts +3 -95
  253. package/dist/src/server/domains/process/handlers.base.js +7 -462
  254. package/dist/src/server/domains/process/handlers.base.process.d.ts +61 -0
  255. package/dist/src/server/domains/process/handlers.base.process.js +417 -0
  256. package/dist/src/server/domains/process/handlers.base.types.d.ts +57 -0
  257. package/dist/src/server/domains/process/handlers.base.types.js +50 -0
  258. package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +18 -16
  259. package/dist/src/server/domains/process/manifest.js +6 -1
  260. package/dist/src/server/domains/sandbox/definitions.js +11 -33
  261. package/dist/src/server/domains/sandbox/handlers.js +8 -3
  262. package/dist/src/server/domains/shared/ResponseBuilder.d.ts +209 -0
  263. package/dist/src/server/domains/shared/ResponseBuilder.js +48 -0
  264. package/dist/src/server/domains/shared/modules.d.ts +0 -2
  265. package/dist/src/server/domains/shared/modules.js +0 -1
  266. package/dist/src/server/domains/sourcemap/definitions.js +27 -111
  267. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-common.js +7 -2
  268. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-main.js +1 -1
  269. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-parse-base.js +1 -1
  270. package/dist/src/server/domains/sourcemap/manifest.d.ts +1 -1
  271. package/dist/src/server/domains/sourcemap/manifest.js +1 -1
  272. package/dist/src/server/domains/streaming/definitions.js +36 -148
  273. package/dist/src/server/domains/streaming/handlers.impl.streaming-sse.js +163 -164
  274. package/dist/src/server/domains/streaming/handlers.impl.streaming-ws.js +1 -1
  275. package/dist/src/server/domains/trace/TraceSummarizer.js +8 -5
  276. package/dist/src/server/domains/trace/definitions.tools.js +51 -206
  277. package/dist/src/server/domains/trace/handlers.js +10 -12
  278. package/dist/src/server/domains/trace/index.d.ts +2 -1
  279. package/dist/src/server/domains/trace/index.js +2 -1
  280. package/dist/src/server/domains/trace/manifest.js +15 -3
  281. package/dist/src/server/domains/transform/definitions.js +50 -210
  282. package/dist/src/server/domains/transform/handlers.impl.transform-base.js +108 -108
  283. package/dist/src/server/domains/transform/handlers.impl.transform-crypto.js +18 -19
  284. package/dist/src/server/domains/transform/manifest.d.ts +1 -1
  285. package/dist/src/server/domains/transform/manifest.js +1 -1
  286. package/dist/src/server/domains/wasm/definitions.js +55 -232
  287. package/dist/src/server/domains/wasm/handlers.js +1 -1
  288. package/dist/src/server/domains/workflow/definitions.js +144 -414
  289. package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +1 -1
  290. package/dist/src/server/domains/workflow/handlers.impl.workflow-api.js +51 -51
  291. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.d.ts +2 -0
  292. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +126 -87
  293. package/dist/src/server/domains/workflow/handlers.impl.workflow-batch.js +5 -5
  294. package/dist/src/server/evidence/ReverseEvidenceGraph.d.ts +20 -0
  295. package/dist/src/server/evidence/ReverseEvidenceGraph.js +208 -0
  296. package/dist/src/server/evidence/index.d.ts +2 -0
  297. package/dist/src/server/evidence/index.js +1 -0
  298. package/dist/src/server/evidence/types.d.ts +22 -0
  299. package/dist/src/server/evidence/types.js +1 -0
  300. package/dist/src/server/extensions/ExtensionManager.d.ts +1 -0
  301. package/dist/src/server/extensions/ExtensionManager.discovery.js +72 -9
  302. package/dist/src/server/extensions/ExtensionManager.integrity.js +1 -1
  303. package/dist/src/server/extensions/ExtensionManager.js +193 -40
  304. package/dist/src/server/extensions/ExtensionManager.roots.d.ts +1 -1
  305. package/dist/src/server/extensions/ExtensionManager.roots.js +4 -4
  306. package/dist/src/server/extensions/plugin-config.js +1 -1
  307. package/dist/src/server/extensions/plugin-env.d.ts +1 -1
  308. package/dist/src/server/extensions/plugin-env.js +10 -4
  309. package/dist/src/server/extensions/types.d.ts +17 -0
  310. package/dist/src/server/extensions/types.js +1 -1
  311. package/dist/src/server/instrumentation/EvidenceGraphBridge.d.ts +13 -0
  312. package/dist/src/server/instrumentation/EvidenceGraphBridge.js +150 -0
  313. package/dist/src/server/instrumentation/InstrumentationSession.d.ts +60 -0
  314. package/dist/src/server/instrumentation/InstrumentationSession.js +269 -0
  315. package/dist/src/server/instrumentation/index.d.ts +2 -0
  316. package/dist/src/server/instrumentation/index.js +2 -0
  317. package/dist/src/server/instrumentation/types.d.ts +62 -0
  318. package/dist/src/server/instrumentation/types.js +7 -0
  319. package/dist/src/server/macros/MacroConfigLoader.d.ts +6 -5
  320. package/dist/src/server/macros/MacroConfigLoader.js +61 -59
  321. package/dist/src/server/macros/MacroRunner.js +6 -2
  322. package/dist/src/server/macros/builtins/index.d.ts +2 -3
  323. package/dist/src/server/macros/builtins/index.js +51 -7
  324. package/dist/src/server/plugins/PluginContract.d.ts +1 -1
  325. package/dist/src/server/registry/contracts.d.ts +1 -1
  326. package/dist/src/server/registry/discovery.js +5 -4
  327. package/dist/src/server/registry/ensure-browser-core.js +0 -3
  328. package/dist/src/server/registry/index.js +4 -4
  329. package/dist/src/server/registry/tool-builder.d.ts +46 -0
  330. package/dist/src/server/registry/tool-builder.js +105 -0
  331. package/dist/src/server/sandbox/QuickJSSandbox.js +16 -5
  332. package/dist/src/server/sandbox/SandboxHelpers.js +250 -250
  333. package/dist/src/server/search/EmbeddingWorker.js +5 -3
  334. package/dist/src/server/search/FeedbackTracker.d.ts +9 -0
  335. package/dist/src/server/search/FeedbackTracker.js +26 -0
  336. package/dist/src/server/search/QueryNormalizer.d.ts +6 -0
  337. package/dist/src/server/search/QueryNormalizer.js +94 -0
  338. package/dist/src/server/search/ToolSearchEngineImpl.d.ts +2 -3
  339. package/dist/src/server/search/ToolSearchEngineImpl.js +38 -88
  340. package/dist/src/server/workflows/WorkflowContract.d.ts +24 -0
  341. package/dist/src/server/workflows/WorkflowContract.js +12 -0
  342. package/dist/src/server/workflows/WorkflowEngine.d.ts +1 -0
  343. package/dist/src/server/workflows/WorkflowEngine.js +136 -3
  344. package/dist/src/types/config.d.ts +0 -14
  345. package/dist/src/types/deobfuscator.d.ts +0 -1
  346. package/dist/src/types/index.d.ts +1 -1
  347. package/dist/src/utils/DetailedDataManager.js +2 -0
  348. package/dist/src/utils/RingBuffer.js +5 -5
  349. package/dist/src/utils/TokenBudgetManager.js +1 -1
  350. package/dist/src/utils/UnifiedCacheManager.js +1 -1
  351. package/dist/src/utils/artifactRetention.js +2 -2
  352. package/dist/src/utils/betterSqlite3.d.ts +11 -0
  353. package/dist/src/utils/betterSqlite3.js +88 -0
  354. package/dist/src/utils/browserExecutable.js +2 -2
  355. package/dist/src/utils/cliFastPath.js +5 -8
  356. package/dist/src/utils/config.js +4 -26
  357. package/dist/src/utils/environmentDoctor.js +138 -11
  358. package/dist/src/utils/outputPaths.js +16 -9
  359. package/dist/src/utils/parallel.js +1 -3
  360. package/package.json +74 -72
  361. package/workflows/.gitkeep +0 -0
  362. package/dist/src/modules/analyzer/AISummarizer.d.ts +0 -39
  363. package/dist/src/modules/analyzer/AISummarizer.js +0 -122
  364. package/dist/src/modules/hook/AIHookGenerator.d.ts +0 -52
  365. package/dist/src/modules/hook/AIHookGenerator.js +0 -360
  366. package/dist/src/modules/hook/AIHookGeneratorTemplates.d.ts +0 -9
  367. package/dist/src/modules/hook/AIHookGeneratorTemplates.js +0 -157
  368. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.d.ts +0 -2
  369. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.js +0 -25
  370. package/dist/src/server/macros/builtins/unpacker-flow.d.ts +0 -2
  371. package/dist/src/server/macros/builtins/unpacker-flow.js +0 -25
  372. package/dist/src/services/LLMService.d.ts +0 -37
  373. package/dist/src/services/LLMService.js +0 -233
  374. package/dist/src/services/prompts/analysis.d.ts +0 -9
  375. package/dist/src/services/prompts/analysis.js +0 -158
  376. package/dist/src/services/prompts/crypto.d.ts +0 -2
  377. package/dist/src/services/prompts/crypto.js +0 -108
  378. package/dist/src/services/prompts/deobfuscation.d.ts +0 -6
  379. package/dist/src/services/prompts/deobfuscation.js +0 -300
  380. package/dist/src/services/prompts/environment.d.ts +0 -16
  381. package/dist/src/services/prompts/environment.js +0 -372
  382. package/dist/src/services/prompts/intelligence.d.ts +0 -4
  383. package/dist/src/services/prompts/intelligence.js +0 -250
  384. package/dist/src/services/prompts/taint.d.ts +0 -2
  385. 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';
3
- import { getActiveToolNames } from './MCPServer.search.helpers.js';
4
- import { normalizeToolName } from './MCPServer.search.validation.js';
5
2
  import {} 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
- }
3
+ import { ensureWorkflowsLoaded } from './extensions/ExtensionManager.js';
4
+ import { getActiveToolNames } from './MCPServer.search.helpers.js';
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?.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>;