@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,7 +1,9 @@
1
1
  import { getQuickJS } from 'quickjs-emscripten';
2
2
  import { SANDBOX_HELPER_SOURCE } from '../sandbox/SandboxHelpers.js';
3
- const DEFAULT_TIMEOUT_MS = 1_000;
4
- const DEFAULT_MEMORY_LIMIT_BYTES = 8 * 1024 * 1024;
3
+ import { SANDBOX_EXEC_TIMEOUT_MS, SANDBOX_MEMORY_LIMIT_MB } from '../../constants.js';
4
+ const DEFAULT_TIMEOUT_MS = SANDBOX_EXEC_TIMEOUT_MS;
5
+ const DEFAULT_MEMORY_LIMIT_BYTES = SANDBOX_MEMORY_LIMIT_MB * 1024 * 1024;
6
+ const DEFAULT_MAX_BRIDGE_CALLS = 10;
5
7
  function marshalToQuickJS(ctx, value) {
6
8
  if (value === null || value === undefined)
7
9
  return ctx.undefined;
@@ -129,6 +131,137 @@ export class QuickJSSandbox {
129
131
  runtime.dispose();
130
132
  }
131
133
  }
134
+ async executeWithOrchestration(code, bridge, options = {}) {
135
+ const maxBridgeCalls = options.maxBridgeCalls ?? DEFAULT_MAX_BRIDGE_CALLS;
136
+ const startTime = Date.now();
137
+ const allLogs = [];
138
+ const allBridgeCalls = [];
139
+ if (options.bridgeAllowlist) {
140
+ bridge.setAllowlist(options.bridgeAllowlist);
141
+ }
142
+ let bridgeResults = {};
143
+ let lastOutput;
144
+ let round = 0;
145
+ while (round <= maxBridgeCalls) {
146
+ const roundGlobals = {
147
+ ...options.globals,
148
+ __bridgeRound: round,
149
+ };
150
+ if (round > 0) {
151
+ roundGlobals.__bridgeResults = bridgeResults;
152
+ }
153
+ const roundResult = await this._executeOneRound(code, bridge, {
154
+ ...options,
155
+ globals: roundGlobals,
156
+ });
157
+ allLogs.push(...roundResult.logs);
158
+ if (!roundResult.ok || roundResult.timedOut) {
159
+ return {
160
+ ...roundResult,
161
+ logs: allLogs,
162
+ durationMs: Date.now() - startTime,
163
+ bridgeCallCount: allBridgeCalls.length,
164
+ bridgeCalls: allBridgeCalls,
165
+ };
166
+ }
167
+ lastOutput = roundResult.output;
168
+ if (!bridge.hasPending()) {
169
+ break;
170
+ }
171
+ const pending = bridge.drainPending();
172
+ const roundResults = {};
173
+ for (const req of pending) {
174
+ try {
175
+ const result = await bridge.call(req.toolName, req.args);
176
+ roundResults[req.id] = result;
177
+ allBridgeCalls.push({ toolName: req.toolName, args: req.args, result });
178
+ }
179
+ catch (err) {
180
+ const errorMsg = err instanceof Error ? err.message : String(err);
181
+ roundResults[req.id] = { __error: true, message: errorMsg };
182
+ allBridgeCalls.push({
183
+ toolName: req.toolName,
184
+ args: req.args,
185
+ result: { __error: true, message: errorMsg },
186
+ });
187
+ }
188
+ }
189
+ bridgeResults = { ...bridgeResults, ...roundResults };
190
+ round++;
191
+ }
192
+ return {
193
+ ok: true,
194
+ output: lastOutput,
195
+ timedOut: false,
196
+ durationMs: Date.now() - startTime,
197
+ logs: allLogs,
198
+ bridgeCallCount: allBridgeCalls.length,
199
+ bridgeCalls: allBridgeCalls,
200
+ };
201
+ }
202
+ async _executeOneRound(code, bridge, options = {}) {
203
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
204
+ const memoryLimitBytes = options.memoryLimitBytes ?? DEFAULT_MEMORY_LIMIT_BYTES;
205
+ const QuickJS = await getQuickJS();
206
+ const runtime = QuickJS.newRuntime();
207
+ runtime.setMemoryLimit(memoryLimitBytes);
208
+ const startTime = Date.now();
209
+ let timedOut = false;
210
+ runtime.setInterruptHandler(() => {
211
+ if (Date.now() - startTime > timeoutMs) {
212
+ timedOut = true;
213
+ return true;
214
+ }
215
+ return false;
216
+ });
217
+ const context = runtime.newContext();
218
+ const logs = [];
219
+ try {
220
+ this._injectConsole(context, logs);
221
+ this._injectHelpers(context);
222
+ this._injectBridgeForOrchestration(context, bridge, logs);
223
+ if (options.globals) {
224
+ this._injectGlobals(context, options.globals);
225
+ }
226
+ const result = context.evalCode(code, 'sandbox-eval.js');
227
+ if (result.error) {
228
+ const errorMsg = context.dump(result.error);
229
+ result.error.dispose();
230
+ if (timedOut) {
231
+ return {
232
+ ok: false,
233
+ error: 'Execution timed out',
234
+ timedOut: true,
235
+ durationMs: Date.now() - startTime,
236
+ logs,
237
+ };
238
+ }
239
+ return {
240
+ ok: false,
241
+ error: typeof errorMsg === 'object' ? JSON.stringify(errorMsg) : String(errorMsg),
242
+ timedOut: false,
243
+ durationMs: Date.now() - startTime,
244
+ logs,
245
+ };
246
+ }
247
+ const output = unmarshalFromQuickJS(context, result.value);
248
+ result.value.dispose();
249
+ return { ok: true, output, timedOut: false, durationMs: Date.now() - startTime, logs };
250
+ }
251
+ catch (err) {
252
+ return {
253
+ ok: false,
254
+ error: err instanceof Error ? err.message : String(err),
255
+ timedOut,
256
+ durationMs: Date.now() - startTime,
257
+ logs,
258
+ };
259
+ }
260
+ finally {
261
+ context.dispose();
262
+ runtime.dispose();
263
+ }
264
+ }
132
265
  _injectConsole(ctx, logs) {
133
266
  const consoleObj = ctx.newObject();
134
267
  const logFn = ctx.newFunction('log', (...args) => {
@@ -181,4 +314,31 @@ export class QuickJSSandbox {
181
314
  listFn.dispose();
182
315
  mcpObj.dispose();
183
316
  }
317
+ _injectBridgeForOrchestration(ctx, bridge, logs) {
318
+ const mcpObj = ctx.newObject();
319
+ const callFn = ctx.newFunction('call', (nameHandle, argsHandle) => {
320
+ const name = ctx.getString(nameHandle);
321
+ const args = ctx.dump(argsHandle) ?? {};
322
+ try {
323
+ const callId = bridge.enqueue(name, args);
324
+ logs.push(`[mcp.call] enqueued ${name}(${JSON.stringify(args)}) → ${callId}`);
325
+ return marshalToQuickJS(ctx, { __bridgeCall: true, callId });
326
+ }
327
+ catch (err) {
328
+ const errorMsg = err instanceof Error ? err.message : String(err);
329
+ logs.push(`[mcp.call] rejected ${name}: ${errorMsg}`);
330
+ return marshalToQuickJS(ctx, { __bridgeCall: false, error: errorMsg });
331
+ }
332
+ });
333
+ const listFn = ctx.newFunction('listTools', () => {
334
+ const tools = bridge.listAvailableTools();
335
+ return marshalToQuickJS(ctx, tools);
336
+ });
337
+ ctx.setProp(mcpObj, 'call', callFn);
338
+ ctx.setProp(mcpObj, 'listTools', listFn);
339
+ ctx.setProp(ctx.global, 'mcp', mcpObj);
340
+ callFn.dispose();
341
+ listFn.dispose();
342
+ mcpObj.dispose();
343
+ }
184
344
  }
@@ -12,3 +12,16 @@ export interface SandboxResult {
12
12
  durationMs: number;
13
13
  logs: string[];
14
14
  }
15
+ export interface BridgeCallRecord {
16
+ toolName: string;
17
+ args: Record<string, unknown>;
18
+ result: unknown;
19
+ }
20
+ export interface OrchestrationOptions extends SandboxOptions {
21
+ maxBridgeCalls?: number;
22
+ bridgeAllowlist?: string[];
23
+ }
24
+ export interface OrchestrationResult extends SandboxResult {
25
+ bridgeCallCount: number;
26
+ bridgeCalls: BridgeCallRecord[];
27
+ }
@@ -2,6 +2,12 @@ export interface AffinityEdge {
2
2
  docIndex: number;
3
3
  weight: number;
4
4
  }
5
+ export interface ExplicitEdge {
6
+ from: string;
7
+ to: string;
8
+ relation: 'requires' | 'precedes' | 'suggests';
9
+ weight: number;
10
+ }
5
11
  interface DocumentInfo {
6
12
  name: string;
7
13
  domain: string | null;
@@ -9,7 +15,7 @@ interface DocumentInfo {
9
15
  export declare class AffinityGraphImpl {
10
16
  private readonly graph;
11
17
  private readonly docCount;
12
- constructor(documents: DocumentInfo[]);
18
+ constructor(documents: DocumentInfo[], explicitEdges?: ExplicitEdge[]);
13
19
  private buildAffinityGraph;
14
20
  applyAffinityExpansion(scores: Float64Array): void;
15
21
  static applyDomainHubExpansion(scores: Float64Array, docCount: number, getDomain: (index: number) => string | null): void;
@@ -2,11 +2,11 @@ import { SEARCH_AFFINITY_BOOST_FACTOR, SEARCH_AFFINITY_TOP_N, SEARCH_DOMAIN_HUB_
2
2
  export class AffinityGraphImpl {
3
3
  graph;
4
4
  docCount;
5
- constructor(documents) {
5
+ constructor(documents, explicitEdges) {
6
6
  this.docCount = documents.length;
7
- this.graph = this.buildAffinityGraph(documents);
7
+ this.graph = this.buildAffinityGraph(documents, explicitEdges);
8
8
  }
9
- buildAffinityGraph(documents) {
9
+ buildAffinityGraph(documents, explicitEdges) {
10
10
  const graph = new Map();
11
11
  const prefixGroups = new Map();
12
12
  for (let i = 0; i < documents.length; i++) {
@@ -33,6 +33,27 @@ export class AffinityGraphImpl {
33
33
  graph.set(src, edges);
34
34
  }
35
35
  }
36
+ if (explicitEdges && explicitEdges.length > 0) {
37
+ const nameToIndex = new Map();
38
+ for (let i = 0; i < documents.length; i++) {
39
+ nameToIndex.set(documents[i].name, i);
40
+ }
41
+ for (const edge of explicitEdges) {
42
+ const srcIdx = nameToIndex.get(edge.from);
43
+ const dstIdx = nameToIndex.get(edge.to);
44
+ if (srcIdx === undefined || dstIdx === undefined)
45
+ continue;
46
+ const edges = graph.get(srcIdx) ?? [];
47
+ const existing = edges.find((e) => e.docIndex === dstIdx);
48
+ if (existing) {
49
+ existing.weight = Math.max(existing.weight, edge.weight);
50
+ }
51
+ else {
52
+ edges.push({ docIndex: dstIdx, weight: edge.weight });
53
+ }
54
+ graph.set(srcIdx, edges);
55
+ }
56
+ }
36
57
  return graph;
37
58
  }
38
59
  applyAffinityExpansion(scores) {
@@ -4,9 +4,9 @@ const MODEL_ID = 'Xenova/bge-micro-v2';
4
4
  async function getEmbedder() {
5
5
  if (!embedder) {
6
6
  const { pipeline } = await import('@huggingface/transformers');
7
- embedder = await pipeline('feature-extraction', MODEL_ID, {
7
+ embedder = (await pipeline('feature-extraction', MODEL_ID, {
8
8
  quantized: true,
9
- });
9
+ }));
10
10
  }
11
11
  return embedder;
12
12
  }
@@ -30,7 +30,9 @@ parentPort?.on('message', async (msg) => {
30
30
  const output = await pipe(msg.text, { pooling: 'mean', normalize: true });
31
31
  const raw = output.data;
32
32
  const embedding = normalise(new Float32Array(raw));
33
- parentPort.postMessage({ type: 'result', id: msg.id, embedding }, [embedding.buffer]);
33
+ parentPort.postMessage({ type: 'result', id: msg.id, embedding }, [
34
+ embedding.buffer,
35
+ ]);
34
36
  }
35
37
  else if (msg.type === 'embed_batch') {
36
38
  const pipe = await getEmbedder();
@@ -0,0 +1,9 @@
1
+ import type { SearchConfig } from '../../types/config.js';
2
+ export declare class FeedbackTracker {
3
+ private vectorWeight;
4
+ private lastVectorRanking;
5
+ constructor(searchConfig?: SearchConfig);
6
+ getVectorWeight(): number;
7
+ recordVectorRanking(ranking: Map<string, number>): void;
8
+ recordToolCallFeedback(toolName: string, vectorEnabled: boolean): boolean;
9
+ }
@@ -0,0 +1,26 @@
1
+ import { SEARCH_VECTOR_COSINE_WEIGHT } from '../../constants.js';
2
+ export class FeedbackTracker {
3
+ vectorWeight;
4
+ lastVectorRanking = null;
5
+ constructor(searchConfig) {
6
+ this.vectorWeight = searchConfig?.vectorCosineWeight ?? SEARCH_VECTOR_COSINE_WEIGHT;
7
+ }
8
+ getVectorWeight() {
9
+ return this.vectorWeight;
10
+ }
11
+ recordVectorRanking(ranking) {
12
+ this.lastVectorRanking = ranking;
13
+ }
14
+ recordToolCallFeedback(toolName, vectorEnabled) {
15
+ if (!this.lastVectorRanking || !vectorEnabled)
16
+ return false;
17
+ const vectorRank = this.lastVectorRanking.get(toolName);
18
+ if (vectorRank !== undefined && vectorRank < 5) {
19
+ this.vectorWeight = Math.min(0.8, this.vectorWeight + 0.02);
20
+ }
21
+ else {
22
+ this.vectorWeight = Math.max(0.1, this.vectorWeight - 0.01);
23
+ }
24
+ return true;
25
+ }
26
+ }
@@ -0,0 +1,6 @@
1
+ export declare const QueryNormalizer: {
2
+ extractParamTokens(inputSchema: unknown): string[];
3
+ extractShortDescription(description: string): string;
4
+ containsCJK(query: string): boolean;
5
+ normalizeToolName(query: string): string;
6
+ };
@@ -0,0 +1,94 @@
1
+ const PARAM_DESCRIPTION_STOP_WORDS = new Set([
2
+ 'the',
3
+ 'a',
4
+ 'an',
5
+ 'is',
6
+ 'are',
7
+ 'was',
8
+ 'were',
9
+ 'be',
10
+ 'been',
11
+ 'to',
12
+ 'of',
13
+ 'in',
14
+ 'for',
15
+ 'on',
16
+ 'with',
17
+ 'at',
18
+ 'by',
19
+ 'from',
20
+ 'or',
21
+ 'and',
22
+ 'not',
23
+ 'this',
24
+ 'that',
25
+ 'it',
26
+ 'its',
27
+ 'if',
28
+ 'as',
29
+ 'will',
30
+ 'can',
31
+ 'may',
32
+ 'must',
33
+ 'should',
34
+ 'would',
35
+ 'could',
36
+ 'e',
37
+ 'g',
38
+ 'default',
39
+ 'optional',
40
+ 'required',
41
+ 'when',
42
+ 'set',
43
+ ]);
44
+ export const QueryNormalizer = {
45
+ extractParamTokens(inputSchema) {
46
+ const tokens = [];
47
+ if (!inputSchema || typeof inputSchema !== 'object')
48
+ return tokens;
49
+ const schema = inputSchema;
50
+ const properties = schema.properties;
51
+ if (!properties || typeof properties !== 'object')
52
+ return tokens;
53
+ for (const [paramName, paramDef] of Object.entries(properties)) {
54
+ const nameParts = paramName.replace(/([a-z])([A-Z])/g, '$1 $2').split(/[\s_-]+/);
55
+ for (const part of nameParts) {
56
+ const lower = part.toLowerCase();
57
+ if (lower.length > 1) {
58
+ tokens.push(lower);
59
+ }
60
+ }
61
+ if (paramDef && typeof paramDef === 'object') {
62
+ const desc = paramDef.description;
63
+ if (typeof desc === 'string') {
64
+ const descWords = desc
65
+ .toLowerCase()
66
+ .split(/[^a-z0-9]+/)
67
+ .filter(Boolean);
68
+ for (const w of descWords) {
69
+ if (w.length > 2 && !PARAM_DESCRIPTION_STOP_WORDS.has(w)) {
70
+ tokens.push(w);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ return tokens;
77
+ },
78
+ extractShortDescription(description) {
79
+ if (!description)
80
+ return '';
81
+ const firstSentence = description.match(/^[^.!?\n]+[.!?]?/);
82
+ if (firstSentence) {
83
+ const result = firstSentence[0].trim();
84
+ return result.length > 120 ? result.slice(0, 117) + '...' : result;
85
+ }
86
+ return description.length > 120 ? description.slice(0, 117) + '...' : description;
87
+ },
88
+ containsCJK(query) {
89
+ return /[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/.test(query);
90
+ },
91
+ normalizeToolName(query) {
92
+ return query.toLowerCase().replace(/[\s-]+/g, '_');
93
+ },
94
+ };
@@ -23,8 +23,8 @@ export declare class ToolSearchEngine {
23
23
  private readonly trigramIndex;
24
24
  private readonly embeddingEngine;
25
25
  private toolEmbeddings;
26
- private vectorWeight;
27
- private lastVectorRanking;
26
+ private readonly feedbackTracker;
27
+ private feedbackEpoch;
28
28
  private readonly bm25Scorer;
29
29
  private readonly intentBoost;
30
30
  constructor(tools?: Tool[], domainOverrides?: ReadonlyMap<string, string>, domainScoreMultipliers?: ReadonlyMap<string, number>, toolScoreMultipliers?: ReadonlyMap<string, number>, searchConfig?: SearchConfig);
@@ -45,7 +45,6 @@ export declare class ToolSearchEngine {
45
45
  private computeVectorCosineScores;
46
46
  recordToolCallFeedback(toolName: string, _lastQuery: string): void;
47
47
  private applyIntentBonusBand;
48
- static extractParamTokens(inputSchema: unknown): string[];
49
48
  private buildAffinityGraph;
50
49
  private applyAffinityExpansion;
51
50
  private applyDomainHubExpansion;
@@ -1,9 +1,26 @@
1
+ function findDelimitedIndex(haystack, needle, wordChar) {
2
+ if (!needle)
3
+ return -1;
4
+ let idx = haystack.indexOf(needle);
5
+ while (idx >= 0) {
6
+ const before = idx > 0 ? haystack[idx - 1] : null;
7
+ const after = idx + needle.length < haystack.length ? haystack[idx + needle.length] : null;
8
+ const beforeOk = before === null || !wordChar.test(before);
9
+ const afterOk = after === null || !wordChar.test(after);
10
+ if (beforeOk && afterOk)
11
+ return idx;
12
+ idx = haystack.indexOf(needle, idx + 1);
13
+ }
14
+ return -1;
15
+ }
1
16
  import { allTools, getToolDomain } from '../ToolCatalog.js';
2
- import { SEARCH_TFIDF_COSINE_WEIGHT, SEARCH_AFFINITY_BOOST_FACTOR, SEARCH_AFFINITY_TOP_N, SEARCH_DOMAIN_HUB_THRESHOLD, SEARCH_QUERY_CACHE_CAPACITY, SEARCH_TRIGRAM_WEIGHT, SEARCH_RRF_K, SEARCH_PARAM_TOKEN_WEIGHT, SEARCH_VECTOR_ENABLED, SEARCH_VECTOR_COSINE_WEIGHT, } from '../../constants.js';
17
+ import { SEARCH_TFIDF_COSINE_WEIGHT, SEARCH_AFFINITY_BOOST_FACTOR, SEARCH_AFFINITY_TOP_N, SEARCH_DOMAIN_HUB_THRESHOLD, SEARCH_QUERY_CACHE_CAPACITY, SEARCH_TRIGRAM_WEIGHT, SEARCH_RRF_K, SEARCH_PARAM_TOKEN_WEIGHT, SEARCH_VECTOR_ENABLED, } from '../../constants.js';
3
18
  import { BM25ScorerImpl } from './BM25Scorer.js';
4
19
  import { EmbeddingEngine } from './EmbeddingEngine.js';
5
20
  import { IntentBoostImpl } from './IntentBoost.js';
6
21
  import { TrigramIndex } from './TrigramIndex.js';
22
+ import { FeedbackTracker } from './FeedbackTracker.js';
23
+ import { QueryNormalizer } from './QueryNormalizer.js';
7
24
  class LRUCache {
8
25
  capacity;
9
26
  map = new Map();
@@ -46,8 +63,8 @@ export class ToolSearchEngine {
46
63
  trigramIndex;
47
64
  embeddingEngine;
48
65
  toolEmbeddings = null;
49
- vectorWeight;
50
- lastVectorRanking = null;
66
+ feedbackTracker;
67
+ feedbackEpoch = 0;
51
68
  bm25Scorer;
52
69
  intentBoost;
53
70
  constructor(tools, domainOverrides, domainScoreMultipliers, toolScoreMultipliers, searchConfig) {
@@ -59,19 +76,19 @@ export class ToolSearchEngine {
59
76
  this.bm25Scorer = new BM25ScorerImpl(searchConfig);
60
77
  const vectorEnabled = searchConfig?.vectorEnabled ?? SEARCH_VECTOR_ENABLED;
61
78
  this.embeddingEngine = vectorEnabled ? new EmbeddingEngine() : null;
62
- this.vectorWeight = searchConfig?.vectorCosineWeight ?? SEARCH_VECTOR_COSINE_WEIGHT;
79
+ this.feedbackTracker = new FeedbackTracker(searchConfig);
63
80
  this.intentBoost = new IntentBoostImpl(searchConfig?.intentToolBoostRules);
64
81
  let totalLength = 0;
65
82
  for (let i = 0; i < source.length; i++) {
66
83
  const tool = source[i];
67
84
  const domain = this.domainOverrides?.get(tool.name) ?? getToolDomain(tool.name);
68
85
  const description = tool.description ?? '';
69
- const shortDescription = extractShortDescription(description);
86
+ const shortDescription = QueryNormalizer.extractShortDescription(description);
70
87
  const nameTokens = this.bm25Scorer.tokenise(tool.name);
71
88
  const nameTokenSet = new Set(nameTokens);
72
89
  const domainTokens = domain ? this.bm25Scorer.tokenise(domain) : [];
73
90
  const descTokens = this.bm25Scorer.tokenise(description);
74
- const paramTokens = ToolSearchEngine.extractParamTokens(tool.inputSchema);
91
+ const paramTokens = QueryNormalizer.extractParamTokens(tool.inputSchema);
75
92
  const allTokens = [...nameTokens, ...domainTokens, ...descTokens, ...paramTokens];
76
93
  const doc = {
77
94
  name: tool.name,
@@ -124,7 +141,7 @@ export class ToolSearchEngine {
124
141
  }
125
142
  }
126
143
  this.avgDocLength = this.docCount > 0 ? totalLength / this.docCount : 1;
127
- this.sortedKeys = [...this.invertedIndex.keys()].sort();
144
+ this.sortedKeys = [...this.invertedIndex.keys()].toSorted();
128
145
  const idfMap = new Map();
129
146
  for (const [term, postings] of this.invertedIndex) {
130
147
  idfMap.set(term, Math.log(1 + this.docCount / postings.length));
@@ -163,21 +180,6 @@ export class ToolSearchEngine {
163
180
  return null;
164
181
  const wordCharIdent = /[a-z0-9_]/;
165
182
  const wordCharPlain = /[a-z0-9]/;
166
- const findDelimitedIndex = (haystack, needle, wordChar) => {
167
- if (!needle)
168
- return -1;
169
- let idx = haystack.indexOf(needle);
170
- while (idx >= 0) {
171
- const before = idx > 0 ? haystack[idx - 1] : null;
172
- const after = idx + needle.length < haystack.length ? haystack[idx + needle.length] : null;
173
- const beforeOk = before === null || !wordChar.test(before);
174
- const afterOk = after === null || !wordChar.test(after);
175
- if (beforeOk && afterOk)
176
- return idx;
177
- idx = haystack.indexOf(needle, idx + 1);
178
- }
179
- return -1;
180
- };
181
183
  let bestTool = null;
182
184
  let bestIdx = Number.POSITIVE_INFINITY;
183
185
  for (const toolName of this.docNameIndex.keys()) {
@@ -197,7 +199,7 @@ export class ToolSearchEngine {
197
199
  }
198
200
  return bestTool;
199
201
  })();
200
- const cacheKey = `${query}\0${topK}`;
202
+ const cacheKey = `${query}\0${topK}\0${this.feedbackEpoch}`;
201
203
  const cached = this.queryCache.get(cacheKey);
202
204
  if (cached) {
203
205
  const active = activeToolNames ?? new Set();
@@ -302,7 +304,7 @@ export class ToolSearchEngine {
302
304
  }
303
305
  return Array.from(domainMap.entries())
304
306
  .map(([domain, tools]) => ({ domain, count: tools.length, tools }))
305
- .sort((a, b) => b.count - a.count);
307
+ .toSorted((a, b) => b.count - a.count);
306
308
  }
307
309
  scoreToken(token, scores) {
308
310
  const postings = this.invertedIndex.get(token);
@@ -350,10 +352,11 @@ export class ToolSearchEngine {
350
352
  const vectorScores = await this.computeVectorCosineScores(query);
351
353
  const vectorRanked = this.rankByMap(vectorScores);
352
354
  if (vectorRanked.size > 0) {
353
- this.lastVectorRanking = new Map();
355
+ const ranking = new Map();
354
356
  for (const [docIdx, rank] of vectorRanked) {
355
- this.lastVectorRanking.set(this.docs[docIdx].name, rank);
357
+ ranking.set(this.docs[docIdx].name, rank);
356
358
  }
359
+ this.feedbackTracker.recordVectorRanking(ranking);
357
360
  }
358
361
  for (let i = 0; i < this.docCount; i++) {
359
362
  let rrfScore = 0;
@@ -370,8 +373,8 @@ export class ToolSearchEngine {
370
373
  rrfScore += trigramWeight * (1 / (k + trigramRank));
371
374
  }
372
375
  const vectorRank = vectorRanked.get(i);
373
- if (vectorRank !== undefined && this.vectorWeight > 0) {
374
- rrfScore += this.vectorWeight * (1 / (k + vectorRank));
376
+ if (vectorRank !== undefined && this.feedbackTracker.getVectorWeight() > 0) {
377
+ rrfScore += this.feedbackTracker.getVectorWeight() * (1 / (k + vectorRank));
375
378
  }
376
379
  if (rrfScore > 0) {
377
380
  const bm25Original = scores[i];
@@ -430,7 +433,7 @@ export class ToolSearchEngine {
430
433
  return ranked;
431
434
  }
432
435
  rankByMap(scoreMap) {
433
- const entries = [...scoreMap.entries()].sort((a, b) => b[1] - a[1]);
436
+ const entries = [...scoreMap.entries()].toSorted((a, b) => b[1] - a[1]);
434
437
  const ranked = new Map();
435
438
  for (let rank = 0; rank < entries.length; rank++) {
436
439
  ranked.set(entries[rank][0], rank);
@@ -475,16 +478,9 @@ export class ToolSearchEngine {
475
478
  return results;
476
479
  }
477
480
  recordToolCallFeedback(toolName, _lastQuery) {
478
- if (!this.lastVectorRanking || !this.embeddingEngine)
479
- return;
480
- const vectorRank = this.lastVectorRanking.get(toolName);
481
- if (vectorRank !== undefined && vectorRank < 5) {
482
- this.vectorWeight = Math.min(0.8, this.vectorWeight + 0.02);
483
- this.queryCache.clear();
484
- }
485
- else {
486
- this.vectorWeight = Math.max(0.1, this.vectorWeight - 0.01);
487
- this.queryCache.clear();
481
+ const adjusted = this.feedbackTracker.recordToolCallFeedback(toolName, !!this.embeddingEngine);
482
+ if (adjusted) {
483
+ this.feedbackEpoch += 1;
488
484
  }
489
485
  }
490
486
  applyIntentBonusBand(scores, intentToolBonuses) {
@@ -503,8 +499,9 @@ export class ToolSearchEngine {
503
499
  return;
504
500
  }
505
501
  const bonusBand = Math.max(1, maxScore + 1);
506
- const distinctBonuses = [...new Set([...intentToolBonuses.values()].filter((bonus) => bonus > 0))]
507
- .sort((a, b) => a - b);
502
+ const distinctBonuses = [
503
+ ...new Set([...intentToolBonuses.values()].filter((bonus) => bonus > 0)),
504
+ ].toSorted((a, b) => a - b);
508
505
  const bonusTierByValue = new Map();
509
506
  for (let i = 0; i < distinctBonuses.length; i++) {
510
507
  bonusTierByValue.set(distinctBonuses[i], i + 1);
@@ -524,43 +521,6 @@ export class ToolSearchEngine {
524
521
  scores[docIndex] += bonusBand * tier;
525
522
  }
526
523
  }
527
- static extractParamTokens(inputSchema) {
528
- const tokens = [];
529
- if (!inputSchema || typeof inputSchema !== 'object')
530
- return tokens;
531
- const schema = inputSchema;
532
- const properties = schema.properties;
533
- if (!properties || typeof properties !== 'object')
534
- return tokens;
535
- for (const [paramName, paramDef] of Object.entries(properties)) {
536
- const nameParts = paramName.replace(/([a-z])([A-Z])/g, '$1 $2').split(/[\s_-]+/);
537
- for (const part of nameParts) {
538
- const lower = part.toLowerCase();
539
- if (lower.length > 1) {
540
- tokens.push(lower);
541
- }
542
- }
543
- if (paramDef && typeof paramDef === 'object') {
544
- const desc = paramDef.description;
545
- if (typeof desc === 'string') {
546
- const STOP_WORDS = new Set([
547
- 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been',
548
- 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from',
549
- 'or', 'and', 'not', 'this', 'that', 'it', 'its', 'if', 'as',
550
- 'will', 'can', 'may', 'must', 'should', 'would', 'could',
551
- 'e', 'g', 'default', 'optional', 'required', 'when', 'set',
552
- ]);
553
- const descWords = desc.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);
554
- for (const w of descWords) {
555
- if (w.length > 2 && !STOP_WORDS.has(w)) {
556
- tokens.push(w);
557
- }
558
- }
559
- }
560
- }
561
- }
562
- return tokens;
563
- }
564
524
  buildAffinityGraph() {
565
525
  const graph = new Map();
566
526
  const prefixGroups = new Map();
@@ -648,13 +608,3 @@ export class ToolSearchEngine {
648
608
  }
649
609
  }
650
610
  }
651
- function extractShortDescription(description) {
652
- if (!description)
653
- return '';
654
- const firstSentence = description.match(/^[^.!?\n]+[.!?]?/);
655
- if (firstSentence) {
656
- const result = firstSentence[0].trim();
657
- return result.length > 120 ? result.slice(0, 117) + '...' : result;
658
- }
659
- return description.length > 120 ? description.slice(0, 117) + '...' : description;
660
- }