@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
@@ -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
- }
@@ -9,6 +9,7 @@ export interface ToolNode {
9
9
  readonly id: string;
10
10
  readonly toolName: string;
11
11
  readonly input?: Record<string, unknown>;
12
+ readonly inputFrom?: Record<string, string>;
12
13
  readonly timeoutMs?: number;
13
14
  readonly retry?: RetryPolicy;
14
15
  }
@@ -36,11 +37,29 @@ export type WorkflowNode = ToolNode | SequenceNode | ParallelNode | BranchNode;
36
37
  export interface WorkflowExecutionContext {
37
38
  readonly workflowRunId: string;
38
39
  readonly profile: string;
40
+ readonly stepResults: ReadonlyMap<string, unknown>;
39
41
  invokeTool(toolName: string, args: Record<string, unknown>): Promise<unknown>;
40
42
  emitSpan(name: string, attrs?: Record<string, unknown>): void;
41
43
  emitMetric(name: string, value: number, type: 'counter' | 'gauge' | 'histogram', attrs?: Record<string, unknown>): void;
42
44
  getConfig<T = unknown>(path: string, fallback?: T): T;
43
45
  }
46
+ export interface WorkflowRouteStep {
47
+ readonly id: string;
48
+ readonly toolName: string;
49
+ readonly description: string;
50
+ readonly prerequisites: string[];
51
+ readonly parallel?: boolean;
52
+ readonly expectedInputs?: Record<string, string>;
53
+ readonly evidenceNodeType?: string;
54
+ }
55
+ export type WorkflowRouteKind = 'preset' | 'workflow';
56
+ export interface WorkflowRouteMetadata {
57
+ readonly kind: WorkflowRouteKind;
58
+ readonly triggerPatterns: RegExp[];
59
+ readonly steps: WorkflowRouteStep[];
60
+ readonly requiredDomains: string[];
61
+ readonly priority: number;
62
+ }
44
63
  export interface WorkflowContract {
45
64
  readonly kind: 'workflow-contract';
46
65
  readonly version: 1;
@@ -50,6 +69,7 @@ export interface WorkflowContract {
50
69
  readonly tags?: string[];
51
70
  readonly timeoutMs?: number;
52
71
  readonly defaultMaxConcurrency?: number;
72
+ readonly route?: WorkflowRouteMetadata;
53
73
  build(ctx: WorkflowExecutionContext): WorkflowNode;
54
74
  onStart?(ctx: WorkflowExecutionContext): Promise<void> | void;
55
75
  onFinish?(ctx: WorkflowExecutionContext, result: unknown): Promise<void> | void;
@@ -69,10 +89,12 @@ type AnyWorkflowNodeBuilder = WorkflowNodeBuilder<WorkflowNode>;
69
89
  export declare class ToolNodeBuilder extends WorkflowNodeBuilder<ToolNode> {
70
90
  private toolName;
71
91
  private _input?;
92
+ private _inputFrom?;
72
93
  private _retry?;
73
94
  private _timeoutMs?;
74
95
  constructor(id: string, toolName: string);
75
96
  input(input: Record<string, unknown>): this;
97
+ inputFrom(mapping: Record<string, string>): this;
76
98
  retry(policy: RetryPolicy): this;
77
99
  timeout(ms: number): this;
78
100
  build(): ToolNode;
@@ -117,6 +139,7 @@ export declare class WorkflowBuilder {
117
139
  private _tags?;
118
140
  private _timeoutMs?;
119
141
  private _defaultMaxConcurrency?;
142
+ private _route?;
120
143
  private _buildFn;
121
144
  private _onStart?;
122
145
  private _onFinish?;
@@ -126,6 +149,7 @@ export declare class WorkflowBuilder {
126
149
  tags(tags: string[]): this;
127
150
  timeoutMs(timeout: number): this;
128
151
  defaultMaxConcurrency(max: number): this;
152
+ route(route: WorkflowRouteMetadata): this;
129
153
  buildGraph(fn: (ctx: WorkflowExecutionContext) => AnyWorkflowNodeBuilder): this;
130
154
  onStart(fn: (ctx: WorkflowExecutionContext) => Promise<void> | void): this;
131
155
  onFinish(fn: (ctx: WorkflowExecutionContext, result: unknown) => Promise<void> | void): this;
@@ -7,6 +7,7 @@ export class WorkflowNodeBuilder {
7
7
  export class ToolNodeBuilder extends WorkflowNodeBuilder {
8
8
  toolName;
9
9
  _input;
10
+ _inputFrom;
10
11
  _retry;
11
12
  _timeoutMs;
12
13
  constructor(id, toolName) {
@@ -17,6 +18,10 @@ export class ToolNodeBuilder extends WorkflowNodeBuilder {
17
18
  this._input = input;
18
19
  return this;
19
20
  }
21
+ inputFrom(mapping) {
22
+ this._inputFrom = mapping;
23
+ return this;
24
+ }
20
25
  retry(policy) {
21
26
  this._retry = policy;
22
27
  return this;
@@ -31,6 +36,7 @@ export class ToolNodeBuilder extends WorkflowNodeBuilder {
31
36
  id: this.id,
32
37
  toolName: this.toolName,
33
38
  input: this._input,
39
+ inputFrom: this._inputFrom,
34
40
  retry: this._retry,
35
41
  timeoutMs: this._timeoutMs,
36
42
  };
@@ -174,6 +180,7 @@ export class WorkflowBuilder {
174
180
  _tags;
175
181
  _timeoutMs;
176
182
  _defaultMaxConcurrency;
183
+ _route;
177
184
  _buildFn;
178
185
  _onStart;
179
186
  _onFinish;
@@ -198,6 +205,10 @@ export class WorkflowBuilder {
198
205
  this._defaultMaxConcurrency = max;
199
206
  return this;
200
207
  }
208
+ route(route) {
209
+ this._route = route;
210
+ return this;
211
+ }
201
212
  buildGraph(fn) {
202
213
  this._buildFn = (ctx) => fn(ctx).build();
203
214
  return this;
@@ -226,6 +237,7 @@ export class WorkflowBuilder {
226
237
  tags: this._tags,
227
238
  timeoutMs: this._timeoutMs,
228
239
  defaultMaxConcurrency: this._defaultMaxConcurrency,
240
+ route: this._route,
229
241
  build: this._buildFn,
230
242
  onStart: this._onStart,
231
243
  onFinish: this._onFinish,
@@ -16,6 +16,7 @@ interface WorkflowSpan {
16
16
  export interface ExecuteWorkflowOptions {
17
17
  profile?: string;
18
18
  config?: JsonRecord;
19
+ preflightMode?: 'warn' | 'strict' | 'skip';
19
20
  nodeInputOverrides?: Record<string, Record<string, unknown>>;
20
21
  timeoutMs?: number;
21
22
  }
@@ -1,4 +1,14 @@
1
1
  import { randomUUID } from 'node:crypto';
2
+ import { getEffectivePrerequisites } from '../ToolRouter.policy.js';
3
+ import { getRoutingState } from '../ToolRouter.probe.js';
4
+ class PreflightError extends Error {
5
+ warnings;
6
+ constructor(warnings) {
7
+ super(`Workflow preflight failed with ${warnings.length} unsatisfied prerequisite(s)`);
8
+ this.warnings = warnings;
9
+ this.name = 'PreflightError';
10
+ }
11
+ }
2
12
  function extractConfigValue(config, path, fallback) {
3
13
  const segments = path.split('.').filter(Boolean);
4
14
  let current = config;
@@ -77,9 +87,29 @@ function collectSuccessStats(value) {
77
87
  }
78
88
  return { success: 0, failure: 0 };
79
89
  }
80
- async function runToolNode(ctx, node, overrides) {
90
+ function resolveInputFrom(mapping, stepResults) {
91
+ const resolved = {};
92
+ for (const [targetKey, sourceRef] of Object.entries(mapping)) {
93
+ const dotIndex = sourceRef.indexOf('.');
94
+ if (dotIndex === -1) {
95
+ resolved[targetKey] = stepResults.get(sourceRef);
96
+ continue;
97
+ }
98
+ const stepId = sourceRef.slice(0, dotIndex);
99
+ const fieldPath = sourceRef.slice(dotIndex + 1);
100
+ const stepResult = stepResults.get(stepId);
101
+ const payload = parseToolPayload(stepResult) ?? stepResult;
102
+ resolved[targetKey] = payload?.[fieldPath];
103
+ }
104
+ return resolved;
105
+ }
106
+ async function runToolNode(ctx, node, overrides, executionContext) {
107
+ const fromResolved = node.inputFrom
108
+ ? resolveInputFrom(node.inputFrom, executionContext.stepResults)
109
+ : {};
81
110
  const mergedInput = {
82
111
  ...node.input,
112
+ ...fromResolved,
83
113
  ...overrides?.[node.id],
84
114
  };
85
115
  const runAttempt = async () => {
@@ -113,7 +143,7 @@ async function runToolNode(ctx, node, overrides) {
113
143
  }
114
144
  async function runParallelNode(ctx, node, executionContext, options) {
115
145
  const concurrency = Math.max(1, node.maxConcurrency ?? 4);
116
- const results = new Array(node.steps.length);
146
+ const results = Array.from({ length: node.steps.length });
117
147
  let nextIndex = 0;
118
148
  let stopped = false;
119
149
  const worker = async () => {
@@ -177,7 +207,7 @@ async function executeNode(ctx, node, executionContext, options) {
177
207
  let result;
178
208
  switch (node.kind) {
179
209
  case 'tool':
180
- result = await runToolNode(ctx, node, options.nodeInputOverrides);
210
+ result = await runToolNode(ctx, node, options.nodeInputOverrides, executionContext);
181
211
  break;
182
212
  case 'sequence': {
183
213
  const sequenceNode = node;
@@ -210,6 +240,52 @@ async function executeNode(ctx, node, executionContext, options) {
210
240
  executionContext.emitSpan('workflow.node.finish', { nodeId: node.id, kind: node.kind });
211
241
  return result;
212
242
  }
243
+ function collectToolNodes(node) {
244
+ switch (node.kind) {
245
+ case 'tool':
246
+ return [node];
247
+ case 'sequence':
248
+ case 'parallel':
249
+ return node.steps.flatMap((step) => collectToolNodes(step));
250
+ case 'branch':
251
+ return [
252
+ ...collectToolNodes(node.whenTrue),
253
+ ...(node.whenFalse ? collectToolNodes(node.whenFalse) : []),
254
+ ];
255
+ default:
256
+ return [];
257
+ }
258
+ }
259
+ function getEvidenceState(ctx) {
260
+ try {
261
+ const evidenceGraph = ctx.getDomainInstance('evidenceGraph');
262
+ return evidenceGraph
263
+ ? { hasGraph: true, nodeCount: evidenceGraph.nodeCount, edgeCount: evidenceGraph.edgeCount }
264
+ : { hasGraph: false, nodeCount: 0, edgeCount: 0 };
265
+ }
266
+ catch {
267
+ return { hasGraph: false, nodeCount: 0, edgeCount: 0 };
268
+ }
269
+ }
270
+ function collectUnsatisfiedPrerequisites(graph, routingState) {
271
+ const prerequisites = getEffectivePrerequisites();
272
+ const warnings = [];
273
+ for (const toolNode of collectToolNodes(graph)) {
274
+ const toolPrerequisites = prerequisites[toolNode.toolName] ?? [];
275
+ for (const prerequisite of toolPrerequisites) {
276
+ if (prerequisite.check(routingState)) {
277
+ continue;
278
+ }
279
+ warnings.push({
280
+ nodeId: toolNode.id,
281
+ toolName: toolNode.toolName,
282
+ condition: prerequisite.condition,
283
+ fix: prerequisite.fix,
284
+ });
285
+ }
286
+ }
287
+ return warnings;
288
+ }
213
289
  export async function executeExtensionWorkflow(ctx, workflow, options = {}) {
214
290
  const runId = randomUUID();
215
291
  const profile = options.profile ?? String(ctx.baseTier ?? 'workflow');
@@ -241,8 +317,65 @@ export async function executeExtensionWorkflow(ctx, workflow, options = {}) {
241
317
  try {
242
318
  await workflow.onStart?.(executionContext);
243
319
  const graph = workflow.build(executionContext);
320
+ const preflightMode = options.preflightMode ?? 'warn';
321
+ let preflightWarnings = [];
322
+ if (preflightMode === 'skip') {
323
+ executionContext.emitSpan('workflow.preflight', {
324
+ mode: preflightMode,
325
+ skipped: true,
326
+ evidenceState: getEvidenceState(ctx),
327
+ warningCount: 0,
328
+ });
329
+ }
330
+ else {
331
+ try {
332
+ const routingState = await getRoutingState(ctx);
333
+ const evidenceState = getEvidenceState(ctx);
334
+ preflightWarnings = collectUnsatisfiedPrerequisites(graph, routingState);
335
+ executionContext.emitSpan('workflow.preflight', {
336
+ mode: preflightMode,
337
+ routingState,
338
+ evidenceState,
339
+ warningCount: preflightWarnings.length,
340
+ warnings: preflightWarnings,
341
+ });
342
+ if (preflightMode === 'strict' && preflightWarnings.length > 0) {
343
+ throw new PreflightError(preflightWarnings);
344
+ }
345
+ }
346
+ catch (error) {
347
+ if (error instanceof PreflightError) {
348
+ throw error;
349
+ }
350
+ executionContext.emitSpan('workflow.preflight', {
351
+ mode: preflightMode,
352
+ warningCount: 0,
353
+ skipped: true,
354
+ error: error instanceof Error ? error.message : String(error),
355
+ evidenceState: getEvidenceState(ctx),
356
+ });
357
+ }
358
+ }
244
359
  const result = await withTimeout(executeNode(ctx, graph, executionContext, options), options.timeoutMs ?? workflow.timeoutMs ?? 0, `Workflow "${workflow.id}"`);
245
360
  await workflow.onFinish?.(executionContext, result);
361
+ try {
362
+ const evidenceGraph = typeof ctx.getDomainInstance === 'function'
363
+ ? ctx.getDomainInstance('evidenceGraph')
364
+ : undefined;
365
+ if (evidenceGraph && evidenceGraph.nodeCount > 0) {
366
+ stepResults.set('__evidenceSnapshot', evidenceGraph.exportJson());
367
+ executionContext.emitSpan('workflow.evidence.auto-export', {
368
+ nodeCount: evidenceGraph.nodeCount,
369
+ edgeCount: evidenceGraph.edgeCount,
370
+ });
371
+ }
372
+ }
373
+ catch (exportError) {
374
+ executionContext.emitSpan('workflow.evidence.auto-export', {
375
+ skipped: true,
376
+ error: exportError instanceof Error ? exportError.message : String(exportError),
377
+ });
378
+ }
246
379
  return {
247
380
  workflowId: workflow.id,
248
381
  displayName: workflow.displayName,
@@ -1,24 +1,10 @@
1
1
  export interface Config {
2
- llm: LLMConfig;
3
2
  puppeteer: PuppeteerConfig;
4
3
  mcp: MCPConfig;
5
4
  cache: CacheConfig;
6
5
  performance: PerformanceConfig;
7
6
  search: SearchConfig;
8
7
  }
9
- export interface LLMConfig {
10
- provider: 'openai' | 'anthropic';
11
- openai?: {
12
- apiKey: string;
13
- model: string;
14
- baseURL?: string;
15
- };
16
- anthropic?: {
17
- apiKey: string;
18
- model: string;
19
- baseURL?: string;
20
- };
21
- }
22
8
  export interface PuppeteerConfig {
23
9
  headless: boolean;
24
10
  timeout: number;
@@ -6,7 +6,6 @@ export interface Transformation {
6
6
  }
7
7
  export interface DeobfuscateOptions {
8
8
  code: string;
9
- llm?: 'gpt-4' | 'claude';
10
9
  aggressive?: boolean;
11
10
  preserveLogic?: boolean;
12
11
  renameVariables?: boolean;
@@ -1,5 +1,5 @@
1
1
  export type { CodeLocation, Result } from './common.js';
2
- export type { Config, LLMConfig, PuppeteerConfig, MCPConfig, CacheConfig, PerformanceConfig, SearchConfig, SearchQueryCategoryProfileConfig, SearchCjkQueryAliasConfig, SearchIntentToolBoostRuleConfig, } from './config.js';
2
+ export type { Config, PuppeteerConfig, MCPConfig, CacheConfig, PerformanceConfig, SearchConfig, SearchQueryCategoryProfileConfig, SearchCjkQueryAliasConfig, SearchIntentToolBoostRuleConfig, } from './config.js';
3
3
  export type { BrowserContext } from './browser.js';
4
4
  export type { CollectCodeOptions, CodeFile, CollectCodeResult, DependencyGraph, DependencyNode, DependencyEdge, } from './collector.js';
5
5
  export type { ObfuscationType, Transformation, DeobfuscateOptions, DeobfuscateResult, DeobfuscateMappingRule, DeobfuscateSavedArtifact, DeobfuscateBundleModuleSummary, DeobfuscateBundleSummary, } from './deobfuscator.js';
@@ -51,6 +51,8 @@ export class DetailedDataManager {
51
51
  return Object(value)[key];
52
52
  }
53
53
  smartHandle(data, threshold = DETAILED_DATA_SMART_THRESHOLD_BYTES) {
54
+ if (data === null || data === undefined || typeof data !== 'object')
55
+ return data;
54
56
  const { json: jsonStr, size } = this.serializeWithMemo(data);
55
57
  if (size <= threshold) {
56
58
  return data;
@@ -6,7 +6,7 @@ export class RingBuffer {
6
6
  count = 0;
7
7
  constructor(capacity) {
8
8
  this.capacity = capacity;
9
- this.buf = new Array(capacity);
9
+ this.buf = Array.from({ length: capacity });
10
10
  }
11
11
  get length() {
12
12
  return this.count;
@@ -37,7 +37,7 @@ export class RingBuffer {
37
37
  return item;
38
38
  }
39
39
  clear() {
40
- this.buf = new Array(Math.min(64, this.capacity));
40
+ this.buf = Array.from({ length: Math.min(64, this.capacity) });
41
41
  this.head = 0;
42
42
  this.tail = 0;
43
43
  this.count = 0;
@@ -48,14 +48,14 @@ export class RingBuffer {
48
48
  }
49
49
  }
50
50
  toArray() {
51
- const result = new Array(this.count);
51
+ const result = Array.from({ length: this.count });
52
52
  for (let i = 0; i < this.count; i++) {
53
53
  result[i] = this.buf[(this.head + i) % this.buf.length];
54
54
  }
55
55
  return result;
56
56
  }
57
57
  map(fn) {
58
- const result = new Array(this.count);
58
+ const result = Array.from({ length: this.count });
59
59
  for (let i = 0; i < this.count; i++) {
60
60
  result[i] = fn(this.buf[(this.head + i) % this.buf.length], i);
61
61
  }
@@ -63,7 +63,7 @@ export class RingBuffer {
63
63
  }
64
64
  grow() {
65
65
  const newSize = Math.min(this.buf.length * 2, this.capacity);
66
- const newBuf = new Array(newSize);
66
+ const newBuf = Array.from({ length: newSize });
67
67
  for (let i = 0; i < this.count; i++) {
68
68
  newBuf[i] = this.buf[(this.head + i) % this.buf.length];
69
69
  }
@@ -257,7 +257,7 @@ export class TokenBudgetManager {
257
257
  tokens,
258
258
  percentage: Math.round((tokens / this.currentUsage) * 100),
259
259
  }))
260
- .sort((a, b) => b.tokens - a.tokens)
260
+ .toSorted((a, b) => b.tokens - a.tokens)
261
261
  .slice(0, 10);
262
262
  const suggestions = this.generateSuggestions(topTools);
263
263
  const recentCalls = this.toolCallHistory.slice(-20);