@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,10 +1,84 @@
1
1
  import { logger } from '../../../utils/logger.js';
2
2
  import { WORKFLOW_BUNDLE_CACHE_TTL_MS, WORKFLOW_BUNDLE_CACHE_MAX_BYTES } from '../../../constants.js';
3
3
  import { mkdir, writeFile, realpath } from 'node:fs/promises';
4
- import { dirname, basename, resolve, relative, isAbsolute } from 'node:path';
4
+ import { dirname, basename, resolve, relative, isAbsolute, posix as pathPosix } from 'node:path';
5
5
  import { getProjectRoot } from '../../../utils/outputPaths.js';
6
+ import { ensureWorkflowsLoaded } from '../../extensions/ExtensionManager.js';
6
7
  import { executeExtensionWorkflow } from '../../workflows/WorkflowEngine.js';
7
8
  import { argNumber, argObject } from '../../domains/shared/parse-args.js';
9
+ const BUILTIN_SCRIPT_ENTRIES = [
10
+ {
11
+ name: 'auth_extract',
12
+ description: 'Extract auth tokens from localStorage and cookies',
13
+ code: `(function(){
14
+ var keys=['token','active_token','access_token','jwt','auth_token','userRole','id_token','refresh_token'];
15
+ var r={};
16
+ for(var i=0;i<keys.length;i++){var v=localStorage.getItem(keys[i]);if(v)r[keys[i]]=v;}
17
+ r._cookies=document.cookie;
18
+ return r;
19
+ })()`,
20
+ },
21
+ {
22
+ name: 'bundle_search',
23
+ description: 'Fetch a remote JS bundle and search it with regex patterns. params: { url: string, patterns: string[] }',
24
+ code: `(async function(){
25
+ var p=typeof __params__!=='undefined'?__params__:{};
26
+ if(!p.url)return{error:'params.url required'};
27
+ var resp=await fetch(p.url);
28
+ var text=await resp.text();
29
+ var patterns=p.patterns||[];
30
+ var results={};
31
+ for(var i=0;i<patterns.length;i++){
32
+ var re=new RegExp(patterns[i],'g');
33
+ var matches=[];var m;
34
+ while((m=re.exec(text))!==null){
35
+ var s=Math.max(0,m.index-80),e=Math.min(text.length,m.index+m[0].length+80);
36
+ matches.push({match:m[0],ctx:text.slice(s,e)});
37
+ if(matches.length>=10)break;
38
+ }
39
+ results[patterns[i]]=matches;
40
+ }
41
+ return{size:text.length,results:results};
42
+ })()`,
43
+ },
44
+ {
45
+ name: 'react_fill_form',
46
+ description: 'Fill React controlled form inputs using native setter trick. params: { fields: { "selector": "value" } }',
47
+ code: `(function(){
48
+ var p=typeof __params__!=='undefined'?__params__:{};
49
+ var fields=p.fields||{};
50
+ var ns=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;
51
+ var r={};
52
+ var entries=Object.entries(fields);
53
+ for(var i=0;i<entries.length;i++){
54
+ var sel=entries[i][0],val=entries[i][1];
55
+ var el=document.querySelector(sel);
56
+ if(!el){r[sel]='not found';continue;}
57
+ ns.call(el,val);
58
+ el.dispatchEvent(new Event('input',{bubbles:true}));
59
+ el.dispatchEvent(new Event('change',{bubbles:true}));
60
+ r[sel]='filled';
61
+ }
62
+ return r;
63
+ })()`,
64
+ },
65
+ {
66
+ name: 'dom_find_upgrade_buttons',
67
+ description: 'Scan the current page for upgrade/subscription/tier-related UI elements',
68
+ code: `(function(){
69
+ var kw=['upgrade','plus','pro','premium','subscribe','plan','tier','vip','membership'];
70
+ var r=[];
71
+ document.querySelectorAll('button,a,[role=button],[class*=upgrade],[class*=premium],[class*=plus]').forEach(function(el){
72
+ var t=(el.textContent||'').toLowerCase().trim();
73
+ var c=(el.className||'').toLowerCase();
74
+ if(kw.some(function(k){return t.includes(k)||c.includes(k);})){
75
+ r.push({tag:el.tagName,text:t.slice(0,120),cls:c.slice(0,100),href:el.href||null,id:el.id||null});
76
+ }
77
+ });
78
+ return r;
79
+ })()`,
80
+ },
81
+ ];
8
82
  export class WorkflowHandlersBase {
9
83
  deps;
10
84
  scriptRegistry = new Map();
@@ -47,13 +121,13 @@ export class WorkflowHandlersBase {
47
121
  const normalizedRequested = requested.replace(/\\/g, '/');
48
122
  if (normalizedRequested.startsWith('/') ||
49
123
  /^[A-Za-z]:/.test(normalizedRequested) ||
50
- normalizedRequested.split('/').includes('..')) {
124
+ pathPosix.normalize(normalizedRequested).split('/').includes('..')) {
51
125
  return defaultPath;
52
126
  }
53
127
  if (!normalizedRequested.includes('/')) {
54
- return `${preferredDir}/${normalizedRequested}`;
128
+ return pathPosix.join(preferredDir, normalizedRequested);
55
129
  }
56
- return normalizedRequested;
130
+ return pathPosix.normalize(normalizedRequested);
57
131
  }
58
132
  escapeInlineScriptLiteral(value) {
59
133
  return value.replace(/[<>/\u2028\u2029]/g, (char) => {
@@ -94,7 +168,7 @@ export class WorkflowHandlersBase {
94
168
  }
95
169
  const nextParent = dirname(existingParent);
96
170
  if (nextParent === existingParent) {
97
- throw new Error(`Unable to validate output path: ${filePath}`);
171
+ throw new Error(`Unable to validate output path: ${filePath}`, { cause: error });
98
172
  }
99
173
  pendingSegments.unshift(basename(existingParent));
100
174
  existingParent = nextParent;
@@ -161,73 +235,14 @@ export class WorkflowHandlersBase {
161
235
  return lines.join('\n');
162
236
  }
163
237
  initBuiltinScripts() {
164
- this.scriptRegistry.set('auth_extract', {
165
- description: 'Extract auth tokens from localStorage and cookies',
166
- code: `(function(){
167
- var keys=['token','active_token','access_token','jwt','auth_token','userRole','id_token','refresh_token'];
168
- var r={};
169
- for(var i=0;i<keys.length;i++){var v=localStorage.getItem(keys[i]);if(v)r[keys[i]]=v;}
170
- r._cookies=document.cookie;
171
- return r;
172
- })()`,
173
- });
174
- this.scriptRegistry.set('bundle_search', {
175
- description: 'Fetch a remote JS bundle and search it with regex patterns. params: { url: string, patterns: string[] }',
176
- code: `(async function(){
177
- var p=typeof __params__!=='undefined'?__params__:{};
178
- if(!p.url)return{error:'params.url required'};
179
- var resp=await fetch(p.url);
180
- var text=await resp.text();
181
- var patterns=p.patterns||[];
182
- var results={};
183
- for(var i=0;i<patterns.length;i++){
184
- var re=new RegExp(patterns[i],'g');
185
- var matches=[];var m;
186
- while((m=re.exec(text))!==null){
187
- var s=Math.max(0,m.index-80),e=Math.min(text.length,m.index+m[0].length+80);
188
- matches.push({match:m[0],ctx:text.slice(s,e)});
189
- if(matches.length>=10)break;
190
- }
191
- results[patterns[i]]=matches;
192
- }
193
- return{size:text.length,results:results};
194
- })()`,
195
- });
196
- this.scriptRegistry.set('react_fill_form', {
197
- description: 'Fill React controlled form inputs using native setter trick. params: { fields: { "selector": "value" } }',
198
- code: `(function(){
199
- var p=typeof __params__!=='undefined'?__params__:{};
200
- var fields=p.fields||{};
201
- var ns=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;
202
- var r={};
203
- var entries=Object.entries(fields);
204
- for(var i=0;i<entries.length;i++){
205
- var sel=entries[i][0],val=entries[i][1];
206
- var el=document.querySelector(sel);
207
- if(!el){r[sel]='not found';continue;}
208
- ns.call(el,val);
209
- el.dispatchEvent(new Event('input',{bubbles:true}));
210
- el.dispatchEvent(new Event('change',{bubbles:true}));
211
- r[sel]='filled';
212
- }
213
- return r;
214
- })()`,
215
- });
216
- this.scriptRegistry.set('dom_find_upgrade_buttons', {
217
- description: 'Scan the current page for upgrade/subscription/tier-related UI elements',
218
- code: `(function(){
219
- var kw=['upgrade','plus','pro','premium','subscribe','plan','tier','vip','membership'];
220
- var r=[];
221
- document.querySelectorAll('button,a,[role=button],[class*=upgrade],[class*=premium],[class*=plus]').forEach(function(el){
222
- var t=(el.textContent||'').toLowerCase().trim();
223
- var c=(el.className||'').toLowerCase();
224
- if(kw.some(function(k){return t.includes(k)||c.includes(k);})){
225
- r.push({tag:el.tagName,text:t.slice(0,120),cls:c.slice(0,100),href:el.href||null,id:el.id||null});
226
- }
227
- });
228
- return r;
229
- })()`,
230
- });
238
+ for (const entry of BUILTIN_SCRIPT_ENTRIES) {
239
+ this.scriptRegistry.set(entry.name, {
240
+ code: entry.code,
241
+ description: entry.description,
242
+ source: 'core',
243
+ protectedFromEviction: true,
244
+ });
245
+ }
231
246
  }
232
247
  getOptionalString(value) {
233
248
  return typeof value === 'string' ? value : undefined;
@@ -257,19 +272,20 @@ export class WorkflowHandlersBase {
257
272
  }
258
273
  const isUpdate = this.scriptRegistry.has(name);
259
274
  if (!isUpdate && this.scriptRegistry.size >= WorkflowHandlersBase.MAX_SCRIPTS) {
260
- for (const k of this.scriptRegistry.keys()) {
261
- if (![
262
- 'auth_extract',
263
- 'bundle_search',
264
- 'react_fill_form',
265
- 'dom_find_upgrade_buttons',
266
- ].includes(k)) {
267
- this.scriptRegistry.delete(k);
275
+ for (const [scriptName, entry] of this.scriptRegistry) {
276
+ if (!entry.protectedFromEviction) {
277
+ this.scriptRegistry.delete(scriptName);
268
278
  break;
269
279
  }
270
280
  }
271
281
  }
272
- this.scriptRegistry.set(name, { code, description });
282
+ const existingEntry = this.scriptRegistry.get(name);
283
+ this.scriptRegistry.set(name, {
284
+ code,
285
+ description,
286
+ source: existingEntry?.source ?? 'user',
287
+ protectedFromEviction: existingEntry?.protectedFromEviction ?? false,
288
+ });
273
289
  return this.jsonTextResult({
274
290
  success: true,
275
291
  action: isUpdate ? 'updated' : 'registered',
@@ -320,9 +336,10 @@ export class WorkflowHandlersBase {
320
336
  error: 'Extension workflow runtime is unavailable in this handler context',
321
337
  });
322
338
  }
323
- const workflows = [...ctx.extensionWorkflowsById.values()]
324
- .sort((a, b) => a.id.localeCompare(b.id))
325
- .map((record) => ({
339
+ await ensureWorkflowsLoaded(ctx);
340
+ const workflows = [...ctx.extensionWorkflowsById.values()].filter((record) => record.route?.kind !== 'preset');
341
+ workflows.sort((a, b) => a.id.localeCompare(b.id));
342
+ const serializedWorkflows = workflows.map((record) => ({
326
343
  id: record.id,
327
344
  displayName: record.displayName,
328
345
  description: record.description,
@@ -330,11 +347,20 @@ export class WorkflowHandlersBase {
330
347
  timeoutMs: record.timeoutMs,
331
348
  defaultMaxConcurrency: record.defaultMaxConcurrency,
332
349
  source: record.source,
350
+ route: record.route
351
+ ? {
352
+ kind: record.route.kind,
353
+ priority: record.route.priority,
354
+ requiredDomains: record.route.requiredDomains,
355
+ triggerPatterns: record.route.triggerPatterns.map((pattern) => pattern.source),
356
+ steps: record.route.steps,
357
+ }
358
+ : undefined,
333
359
  }));
334
360
  return this.jsonTextResult({
335
361
  success: true,
336
- count: workflows.length,
337
- workflows,
362
+ count: serializedWorkflows.length,
363
+ workflows: serializedWorkflows,
338
364
  });
339
365
  }
340
366
  async handleRunExtensionWorkflow(args) {
@@ -352,12 +378,25 @@ export class WorkflowHandlersBase {
352
378
  error: 'workflowId is required',
353
379
  });
354
380
  }
381
+ await ensureWorkflowsLoaded(ctx);
355
382
  const runtimeRecord = ctx.extensionWorkflowRuntimeById.get(workflowId);
356
383
  if (!runtimeRecord) {
384
+ const available = [...ctx.extensionWorkflowsById.values()]
385
+ .filter((record) => record.route?.kind !== 'preset')
386
+ .map((record) => record.id);
387
+ available.sort((a, b) => a.localeCompare(b));
357
388
  return this.jsonTextResult({
358
389
  success: false,
359
390
  error: `Extension workflow "${workflowId}" not found`,
360
- available: [...ctx.extensionWorkflowsById.keys()].sort((a, b) => a.localeCompare(b)),
391
+ available,
392
+ });
393
+ }
394
+ if (runtimeRecord.route?.kind === 'preset') {
395
+ return this.jsonTextResult({
396
+ success: false,
397
+ workflowId,
398
+ error: `Extension workflow "${workflowId}" is a routing preset and cannot be executed directly. ` +
399
+ 'Use route_tool or the suggested preset steps instead.',
361
400
  });
362
401
  }
363
402
  const profile = this.getOptionalString(args.profile);
@@ -4,6 +4,11 @@ import { WORKFLOW_BATCH_MAX_RETRIES, WORKFLOW_BATCH_MAX_BACKOFF_MS, WORKFLOW_BAT
4
4
  import { argNumber, argString, argObject, argStringArray } from '../../domains/shared/parse-args.js';
5
5
  const BATCH_MAX_ACCOUNTS = WORKFLOW_BATCH_MAX_ACCOUNTS;
6
6
  const BATCH_MAX_CONCURRENCY = WORKFLOW_BATCH_MAX_CONCURRENCY;
7
+ function maskKey(key) {
8
+ if (key.length <= 6)
9
+ return key.charAt(0) + '***' + key.charAt(key.length - 1);
10
+ return key.slice(0, 2) + '***' + key.slice(-2);
11
+ }
7
12
  const MAX_RETRIES = WORKFLOW_BATCH_MAX_RETRIES;
8
13
  const MAX_BACKOFF_MS = WORKFLOW_BATCH_MAX_BACKOFF_MS;
9
14
  const MAX_TIMEOUT_MS = WORKFLOW_BATCH_MAX_TIMEOUT_MS;
@@ -38,11 +43,6 @@ export class WorkflowHandlersBatch extends WorkflowHandlersAccountBundle {
38
43
  Object.values(fields)[0] ??
39
44
  `account-${globalIdx}`);
40
45
  };
41
- const maskKey = (key) => {
42
- if (key.length <= 6)
43
- return key.charAt(0) + '***' + key.charAt(key.length - 1);
44
- return key.slice(0, 2) + '***' + key.slice(-2);
45
- };
46
46
  for (let i = 0; i < accounts.length; i += maxConcurrency) {
47
47
  const chunk = accounts.slice(i, i + maxConcurrency);
48
48
  const chunkPromises = chunk.map(async (acct, chunkIdx) => {
@@ -0,0 +1,20 @@
1
+ import type { EvidenceNode, EvidenceNodeType, EvidenceEdge, EvidenceEdgeType, EvidenceGraphSnapshot } from './types.js';
2
+ export declare function _resetIdCounter(): void;
3
+ export declare class ReverseEvidenceGraph {
4
+ private readonly nodes;
5
+ private readonly edges;
6
+ addNode(type: EvidenceNodeType, label: string, metadata?: Record<string, unknown>): EvidenceNode;
7
+ addEdge(sourceId: string, targetId: string, type: EvidenceEdgeType, metadata?: Record<string, unknown>): EvidenceEdge;
8
+ getNode(id: string): EvidenceNode | undefined;
9
+ removeNode(id: string): boolean;
10
+ getEdgesFrom(nodeId: string): EvidenceEdge[];
11
+ getEdgesTo(nodeId: string): EvidenceEdge[];
12
+ get nodeCount(): number;
13
+ get edgeCount(): number;
14
+ getEvidenceChain(nodeId: string, direction?: 'forward' | 'backward'): EvidenceNode[];
15
+ queryByUrl(url: string): EvidenceNode[];
16
+ queryByFunction(name: string): EvidenceNode[];
17
+ queryByScriptId(scriptId: string): EvidenceNode[];
18
+ exportJson(): EvidenceGraphSnapshot;
19
+ exportMarkdown(): string;
20
+ }
@@ -0,0 +1,208 @@
1
+ let nextId = 1;
2
+ function generateId(prefix) {
3
+ return `${prefix}-${nextId++}`;
4
+ }
5
+ export function _resetIdCounter() {
6
+ nextId = 1;
7
+ }
8
+ export class ReverseEvidenceGraph {
9
+ nodes = new Map();
10
+ edges = new Map();
11
+ addNode(type, label, metadata = {}) {
12
+ const node = {
13
+ id: generateId(type),
14
+ type,
15
+ label,
16
+ metadata,
17
+ createdAt: Date.now(),
18
+ };
19
+ this.nodes.set(node.id, node);
20
+ return node;
21
+ }
22
+ addEdge(sourceId, targetId, type, metadata) {
23
+ if (!this.nodes.has(sourceId))
24
+ throw new Error(`Source node "${sourceId}" not found`);
25
+ if (!this.nodes.has(targetId))
26
+ throw new Error(`Target node "${targetId}" not found`);
27
+ const edge = {
28
+ id: generateId('edge'),
29
+ source: sourceId,
30
+ target: targetId,
31
+ type,
32
+ metadata,
33
+ };
34
+ this.edges.set(edge.id, edge);
35
+ return edge;
36
+ }
37
+ getNode(id) {
38
+ return this.nodes.get(id);
39
+ }
40
+ removeNode(id) {
41
+ if (!this.nodes.has(id))
42
+ return false;
43
+ this.nodes.delete(id);
44
+ for (const [edgeId, edge] of this.edges) {
45
+ if (edge.source === id || edge.target === id) {
46
+ this.edges.delete(edgeId);
47
+ }
48
+ }
49
+ return true;
50
+ }
51
+ getEdgesFrom(nodeId) {
52
+ return [...this.edges.values()].filter((e) => e.source === nodeId);
53
+ }
54
+ getEdgesTo(nodeId) {
55
+ return [...this.edges.values()].filter((e) => e.target === nodeId);
56
+ }
57
+ get nodeCount() {
58
+ return this.nodes.size;
59
+ }
60
+ get edgeCount() {
61
+ return this.edges.size;
62
+ }
63
+ getEvidenceChain(nodeId, direction = 'forward') {
64
+ const start = this.nodes.get(nodeId);
65
+ if (!start)
66
+ return [];
67
+ const visited = new Set();
68
+ const queue = [nodeId];
69
+ const result = [];
70
+ while (queue.length > 0) {
71
+ const current = queue.shift();
72
+ if (visited.has(current))
73
+ continue;
74
+ visited.add(current);
75
+ const node = this.nodes.get(current);
76
+ if (node)
77
+ result.push(node);
78
+ const connectedEdges = direction === 'forward' ? this.getEdgesFrom(current) : this.getEdgesTo(current);
79
+ for (const edge of connectedEdges) {
80
+ const nextNodeId = direction === 'forward' ? edge.target : edge.source;
81
+ if (!visited.has(nextNodeId)) {
82
+ queue.push(nextNodeId);
83
+ }
84
+ }
85
+ }
86
+ return result;
87
+ }
88
+ queryByUrl(url) {
89
+ const matchingNodes = [...this.nodes.values()].filter((n) => {
90
+ if (n.type === 'request' && typeof n.metadata.url === 'string') {
91
+ return n.metadata.url.includes(url);
92
+ }
93
+ if (typeof n.metadata.url === 'string') {
94
+ return n.metadata.url.includes(url);
95
+ }
96
+ return false;
97
+ });
98
+ const allNodes = new Set();
99
+ for (const node of matchingNodes) {
100
+ for (const n of this.getEvidenceChain(node.id, 'forward')) {
101
+ allNodes.add(n.id);
102
+ }
103
+ for (const n of this.getEvidenceChain(node.id, 'backward')) {
104
+ allNodes.add(n.id);
105
+ }
106
+ }
107
+ return [...allNodes].map((id) => this.nodes.get(id)).filter(Boolean);
108
+ }
109
+ queryByFunction(name) {
110
+ const matchingNodes = [...this.nodes.values()].filter((n) => {
111
+ if (n.type === 'function' && typeof n.metadata.functionName === 'string') {
112
+ return n.metadata.functionName.includes(name);
113
+ }
114
+ if (n.label.includes(name) && (n.type === 'function' || n.type === 'breakpoint-hook')) {
115
+ return true;
116
+ }
117
+ return false;
118
+ });
119
+ const allNodes = new Set();
120
+ for (const node of matchingNodes) {
121
+ for (const n of this.getEvidenceChain(node.id, 'forward')) {
122
+ allNodes.add(n.id);
123
+ }
124
+ for (const n of this.getEvidenceChain(node.id, 'backward')) {
125
+ allNodes.add(n.id);
126
+ }
127
+ }
128
+ return [...allNodes].map((id) => this.nodes.get(id)).filter(Boolean);
129
+ }
130
+ queryByScriptId(scriptId) {
131
+ const matchingNodes = [...this.nodes.values()].filter((n) => {
132
+ if (n.type === 'script' && n.metadata.scriptId === scriptId)
133
+ return true;
134
+ return false;
135
+ });
136
+ const allNodes = new Set();
137
+ for (const node of matchingNodes) {
138
+ for (const n of this.getEvidenceChain(node.id, 'forward')) {
139
+ allNodes.add(n.id);
140
+ }
141
+ for (const n of this.getEvidenceChain(node.id, 'backward')) {
142
+ allNodes.add(n.id);
143
+ }
144
+ }
145
+ return [...allNodes].map((id) => this.nodes.get(id)).filter(Boolean);
146
+ }
147
+ exportJson() {
148
+ return {
149
+ version: 1,
150
+ nodes: [...this.nodes.values()],
151
+ edges: [...this.edges.values()],
152
+ exportedAt: new Date().toISOString(),
153
+ };
154
+ }
155
+ exportMarkdown() {
156
+ const lines = [];
157
+ lines.push('# Reverse Evidence Graph Report');
158
+ lines.push('');
159
+ lines.push(`**Exported:** ${new Date().toISOString()}`);
160
+ lines.push(`**Nodes:** ${this.nodes.size} | **Edges:** ${this.edges.size}`);
161
+ lines.push('');
162
+ const byType = new Map();
163
+ for (const node of this.nodes.values()) {
164
+ const list = byType.get(node.type) ?? [];
165
+ list.push(node);
166
+ byType.set(node.type, list);
167
+ }
168
+ const typeOrder = [
169
+ 'request',
170
+ 'initiator-stack',
171
+ 'script',
172
+ 'function',
173
+ 'breakpoint-hook',
174
+ 'captured-data',
175
+ 'replay-artifact',
176
+ ];
177
+ for (const type of typeOrder) {
178
+ const nodes = byType.get(type);
179
+ if (!nodes || nodes.length === 0)
180
+ continue;
181
+ lines.push(`## ${type} (${nodes.length})`);
182
+ lines.push('');
183
+ for (const node of nodes) {
184
+ lines.push(`### ${node.label}`);
185
+ lines.push(`- **ID:** \`${node.id}\``);
186
+ lines.push(`- **Created:** ${new Date(node.createdAt).toISOString()}`);
187
+ const metaKeys = Object.keys(node.metadata);
188
+ if (metaKeys.length > 0) {
189
+ for (const key of metaKeys) {
190
+ const val = node.metadata[key];
191
+ const display = typeof val === 'string' ? val : JSON.stringify(val);
192
+ lines.push(`- **${key}:** ${display}`);
193
+ }
194
+ }
195
+ const outEdges = this.getEdgesFrom(node.id);
196
+ const inEdges = this.getEdgesTo(node.id);
197
+ if (outEdges.length > 0) {
198
+ lines.push(`- **→ Out:** ${outEdges.map((e) => `${e.type} → \`${e.target}\``).join(', ')}`);
199
+ }
200
+ if (inEdges.length > 0) {
201
+ lines.push(`- **← In:** ${inEdges.map((e) => `\`${e.source}\` ${e.type} →`).join(', ')}`);
202
+ }
203
+ lines.push('');
204
+ }
205
+ }
206
+ return lines.join('\n');
207
+ }
208
+ }
@@ -0,0 +1,2 @@
1
+ export { ReverseEvidenceGraph, _resetIdCounter } from './ReverseEvidenceGraph.js';
2
+ export type { EvidenceNode, EvidenceNodeType, EvidenceEdge, EvidenceEdgeType, EvidenceGraphSnapshot, } from './types.js';
@@ -0,0 +1 @@
1
+ export { ReverseEvidenceGraph, _resetIdCounter } from './ReverseEvidenceGraph.js';
@@ -0,0 +1,22 @@
1
+ export type EvidenceNodeType = 'request' | 'initiator-stack' | 'script' | 'function' | 'breakpoint-hook' | 'captured-data' | 'replay-artifact';
2
+ export type EvidenceEdgeType = 'initiates' | 'contains' | 'triggers' | 'captures' | 'replays' | 'loads' | 'references';
3
+ export interface EvidenceNode {
4
+ readonly id: string;
5
+ readonly type: EvidenceNodeType;
6
+ label: string;
7
+ metadata: Record<string, unknown>;
8
+ readonly createdAt: number;
9
+ }
10
+ export interface EvidenceEdge {
11
+ readonly id: string;
12
+ readonly source: string;
13
+ readonly target: string;
14
+ readonly type: EvidenceEdgeType;
15
+ metadata?: Record<string, unknown>;
16
+ }
17
+ export interface EvidenceGraphSnapshot {
18
+ version: 1;
19
+ nodes: EvidenceNode[];
20
+ edges: EvidenceEdge[];
21
+ exportedAt: string;
22
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -2,3 +2,4 @@ import type { MCPServerContext } from '../MCPServer.context.js';
2
2
  import type { ExtensionListResult, ExtensionReloadResult } from '../extensions/types.js';
3
3
  export declare function listExtensions(ctx: MCPServerContext): ExtensionListResult;
4
4
  export declare function reloadExtensions(ctx: MCPServerContext): Promise<ExtensionReloadResult>;
5
+ export declare function ensureWorkflowsLoaded(ctx: MCPServerContext): Promise<void>;