@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
@@ -124,57 +124,57 @@ export class WorkflowHandlersApi extends WorkflowHandlersBase {
124
124
  ],
125
125
  };
126
126
  }
127
- const probeCode = `(async function() {
128
- var baseUrl = ${JSON.stringify(baseUrl)};
129
- var paths = ${JSON.stringify(paths)};
130
- var method = ${JSON.stringify(method)};
131
- var extraHeaders = ${JSON.stringify(extraHeaders)};
132
- var includeBodyStatuses = ${JSON.stringify(includeBodyStatuses)};
133
- var maxSnippetLen = ${JSON.stringify(maxBodySnippetLength)};
134
- var autoInjectAuth = ${JSON.stringify(autoInjectAuth)};
135
- var bodyTemplate = ${JSON.stringify(bodyTemplate)};
136
-
137
- var headers = Object.assign({'Content-Type':'application/json'}, extraHeaders);
138
- if (autoInjectAuth) {
139
- var token = localStorage.getItem('token') || localStorage.getItem('active_token') || localStorage.getItem('access_token');
140
- if (token) headers['Authorization'] = 'Bearer ' + token;
141
- }
142
-
143
- var results = {};
144
- async function probePath(path) {
145
- try {
146
- var opts = {method: method, headers: headers};
147
- if (bodyTemplate && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
148
- opts.body = bodyTemplate;
149
- }
150
- var resp = await fetch(baseUrl + path, opts);
151
- var ct = resp.headers.get('content-type') || '';
152
- var snippet = null;
153
- if (includeBodyStatuses.indexOf(resp.status) !== -1) {
154
- var text = await resp.text();
155
- if (!ct.includes('text/html') && !ct.includes('application/xml')) {
156
- snippet = text.length > maxSnippetLen ? text.slice(0, maxSnippetLen) + '...[truncated]' : text;
157
- } else {
158
- snippet = '[HTML/XML response suppressed]';
159
- }
160
- }
161
- return [path, {status: resp.status, contentType: ct.split(';')[0].trim(), snippet: snippet}];
162
- } catch(e) {
163
- return [path, {status: -1, error: e instanceof Error ? e.message : String(e)}];
164
- }
165
- }
166
-
167
- var nextIndex = 0;
168
- var maxConcurrency = Math.min(paths.length, 6);
169
- await Promise.all(Array.from({ length: maxConcurrency }, async function() {
170
- while (nextIndex < paths.length) {
171
- var currentIndex = nextIndex++;
172
- var currentPath = paths[currentIndex];
173
- var entry = await probePath(currentPath);
174
- results[entry[0]] = entry[1];
175
- }
176
- }));
177
- return {probed: paths.length, method: method, baseUrl: baseUrl, results: results};
127
+ const probeCode = `(async function() {
128
+ var baseUrl = ${JSON.stringify(baseUrl)};
129
+ var paths = ${JSON.stringify(paths)};
130
+ var method = ${JSON.stringify(method)};
131
+ var extraHeaders = ${JSON.stringify(extraHeaders)};
132
+ var includeBodyStatuses = ${JSON.stringify(includeBodyStatuses)};
133
+ var maxSnippetLen = ${JSON.stringify(maxBodySnippetLength)};
134
+ var autoInjectAuth = ${JSON.stringify(autoInjectAuth)};
135
+ var bodyTemplate = ${JSON.stringify(bodyTemplate)};
136
+
137
+ var headers = Object.assign({'Content-Type':'application/json'}, extraHeaders);
138
+ if (autoInjectAuth) {
139
+ var token = localStorage.getItem('token') || localStorage.getItem('active_token') || localStorage.getItem('access_token');
140
+ if (token) headers['Authorization'] = 'Bearer ' + token;
141
+ }
142
+
143
+ var results = {};
144
+ async function probePath(path) {
145
+ try {
146
+ var opts = {method: method, headers: headers};
147
+ if (bodyTemplate && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
148
+ opts.body = bodyTemplate;
149
+ }
150
+ var resp = await fetch(baseUrl + path, opts);
151
+ var ct = resp.headers.get('content-type') || '';
152
+ var snippet = null;
153
+ if (includeBodyStatuses.indexOf(resp.status) !== -1) {
154
+ var text = await resp.text();
155
+ if (!ct.includes('text/html') && !ct.includes('application/xml')) {
156
+ snippet = text.length > maxSnippetLen ? text.slice(0, maxSnippetLen) + '...[truncated]' : text;
157
+ } else {
158
+ snippet = '[HTML/XML response suppressed]';
159
+ }
160
+ }
161
+ return [path, {status: resp.status, contentType: ct.split(';')[0].trim(), snippet: snippet}];
162
+ } catch(e) {
163
+ return [path, {status: -1, error: e instanceof Error ? e.message : String(e)}];
164
+ }
165
+ }
166
+
167
+ var nextIndex = 0;
168
+ var maxConcurrency = Math.min(paths.length, 6);
169
+ await Promise.all(Array.from({ length: maxConcurrency }, async function() {
170
+ while (nextIndex < paths.length) {
171
+ var currentIndex = nextIndex++;
172
+ var currentPath = paths[currentIndex];
173
+ var entry = await probePath(currentPath);
174
+ results[entry[0]] = entry[1];
175
+ }
176
+ }));
177
+ return {probed: paths.length, method: method, baseUrl: baseUrl, results: results};
178
178
  })()`;
179
179
  try {
180
180
  const result = await this.deps.browserHandlers.handlePageEvaluate({ code: probeCode });
@@ -40,6 +40,8 @@ export interface WorkflowHandlersDeps {
40
40
  interface ScriptEntry {
41
41
  code: string;
42
42
  description: string;
43
+ source: 'core' | 'user' | 'plugin';
44
+ protectedFromEviction: boolean;
43
45
  }
44
46
  interface BundleCacheEntry {
45
47
  text: string;
@@ -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';