@jshookmcp/jshook 0.2.3 → 0.2.6

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 (583) 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 +171 -0
  7. package/dist/packages/extension-sdk/src/workflow.js +272 -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/BrowserPool.d.ts +49 -0
  24. package/dist/src/modules/browser/BrowserPool.js +288 -0
  25. package/dist/src/modules/browser/TabRegistry.js +2 -2
  26. package/dist/src/modules/browser/UnifiedBrowserManager.d.ts +1 -0
  27. package/dist/src/modules/browser/UnifiedBrowserManager.js +18 -3
  28. package/dist/src/modules/captcha/AICaptchaDetector.d.ts +1 -10
  29. package/dist/src/modules/captcha/AICaptchaDetector.js +7 -201
  30. package/dist/src/modules/collector/CodeCollector.js +4 -5
  31. package/dist/src/modules/collector/DOMInspector.js +48 -58
  32. package/dist/src/modules/collector/PageController.d.ts +17 -4
  33. package/dist/src/modules/collector/PageController.js +2 -5
  34. package/dist/src/modules/collector/PageScriptCollectors.js +3 -3
  35. package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -4
  36. package/dist/src/modules/crypto/CryptoDetector.js +2 -42
  37. package/dist/src/modules/crypto/CryptoRules.js +1 -1
  38. package/dist/src/modules/debugger/BlackboxManager.js +1 -1
  39. package/dist/src/modules/debugger/DebuggerManager.impl.core.scope.js +1 -1
  40. package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +4 -2
  41. package/dist/src/modules/debugger/WatchExpressionManager.js +1 -1
  42. package/dist/src/modules/deobfuscator/AdvancedDeobfuscator.d.ts +5 -0
  43. package/dist/src/modules/deobfuscator/AdvancedDeobfuscator.js +43 -2
  44. package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -4
  45. package/dist/src/modules/deobfuscator/Deobfuscator.js +9 -39
  46. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.d.ts +0 -3
  47. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.js +2 -8
  48. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +1 -2
  49. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +3 -55
  50. package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
  51. package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +2 -10
  52. package/dist/src/modules/deobfuscator/VMDeobfuscator.js +3 -128
  53. package/dist/src/modules/deobfuscator/webcrack.js +15 -2
  54. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.d.ts +5 -8
  55. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +10 -102
  56. package/dist/src/modules/emulator/EnvironmentEmulator.d.ts +1 -5
  57. package/dist/src/modules/emulator/EnvironmentEmulator.js +7 -91
  58. package/dist/src/modules/emulator/EnvironmentEmulatorFetch.js +58 -61
  59. package/dist/src/modules/emulator/templates/chrome-env.d.ts +17 -7
  60. package/dist/src/modules/emulator/templates/chrome-env.js +14 -7
  61. package/dist/src/modules/external/ExternalToolRunner.js +25 -22
  62. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.compose.js +5 -5
  63. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.network.js +311 -311
  64. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.runtime.js +410 -410
  65. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.storage.js +122 -122
  66. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.d.ts +13 -0
  67. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.js +42 -0
  68. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.dynamic.js +194 -194
  69. package/dist/src/modules/monitor/FetchInterceptor.d.ts +46 -0
  70. package/dist/src/modules/monitor/FetchInterceptor.js +191 -0
  71. package/dist/src/modules/monitor/PerformanceMonitor.js +8 -7
  72. package/dist/src/modules/monitor/PlaywrightNetworkMonitor.js +62 -62
  73. package/dist/src/modules/process/BaseMemoryManager.d.ts +1 -1
  74. package/dist/src/modules/process/LinuxProcessManager.js +2 -0
  75. package/dist/src/modules/process/MacProcessManager.js +25 -25
  76. package/dist/src/modules/process/MemoryManager.d.ts +1 -1
  77. package/dist/src/modules/process/MemoryManager.js +2 -2
  78. package/dist/src/modules/process/memory/AuditTrail.js +1 -1
  79. package/dist/src/modules/process/memory/availability.js +49 -49
  80. package/dist/src/modules/process/memory/injector.js +185 -185
  81. package/dist/src/modules/process/memory/reader.js +85 -53
  82. package/dist/src/modules/process/memory/regions.dump.js +51 -51
  83. package/dist/src/modules/process/memory/regions.enumerate.js +108 -108
  84. package/dist/src/modules/process/memory/regions.modules.js +80 -80
  85. package/dist/src/modules/process/memory/regions.protection.js +148 -115
  86. package/dist/src/modules/process/memory/scanner.d.ts +5 -1
  87. package/dist/src/modules/process/memory/scanner.darwin.js +98 -41
  88. package/dist/src/modules/process/memory/scanner.js +88 -4
  89. package/dist/src/modules/process/memory/scanner.windows.js +124 -124
  90. package/dist/src/modules/process/memory/writer.js +98 -58
  91. package/dist/src/modules/security/ExecutionSandbox.js +51 -52
  92. package/dist/src/modules/stealth/FingerprintManager.js +1 -1
  93. package/dist/src/modules/stealth/StealthScripts.d.ts +1 -0
  94. package/dist/src/modules/stealth/StealthScripts.js +18 -13
  95. package/dist/src/modules/stealth/StealthVerifier.js +1 -3
  96. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.d.ts +14 -0
  97. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.js +181 -2
  98. package/dist/src/modules/trace/TraceDB.js +75 -69
  99. package/dist/src/modules/trace/TraceRecorder.js +1 -5
  100. package/dist/src/native/AntiCheatDetector.js +67 -16
  101. package/dist/src/native/CodeInjector.js +3 -3
  102. package/dist/src/native/HardwareBreakpoint.js +24 -15
  103. package/dist/src/native/HeapAnalyzer.js +2 -2
  104. package/dist/src/native/MemoryController.js +1 -1
  105. package/dist/src/native/MemoryScanSession.js +2 -2
  106. package/dist/src/native/MemoryScanner.js +4 -8
  107. package/dist/src/native/NativeMemoryManager.impl.js +2 -2
  108. package/dist/src/native/PEAnalyzer.js +14 -15
  109. package/dist/src/native/PointerChainEngine.js +2 -4
  110. package/dist/src/native/ScriptLoader.js +4 -9
  111. package/dist/src/native/Speedhack.js +1 -1
  112. package/dist/src/native/StructureAnalyzer.js +52 -33
  113. package/dist/src/native/Win32API.d.ts +1 -0
  114. package/dist/src/native/Win32API.js +13 -0
  115. package/dist/src/native/Win32Debug.js +19 -19
  116. package/dist/src/native/platform/darwin/DarwinAPI.d.ts +2 -0
  117. package/dist/src/native/platform/darwin/DarwinAPI.js +8 -0
  118. package/dist/src/native/platform/darwin/DarwinMemoryProvider.js +6 -1
  119. package/dist/src/server/MCPServer.context.d.ts +3 -1
  120. package/dist/src/server/MCPServer.d.ts +2 -1
  121. package/dist/src/server/MCPServer.domain.d.ts +1 -1
  122. package/dist/src/server/MCPServer.domain.js +81 -16
  123. package/dist/src/server/MCPServer.js +41 -14
  124. package/dist/src/server/MCPServer.resources.d.ts +2 -0
  125. package/dist/src/server/MCPServer.resources.js +91 -0
  126. package/dist/src/server/MCPServer.search.handlers.call.js +2 -1
  127. package/dist/src/server/MCPServer.search.helpers.js +1 -1
  128. package/dist/src/server/MCPServer.transport.js +12 -0
  129. package/dist/src/server/ToolCallContextGuard.js +8 -0
  130. package/dist/src/server/ToolRouter.d.ts +25 -9
  131. package/dist/src/server/ToolRouter.intent.d.ts +26 -0
  132. package/dist/src/server/ToolRouter.intent.js +77 -0
  133. package/dist/src/server/ToolRouter.js +103 -284
  134. package/dist/src/server/ToolRouter.policy.d.ts +22 -0
  135. package/dist/src/server/ToolRouter.policy.js +163 -0
  136. package/dist/src/server/ToolRouter.probe.d.ts +17 -0
  137. package/dist/src/server/ToolRouter.probe.js +103 -0
  138. package/dist/src/server/ToolRouter.renderer.d.ts +9 -0
  139. package/dist/src/server/ToolRouter.renderer.js +52 -0
  140. package/dist/src/server/activation/ActivationController.js +15 -12
  141. package/dist/src/server/activation/CompoundConditionEngine.js +1 -1
  142. package/dist/src/server/activation/PredictiveBooster.js +1 -3
  143. package/dist/src/server/domains/analysis/definitions.js +155 -655
  144. package/dist/src/server/domains/analysis/handlers.impl.js +26 -20
  145. package/dist/src/server/domains/analysis/handlers.web-tools.js +2 -1
  146. package/dist/src/server/domains/analysis/manifest.js +6 -4
  147. package/dist/src/server/domains/antidebug/definitions.js +25 -111
  148. package/dist/src/server/domains/browser/definitions.tools.advanced.js +59 -88
  149. package/dist/src/server/domains/browser/definitions.tools.behavior.js +120 -227
  150. package/dist/src/server/domains/browser/definitions.tools.page-core.js +210 -439
  151. package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
  152. package/dist/src/server/domains/browser/definitions.tools.runtime.js +98 -211
  153. package/dist/src/server/domains/browser/definitions.tools.security.js +194 -339
  154. package/dist/src/server/domains/browser/handlers/camoufox-browser.js +3 -2
  155. package/dist/src/server/domains/browser/handlers/captcha-solver.js +3 -3
  156. package/dist/src/server/domains/browser/handlers/dom-query.js +2 -1
  157. package/dist/src/server/domains/browser/handlers/framework-state.js +27 -9
  158. package/dist/src/server/domains/browser/handlers/indexeddb-dump.js +21 -20
  159. package/dist/src/server/domains/browser/handlers/script-management.js +1 -1
  160. package/dist/src/server/domains/browser/handlers/stealth-injection.d.ts +1 -0
  161. package/dist/src/server/domains/browser/handlers/stealth-injection.js +3 -0
  162. package/dist/src/server/domains/browser/handlers.impl.d.ts +1 -2
  163. package/dist/src/server/domains/browser/handlers.impl.js +2 -3
  164. package/dist/src/server/domains/browser/manifest.js +37 -13
  165. package/dist/src/server/domains/coordination/definitions.js +50 -216
  166. package/dist/src/server/domains/coordination/index.d.ts +2 -1
  167. package/dist/src/server/domains/coordination/index.js +1 -0
  168. package/dist/src/server/domains/debugger/definitions.tools.advanced.js +72 -189
  169. package/dist/src/server/domains/debugger/definitions.tools.core.js +114 -288
  170. package/dist/src/server/domains/debugger/manifest.js +9 -2
  171. package/dist/src/server/domains/encoding/definitions.js +43 -153
  172. package/dist/src/server/domains/encoding/handlers.base.js +2 -2
  173. package/dist/src/server/domains/evidence/definitions.d.ts +2 -0
  174. package/dist/src/server/domains/evidence/definitions.js +42 -0
  175. package/dist/src/server/domains/evidence/handlers.d.ts +582 -0
  176. package/dist/src/server/domains/evidence/handlers.js +60 -0
  177. package/dist/src/server/domains/evidence/index.d.ts +2 -0
  178. package/dist/src/server/domains/evidence/index.js +2 -0
  179. package/dist/src/server/domains/evidence/manifest.d.ts +63 -0
  180. package/dist/src/server/domains/evidence/manifest.js +78 -0
  181. package/dist/src/server/domains/graphql/definitions.js +53 -141
  182. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +92 -114
  183. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.shared.js +77 -77
  184. package/dist/src/server/domains/hooks/ai-handlers.d.ts +0 -7
  185. package/dist/src/server/domains/hooks/ai-handlers.js +1 -67
  186. package/dist/src/server/domains/hooks/definitions.js +69 -335
  187. package/dist/src/server/domains/hooks/manifest.d.ts +1 -1
  188. package/dist/src/server/domains/hooks/manifest.js +1 -2
  189. package/dist/src/server/domains/instrumentation/definitions.d.ts +2 -0
  190. package/dist/src/server/domains/instrumentation/definitions.js +99 -0
  191. package/dist/src/server/domains/instrumentation/handlers.d.ts +78 -0
  192. package/dist/src/server/domains/instrumentation/handlers.js +206 -0
  193. package/dist/src/server/domains/instrumentation/index.d.ts +2 -0
  194. package/dist/src/server/domains/instrumentation/index.js +2 -0
  195. package/dist/src/server/domains/instrumentation/manifest.d.ts +63 -0
  196. package/dist/src/server/domains/instrumentation/manifest.js +114 -0
  197. package/dist/src/server/domains/macro/definitions.js +16 -43
  198. package/dist/src/server/domains/maintenance/definitions.js +60 -219
  199. package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
  200. package/dist/src/server/domains/memory/definitions.js +387 -559
  201. package/dist/src/server/domains/memory/handlers/hooks.d.ts +55 -0
  202. package/dist/src/server/domains/memory/handlers/hooks.js +115 -0
  203. package/dist/src/server/domains/memory/handlers/integrity.d.ts +77 -0
  204. package/dist/src/server/domains/memory/handlers/integrity.js +180 -0
  205. package/dist/src/server/domains/memory/handlers/pointer-chain.d.ts +29 -0
  206. package/dist/src/server/domains/memory/handlers/pointer-chain.js +82 -0
  207. package/dist/src/server/domains/memory/handlers/readwrite.d.ts +41 -0
  208. package/dist/src/server/domains/memory/handlers/readwrite.js +78 -0
  209. package/dist/src/server/domains/memory/handlers/scan.d.ts +35 -0
  210. package/dist/src/server/domains/memory/handlers/scan.js +97 -0
  211. package/dist/src/server/domains/memory/handlers/session.d.ts +23 -0
  212. package/dist/src/server/domains/memory/handlers/session.js +49 -0
  213. package/dist/src/server/domains/memory/handlers/structure.d.ts +29 -0
  214. package/dist/src/server/domains/memory/handlers/structure.js +74 -0
  215. package/dist/src/server/domains/memory/handlers.impl.d.ts +49 -54
  216. package/dist/src/server/domains/memory/handlers.impl.js +63 -494
  217. package/dist/src/server/domains/memory/manifest.js +236 -64
  218. package/dist/src/server/domains/native-bridge/definitions.js +54 -192
  219. package/dist/src/server/domains/native-bridge/index.d.ts +1 -0
  220. package/dist/src/server/domains/native-bridge/index.js +2 -1
  221. package/dist/src/server/domains/network/auth-extractor.js +1 -1
  222. package/dist/src/server/domains/network/definitions.js +175 -578
  223. package/dist/src/server/domains/network/handlers.base.core.d.ts +64 -0
  224. package/dist/src/server/domains/network/handlers.base.core.js +623 -0
  225. package/dist/src/server/domains/network/handlers.base.d.ts +2 -124
  226. package/dist/src/server/domains/network/handlers.base.js +3 -878
  227. package/dist/src/server/domains/network/handlers.base.performance.d.ts +63 -0
  228. package/dist/src/server/domains/network/handlers.base.performance.js +193 -0
  229. package/dist/src/server/domains/network/handlers.base.types.d.ts +42 -0
  230. package/dist/src/server/domains/network/handlers.base.types.js +89 -0
  231. package/dist/src/server/domains/network/handlers.impl.core.runtime.d.ts +1 -1
  232. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.d.ts +21 -0
  233. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.js +186 -0
  234. package/dist/src/server/domains/network/handlers.impl.core.runtime.js +1 -1
  235. package/dist/src/server/domains/network/manifest.js +15 -0
  236. package/dist/src/server/domains/network/replay.js +1 -4
  237. package/dist/src/server/domains/platform/definitions.js +121 -112
  238. package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +4 -0
  239. package/dist/src/server/domains/platform/handlers/bridge-handlers.js +193 -4
  240. package/dist/src/server/domains/platform/handlers/electron-asar-helpers.js +26 -6
  241. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.d.ts +3 -0
  242. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.js +170 -0
  243. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.d.ts +3 -0
  244. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.js +193 -0
  245. package/dist/src/server/domains/platform/handlers/electron-handlers.d.ts +6 -0
  246. package/dist/src/server/domains/platform/handlers/electron-handlers.js +95 -2
  247. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.d.ts +2 -0
  248. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.js +370 -0
  249. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.d.ts +2 -0
  250. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.js +78 -0
  251. package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +3 -3
  252. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.d.ts +2 -0
  253. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.js +207 -0
  254. package/dist/src/server/domains/platform/handlers.d.ts +48 -0
  255. package/dist/src/server/domains/platform/handlers.js +29 -0
  256. package/dist/src/server/domains/platform/manifest.js +38 -0
  257. package/dist/src/server/domains/process/definitions.js +163 -647
  258. package/dist/src/server/domains/process/handlers.base.d.ts +3 -95
  259. package/dist/src/server/domains/process/handlers.base.js +7 -462
  260. package/dist/src/server/domains/process/handlers.base.process.d.ts +61 -0
  261. package/dist/src/server/domains/process/handlers.base.process.js +417 -0
  262. package/dist/src/server/domains/process/handlers.base.types.d.ts +57 -0
  263. package/dist/src/server/domains/process/handlers.base.types.js +50 -0
  264. package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +18 -16
  265. package/dist/src/server/domains/process/manifest.js +6 -1
  266. package/dist/src/server/domains/sandbox/definitions.js +11 -33
  267. package/dist/src/server/domains/sandbox/handlers.js +8 -3
  268. package/dist/src/server/domains/shared/ResponseBuilder.d.ts +209 -0
  269. package/dist/src/server/domains/shared/ResponseBuilder.js +48 -0
  270. package/dist/src/server/domains/shared/modules.d.ts +0 -2
  271. package/dist/src/server/domains/shared/modules.js +0 -1
  272. package/dist/src/server/domains/shared-state-board/definitions.d.ts +2 -0
  273. package/dist/src/server/domains/shared-state-board/definitions.js +78 -0
  274. package/dist/src/server/domains/shared-state-board/handlers.impl.d.ts +58 -0
  275. package/dist/src/server/domains/shared-state-board/handlers.impl.js +419 -0
  276. package/dist/src/server/domains/shared-state-board/index.d.ts +2 -0
  277. package/dist/src/server/domains/shared-state-board/index.js +2 -0
  278. package/dist/src/server/domains/shared-state-board/manifest.d.ts +57 -0
  279. package/dist/src/server/domains/shared-state-board/manifest.js +74 -0
  280. package/dist/src/server/domains/sourcemap/definitions.js +27 -111
  281. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-common.js +7 -2
  282. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-main.js +1 -1
  283. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-parse-base.js +1 -1
  284. package/dist/src/server/domains/sourcemap/manifest.d.ts +1 -1
  285. package/dist/src/server/domains/sourcemap/manifest.js +1 -1
  286. package/dist/src/server/domains/streaming/definitions.js +36 -148
  287. package/dist/src/server/domains/streaming/handlers.impl.streaming-sse.js +163 -164
  288. package/dist/src/server/domains/streaming/handlers.impl.streaming-ws.js +1 -1
  289. package/dist/src/server/domains/trace/TraceSummarizer.js +8 -5
  290. package/dist/src/server/domains/trace/definitions.tools.js +51 -206
  291. package/dist/src/server/domains/trace/handlers.js +10 -12
  292. package/dist/src/server/domains/trace/index.d.ts +2 -1
  293. package/dist/src/server/domains/trace/index.js +2 -1
  294. package/dist/src/server/domains/trace/manifest.js +15 -3
  295. package/dist/src/server/domains/transform/definitions.js +50 -210
  296. package/dist/src/server/domains/transform/handlers.impl.transform-base.js +108 -108
  297. package/dist/src/server/domains/transform/handlers.impl.transform-crypto.js +18 -19
  298. package/dist/src/server/domains/transform/manifest.d.ts +1 -1
  299. package/dist/src/server/domains/transform/manifest.js +1 -1
  300. package/dist/src/server/domains/wasm/definitions.js +55 -232
  301. package/dist/src/server/domains/wasm/handlers.js +1 -1
  302. package/dist/src/server/domains/workflow/definitions.js +144 -414
  303. package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +1 -1
  304. package/dist/src/server/domains/workflow/handlers.impl.workflow-api.js +51 -51
  305. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.d.ts +2 -0
  306. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +126 -87
  307. package/dist/src/server/domains/workflow/handlers.impl.workflow-batch.js +5 -5
  308. package/dist/src/server/evidence/ReverseEvidenceGraph.d.ts +20 -0
  309. package/dist/src/server/evidence/ReverseEvidenceGraph.js +208 -0
  310. package/dist/src/server/evidence/index.d.ts +2 -0
  311. package/dist/src/server/evidence/index.js +1 -0
  312. package/dist/src/server/evidence/types.d.ts +22 -0
  313. package/dist/src/server/evidence/types.js +1 -0
  314. package/dist/src/server/extensions/ExtensionManager.d.ts +1 -0
  315. package/dist/src/server/extensions/ExtensionManager.discovery.js +72 -9
  316. package/dist/src/server/extensions/ExtensionManager.integrity.js +1 -1
  317. package/dist/src/server/extensions/ExtensionManager.js +193 -40
  318. package/dist/src/server/extensions/ExtensionManager.roots.d.ts +1 -1
  319. package/dist/src/server/extensions/ExtensionManager.roots.js +4 -4
  320. package/dist/src/server/extensions/plugin-config.js +1 -1
  321. package/dist/src/server/extensions/plugin-env.d.ts +1 -1
  322. package/dist/src/server/extensions/plugin-env.js +10 -4
  323. package/dist/src/server/extensions/types.d.ts +17 -0
  324. package/dist/src/server/extensions/types.js +1 -1
  325. package/dist/src/server/http/SseStream.d.ts +21 -0
  326. package/dist/src/server/http/SseStream.js +129 -0
  327. package/dist/src/server/instrumentation/EvidenceGraphBridge.d.ts +13 -0
  328. package/dist/src/server/instrumentation/EvidenceGraphBridge.js +150 -0
  329. package/dist/src/server/instrumentation/InstrumentationSession.d.ts +60 -0
  330. package/dist/src/server/instrumentation/InstrumentationSession.js +269 -0
  331. package/dist/src/server/instrumentation/index.d.ts +2 -0
  332. package/dist/src/server/instrumentation/index.js +2 -0
  333. package/dist/src/server/instrumentation/types.d.ts +62 -0
  334. package/dist/src/server/instrumentation/types.js +7 -0
  335. package/dist/src/server/macros/MacroConfigLoader.d.ts +6 -5
  336. package/dist/src/server/macros/MacroConfigLoader.js +61 -59
  337. package/dist/src/server/macros/MacroRunner.js +6 -2
  338. package/dist/src/server/macros/builtins/index.d.ts +2 -3
  339. package/dist/src/server/macros/builtins/index.js +51 -7
  340. package/dist/src/server/plugins/PluginContract.d.ts +1 -1
  341. package/dist/src/server/registry/contracts.d.ts +1 -1
  342. package/dist/src/server/registry/discovery.js +5 -4
  343. package/dist/src/server/registry/ensure-browser-core.js +0 -3
  344. package/dist/src/server/registry/index.js +4 -4
  345. package/dist/src/server/registry/tool-builder.d.ts +46 -0
  346. package/dist/src/server/registry/tool-builder.js +105 -0
  347. package/dist/src/server/sandbox/QuickJSSandbox.js +16 -5
  348. package/dist/src/server/sandbox/SandboxHelpers.js +250 -250
  349. package/dist/src/server/search/EmbeddingWorker.js +5 -3
  350. package/dist/src/server/search/FeedbackTracker.d.ts +9 -0
  351. package/dist/src/server/search/FeedbackTracker.js +26 -0
  352. package/dist/src/server/search/QueryNormalizer.d.ts +6 -0
  353. package/dist/src/server/search/QueryNormalizer.js +94 -0
  354. package/dist/src/server/search/ToolSearchEngineImpl.d.ts +2 -3
  355. package/dist/src/server/search/ToolSearchEngineImpl.js +38 -88
  356. package/dist/src/server/teams/TeamManager.d.ts +43 -0
  357. package/dist/src/server/teams/TeamManager.js +238 -0
  358. package/dist/src/server/teams/index.d.ts +1 -0
  359. package/dist/src/server/teams/index.js +1 -0
  360. package/dist/src/server/workflows/WorkflowContract.d.ts +44 -4
  361. package/dist/src/server/workflows/WorkflowContract.js +52 -0
  362. package/dist/src/server/workflows/WorkflowEngine.d.ts +1 -0
  363. package/dist/src/server/workflows/WorkflowEngine.js +314 -4
  364. package/dist/src/types/config.d.ts +0 -14
  365. package/dist/src/types/deobfuscator.d.ts +1 -1
  366. package/dist/src/types/index.d.ts +1 -1
  367. package/dist/src/utils/DetailedDataManager.js +2 -0
  368. package/dist/src/utils/RingBuffer.js +5 -5
  369. package/dist/src/utils/TokenBudgetManager.js +1 -1
  370. package/dist/src/utils/UnifiedCacheManager.js +1 -1
  371. package/dist/src/utils/artifactRetention.js +2 -2
  372. package/dist/src/utils/betterSqlite3.d.ts +11 -0
  373. package/dist/src/utils/betterSqlite3.js +88 -0
  374. package/dist/src/utils/browserExecutable.js +2 -2
  375. package/dist/src/utils/cache/CachedDecorator.d.ts +8 -0
  376. package/dist/src/utils/cache/CachedDecorator.js +55 -0
  377. package/dist/src/utils/cache/PersistentCache.d.ts +33 -0
  378. package/dist/src/utils/cache/PersistentCache.js +246 -0
  379. package/dist/src/utils/cache/index.d.ts +2 -0
  380. package/dist/src/utils/cache/index.js +2 -0
  381. package/dist/src/utils/cliFastPath.js +5 -8
  382. package/dist/src/utils/config.js +4 -26
  383. package/dist/src/utils/environmentDoctor.js +138 -11
  384. package/dist/src/utils/outputPaths.js +16 -9
  385. package/dist/src/utils/parallel.js +1 -3
  386. package/package.json +82 -81
  387. package/scripts/postinstall.cjs +54 -27
  388. package/workflows/.gitkeep +0 -0
  389. package/workflows/anti-bot-diagnoser/.jshook-install.json +14 -0
  390. package/workflows/anti-bot-diagnoser/LICENSE +21 -0
  391. package/workflows/anti-bot-diagnoser/README.md +105 -0
  392. package/workflows/anti-bot-diagnoser/docs/agent-recipes.md +44 -0
  393. package/workflows/anti-bot-diagnoser/meta.yaml +6 -0
  394. package/workflows/anti-bot-diagnoser/package.json +22 -0
  395. package/workflows/anti-bot-diagnoser/tsconfig.json +15 -0
  396. package/workflows/anti-bot-diagnoser/workflow.ts +224 -0
  397. package/workflows/api-openapi-probe/.jshook-install.json +14 -0
  398. package/workflows/api-openapi-probe/meta.yaml +6 -0
  399. package/workflows/api-openapi-probe/package.json +22 -0
  400. package/workflows/api-openapi-probe/pnpm-lock.yaml +819 -0
  401. package/workflows/api-openapi-probe/tsconfig.json +15 -0
  402. package/workflows/api-openapi-probe/workflow.ts +40 -0
  403. package/workflows/api-probe-batch/.jshook-install.json +14 -0
  404. package/workflows/api-probe-batch/LICENSE +21 -0
  405. package/workflows/api-probe-batch/README.md +45 -0
  406. package/workflows/api-probe-batch/meta.yaml +4 -0
  407. package/workflows/api-probe-batch/package.json +23 -0
  408. package/workflows/api-probe-batch/tsconfig.json +16 -0
  409. package/workflows/api-probe-batch/workflow.ts +111 -0
  410. package/workflows/auth-bootstrap/.jshook-install.json +14 -0
  411. package/workflows/auth-bootstrap/LICENSE +21 -0
  412. package/workflows/auth-bootstrap/README.md +74 -0
  413. package/workflows/auth-bootstrap/meta.yaml +4 -0
  414. package/workflows/auth-bootstrap/package.json +23 -0
  415. package/workflows/auth-bootstrap/tsconfig.json +16 -0
  416. package/workflows/auth-bootstrap/workflow.ts +141 -0
  417. package/workflows/auth-extract/.jshook-install.json +14 -0
  418. package/workflows/auth-extract/meta.yaml +6 -0
  419. package/workflows/auth-extract/package.json +22 -0
  420. package/workflows/auth-extract/pnpm-lock.yaml +819 -0
  421. package/workflows/auth-extract/tsconfig.json +15 -0
  422. package/workflows/auth-extract/workflow.ts +36 -0
  423. package/workflows/auth-surface-mapper/.jshook-install.json +14 -0
  424. package/workflows/auth-surface-mapper/meta.yaml +6 -0
  425. package/workflows/auth-surface-mapper/package.json +22 -0
  426. package/workflows/auth-surface-mapper/pnpm-lock.yaml +819 -0
  427. package/workflows/auth-surface-mapper/tsconfig.json +15 -0
  428. package/workflows/auth-surface-mapper/workflow.ts +104 -0
  429. package/workflows/batch-register/.jshook-install.json +14 -0
  430. package/workflows/batch-register/LICENSE +21 -0
  431. package/workflows/batch-register/README.md +39 -0
  432. package/workflows/batch-register/meta.yaml +4 -0
  433. package/workflows/batch-register/package.json +23 -0
  434. package/workflows/batch-register/tsconfig.json +16 -0
  435. package/workflows/batch-register/workflow.ts +67 -0
  436. package/workflows/bundle-recovery/.jshook-install.json +14 -0
  437. package/workflows/bundle-recovery/LICENSE +21 -0
  438. package/workflows/bundle-recovery/README.md +105 -0
  439. package/workflows/bundle-recovery/docs/agent-recipes.md +44 -0
  440. package/workflows/bundle-recovery/meta.yaml +6 -0
  441. package/workflows/bundle-recovery/package.json +22 -0
  442. package/workflows/bundle-recovery/tsconfig.json +15 -0
  443. package/workflows/bundle-recovery/workflow.ts +179 -0
  444. package/workflows/challenge-detector/.jshook-install.json +14 -0
  445. package/workflows/challenge-detector/meta.yaml +14 -0
  446. package/workflows/challenge-detector/package.json +22 -0
  447. package/workflows/challenge-detector/pnpm-lock.yaml +819 -0
  448. package/workflows/challenge-detector/tsconfig.json +15 -0
  449. package/workflows/challenge-detector/workflow.ts +298 -0
  450. package/workflows/deobfuscation-pipeline/.jshook-install.json +14 -0
  451. package/workflows/deobfuscation-pipeline/meta.yaml +6 -0
  452. package/workflows/deobfuscation-pipeline/package.json +22 -0
  453. package/workflows/deobfuscation-pipeline/pnpm-lock.yaml +819 -0
  454. package/workflows/deobfuscation-pipeline/tsconfig.json +15 -0
  455. package/workflows/deobfuscation-pipeline/workflow.ts +119 -0
  456. package/workflows/electron-bridge-mapper/.jshook-install.json +14 -0
  457. package/workflows/electron-bridge-mapper/meta.yaml +6 -0
  458. package/workflows/electron-bridge-mapper/package.json +22 -0
  459. package/workflows/electron-bridge-mapper/pnpm-lock.yaml +819 -0
  460. package/workflows/electron-bridge-mapper/tsconfig.json +15 -0
  461. package/workflows/electron-bridge-mapper/workflow.ts +125 -0
  462. package/workflows/evidence-pack/.jshook-install.json +14 -0
  463. package/workflows/evidence-pack/LICENSE +21 -0
  464. package/workflows/evidence-pack/README.md +105 -0
  465. package/workflows/evidence-pack/docs/agent-recipes.md +44 -0
  466. package/workflows/evidence-pack/meta.yaml +6 -0
  467. package/workflows/evidence-pack/package.json +22 -0
  468. package/workflows/evidence-pack/tsconfig.json +15 -0
  469. package/workflows/evidence-pack/workflow.ts +154 -0
  470. package/workflows/js-bundle-search/.jshook-install.json +14 -0
  471. package/workflows/js-bundle-search/LICENSE +21 -0
  472. package/workflows/js-bundle-search/README.md +46 -0
  473. package/workflows/js-bundle-search/meta.yaml +4 -0
  474. package/workflows/js-bundle-search/package.json +23 -0
  475. package/workflows/js-bundle-search/tsconfig.json +16 -0
  476. package/workflows/js-bundle-search/workflow.ts +118 -0
  477. package/workflows/protocol-registry/.jshook-install.json +14 -0
  478. package/workflows/protocol-registry/meta.yaml +6 -0
  479. package/workflows/protocol-registry/package.json +22 -0
  480. package/workflows/protocol-registry/pnpm-lock.yaml +819 -0
  481. package/workflows/protocol-registry/tsconfig.json +15 -0
  482. package/workflows/protocol-registry/workflow.ts +107 -0
  483. package/workflows/qwen-mail-open-latest/meta.yaml +7 -0
  484. package/workflows/qwen-mail-open-latest/package.json +22 -0
  485. package/workflows/qwen-mail-open-latest/pnpm-lock.yaml +819 -0
  486. package/workflows/qwen-mail-open-latest/tsconfig.json +15 -0
  487. package/workflows/qwen-mail-open-latest/workflow.ts +77 -0
  488. package/workflows/register-account-flow/.jshook-install.json +14 -0
  489. package/workflows/register-account-flow/LICENSE +21 -0
  490. package/workflows/register-account-flow/README.md +64 -0
  491. package/workflows/register-account-flow/meta.yaml +4 -0
  492. package/workflows/register-account-flow/package.json +23 -0
  493. package/workflows/register-account-flow/tsconfig.json +16 -0
  494. package/workflows/register-account-flow/workflow.ts +127 -0
  495. package/workflows/replay-lab/.jshook-install.json +14 -0
  496. package/workflows/replay-lab/meta.yaml +6 -0
  497. package/workflows/replay-lab/package.json +22 -0
  498. package/workflows/replay-lab/pnpm-lock.yaml +819 -0
  499. package/workflows/replay-lab/tsconfig.json +15 -0
  500. package/workflows/replay-lab/workflow.ts +106 -0
  501. package/workflows/script-evidence-scan/.jshook-install.json +14 -0
  502. package/workflows/script-evidence-scan/LICENSE +21 -0
  503. package/workflows/script-evidence-scan/README.md +61 -0
  504. package/workflows/script-evidence-scan/meta.yaml +4 -0
  505. package/workflows/script-evidence-scan/package.json +23 -0
  506. package/workflows/script-evidence-scan/tsconfig.json +16 -0
  507. package/workflows/script-evidence-scan/workflow.ts +89 -0
  508. package/workflows/signature-hunter/.jshook-install.json +14 -0
  509. package/workflows/signature-hunter/LICENSE +21 -0
  510. package/workflows/signature-hunter/README.md +105 -0
  511. package/workflows/signature-hunter/docs/agent-recipes.md +44 -0
  512. package/workflows/signature-hunter/meta.yaml +6 -0
  513. package/workflows/signature-hunter/package.json +22 -0
  514. package/workflows/signature-hunter/tsconfig.json +15 -0
  515. package/workflows/signature-hunter/workflow.ts +170 -0
  516. package/workflows/signing-lineage/.jshook-install.json +14 -0
  517. package/workflows/signing-lineage/meta.yaml +6 -0
  518. package/workflows/signing-lineage/package.json +22 -0
  519. package/workflows/signing-lineage/pnpm-lock.yaml +819 -0
  520. package/workflows/signing-lineage/tsconfig.json +15 -0
  521. package/workflows/signing-lineage/workflow.ts +120 -0
  522. package/workflows/temp-mail-extract-link/.jshook-install.json +14 -0
  523. package/workflows/temp-mail-extract-link/LICENSE +21 -0
  524. package/workflows/temp-mail-extract-link/README.md +71 -0
  525. package/workflows/temp-mail-extract-link/meta.yaml +4 -0
  526. package/workflows/temp-mail-extract-link/package.json +23 -0
  527. package/workflows/temp-mail-extract-link/tsconfig.json +16 -0
  528. package/workflows/temp-mail-extract-link/workflow.ts +221 -0
  529. package/workflows/temp-mail-open-latest/.jshook-install.json +14 -0
  530. package/workflows/temp-mail-open-latest/LICENSE +21 -0
  531. package/workflows/temp-mail-open-latest/README.md +61 -0
  532. package/workflows/temp-mail-open-latest/meta.yaml +4 -0
  533. package/workflows/temp-mail-open-latest/package.json +23 -0
  534. package/workflows/temp-mail-open-latest/tsconfig.json +16 -0
  535. package/workflows/temp-mail-open-latest/workflow.ts +136 -0
  536. package/workflows/template/.jshook-install.json +14 -0
  537. package/workflows/template/LICENSE +21 -0
  538. package/workflows/template/README.md +45 -0
  539. package/workflows/template/docs/SKILL.md +111 -0
  540. package/workflows/template/meta.yaml +6 -0
  541. package/workflows/template/package.json +22 -0
  542. package/workflows/template/pnpm-lock.yaml +819 -0
  543. package/workflows/template/tsconfig.json +15 -0
  544. package/workflows/template/workflow.ts +73 -0
  545. package/workflows/web-api-capture-session/.jshook-install.json +14 -0
  546. package/workflows/web-api-capture-session/LICENSE +21 -0
  547. package/workflows/web-api-capture-session/README.md +64 -0
  548. package/workflows/web-api-capture-session/meta.yaml +4 -0
  549. package/workflows/web-api-capture-session/package.json +23 -0
  550. package/workflows/web-api-capture-session/tsconfig.json +16 -0
  551. package/workflows/web-api-capture-session/workflow.ts +124 -0
  552. package/workflows/ws-protocol-lifter/.jshook-install.json +14 -0
  553. package/workflows/ws-protocol-lifter/LICENSE +21 -0
  554. package/workflows/ws-protocol-lifter/README.md +105 -0
  555. package/workflows/ws-protocol-lifter/docs/agent-recipes.md +44 -0
  556. package/workflows/ws-protocol-lifter/meta.yaml +6 -0
  557. package/workflows/ws-protocol-lifter/package.json +22 -0
  558. package/workflows/ws-protocol-lifter/tsconfig.json +15 -0
  559. package/workflows/ws-protocol-lifter/workflow.ts +163 -0
  560. package/dist/src/modules/analyzer/AISummarizer.d.ts +0 -39
  561. package/dist/src/modules/analyzer/AISummarizer.js +0 -122
  562. package/dist/src/modules/hook/AIHookGenerator.d.ts +0 -52
  563. package/dist/src/modules/hook/AIHookGenerator.js +0 -360
  564. package/dist/src/modules/hook/AIHookGeneratorTemplates.d.ts +0 -9
  565. package/dist/src/modules/hook/AIHookGeneratorTemplates.js +0 -157
  566. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.d.ts +0 -2
  567. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.js +0 -25
  568. package/dist/src/server/macros/builtins/unpacker-flow.d.ts +0 -2
  569. package/dist/src/server/macros/builtins/unpacker-flow.js +0 -25
  570. package/dist/src/services/LLMService.d.ts +0 -37
  571. package/dist/src/services/LLMService.js +0 -233
  572. package/dist/src/services/prompts/analysis.d.ts +0 -9
  573. package/dist/src/services/prompts/analysis.js +0 -158
  574. package/dist/src/services/prompts/crypto.d.ts +0 -2
  575. package/dist/src/services/prompts/crypto.js +0 -108
  576. package/dist/src/services/prompts/deobfuscation.d.ts +0 -6
  577. package/dist/src/services/prompts/deobfuscation.js +0 -300
  578. package/dist/src/services/prompts/environment.d.ts +0 -16
  579. package/dist/src/services/prompts/environment.js +0 -372
  580. package/dist/src/services/prompts/intelligence.d.ts +0 -4
  581. package/dist/src/services/prompts/intelligence.js +0 -250
  582. package/dist/src/services/prompts/taint.d.ts +0 -2
  583. package/dist/src/services/prompts/taint.js +0 -54
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "noEmit": false,
7
+ "outDir": "dist",
8
+ "rootDir": ".",
9
+ "strict": true,
10
+ "skipLibCheck": true,
11
+ "types": ["node"]
12
+ },
13
+ "include": ["workflow.ts"],
14
+ "exclude": ["dist", "node_modules"]
15
+ }
@@ -0,0 +1,120 @@
1
+ import {
2
+ createWorkflow,
3
+ type WorkflowExecutionContext,
4
+ SequenceNodeBuilder,
5
+ } from '@jshookmcp/extension-sdk/workflow';
6
+
7
+ const workflowId = 'workflow.signing-lineage.v1';
8
+
9
+ export default createWorkflow(workflowId, 'Signing Lineage')
10
+ .description(
11
+ 'Traces the full signing lineage from ciphertext back to plaintext: intercepts signed requests, locates the signing function via initiator stacks, extracts the parameter normalization chain, hooks intermediate transforms, and captures the complete plaintext → normalize → concat → hash/encrypt → inject pipeline.',
12
+ )
13
+ .tags(['reverse', 'signature', 'lineage', 'crypto', 'trace', 'hook', 'parameter', 'mission'])
14
+ .timeoutMs(12 * 60_000)
15
+ .defaultMaxConcurrency(3)
16
+ .buildGraph((ctx: WorkflowExecutionContext) => {
17
+ const prefix = 'workflows.signingLineage';
18
+ const url = String(ctx.getConfig(`${prefix}.url`, 'https://example.com'));
19
+ const waitUntil = String(ctx.getConfig(`${prefix}.waitUntil`, 'networkidle0'));
20
+ const targetParam = String(ctx.getConfig(`${prefix}.targetParam`, 'sign'));
21
+ const requestTail = Number(ctx.getConfig(`${prefix}.requestTail`, 30));
22
+ const traceDepth = Number(ctx.getConfig(`${prefix}.traceDepth`, 5));
23
+ const searchKeywords = String(
24
+ ctx.getConfig(
25
+ `${prefix}.searchKeywords`,
26
+ 'sign,signature,encrypt,hmac,md5,sha,hash,token,digest,secret,key,iv,nonce',
27
+ ),
28
+ );
29
+ const maxConcurrency = Number(ctx.getConfig(`${prefix}.parallel.maxConcurrency`, 3));
30
+
31
+ const root = new SequenceNodeBuilder('signing-lineage-root');
32
+
33
+ root
34
+ // Phase 1: Network Setup & Navigate
35
+ .tool('enable-network', 'network_enable', { input: { enableExceptions: true } })
36
+ .tool('navigate', 'page_navigate', { input: { url, waitUntil } })
37
+
38
+ // Phase 2: Initial Request Capture
39
+ .tool('capture-requests', 'network_get_requests', { input: { tail: requestTail } })
40
+
41
+ // Phase 3: Parallel Source Analysis
42
+ .parallel('analyse-sources', (p) => {
43
+ p.maxConcurrency(maxConcurrency)
44
+ .failFast(false)
45
+ .tool('search-signing', 'search_in_scripts', {
46
+ input: { query: searchKeywords, matchType: 'any' },
47
+ })
48
+ .tool('detect-crypto', 'detect_crypto', { input: {} })
49
+ .tool('collect-code', 'collect_code', { input: { includeInline: true, limit: 30 } });
50
+ })
51
+
52
+ // Phase 4: Deep Function Tree — find the signing entry point
53
+ .tool('extract-signing-tree', 'extract_function_tree', {
54
+ input: { targetParam, depth: traceDepth },
55
+ })
56
+
57
+ // Phase 5: Inject Function Tracer on signing path
58
+ .tool('inject-tracer', 'console_inject_function_tracer', {
59
+ input: { persistent: false },
60
+ })
61
+
62
+ // Phase 6: Hook the signing chain at multiple levels
63
+ .tool('hook-signing', 'manage_hooks', {
64
+ input: { action: 'add', targetParam, captureArgs: true, captureReturn: true },
65
+ })
66
+
67
+ // Phase 7: Interceptor injection for XHR/Fetch to catch signed requests
68
+ .tool('inject-xhr-interceptor', 'console_inject_xhr_interceptor', {
69
+ input: { persistent: false },
70
+ })
71
+ .tool('inject-fetch-interceptor', 'console_inject_fetch_interceptor', {
72
+ input: { persistent: false },
73
+ })
74
+
75
+ // Phase 8: Re-capture after instrumentation
76
+ .tool('recapture-requests', 'network_get_requests', { input: { tail: requestTail } })
77
+
78
+ // Phase 9: Auth Surface Extraction
79
+ .tool('extract-auth', 'network_extract_auth', { input: { minConfidence: 0.2 } })
80
+
81
+ // Phase 10: Evidence Recording
82
+ .tool('create-evidence-session', 'instrumentation_session_create', {
83
+ input: {
84
+ name: `signing-lineage-${targetParam}-${new Date().toISOString().slice(0, 10)}`,
85
+ metadata: { url, targetParam, workflowId },
86
+ },
87
+ })
88
+ .tool('record-artifact', 'instrumentation_artifact_record', {
89
+ input: {
90
+ type: 'signing_lineage',
91
+ label: `Signing lineage for "${targetParam}" on ${url}`,
92
+ metadata: { url, targetParam, traceDepth },
93
+ },
94
+ })
95
+
96
+ // Phase 11: Session Insight
97
+ .tool('emit-insight', 'append_session_insight', {
98
+ input: {
99
+ insight: JSON.stringify({
100
+ status: 'signing_lineage_complete',
101
+ workflowId,
102
+ url,
103
+ targetParam,
104
+ traceDepth,
105
+ }),
106
+ },
107
+ });
108
+
109
+ return root;
110
+ })
111
+ .onStart((ctx) => {
112
+ ctx.emitMetric('workflow_runs_total', 1, 'counter', { workflowId, mission: 'signing_lineage', stage: 'start' });
113
+ })
114
+ .onFinish((ctx) => {
115
+ ctx.emitMetric('workflow_runs_total', 1, 'counter', { workflowId, mission: 'signing_lineage', stage: 'finish' });
116
+ })
117
+ .onError((ctx, error) => {
118
+ ctx.emitMetric('workflow_errors_total', 1, 'counter', { workflowId, mission: 'signing_lineage', stage: 'error', error: error.name });
119
+ })
120
+ .build();
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 1,
3
+ "kind": "workflow",
4
+ "slug": "temp-mail-extract-link",
5
+ "id": "workflow.temp-mail-extract-link.v1",
6
+ "source": {
7
+ "type": "git",
8
+ "repo": "https://github.com/vmoranv/jshook_workflow_temp_mail_extract_link",
9
+ "ref": "main",
10
+ "commit": "84c14de",
11
+ "subpath": ".",
12
+ "entry": "workflow.ts"
13
+ }
14
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 vmoranv
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,71 @@
1
+ # temp-mail-extract-link workflow
2
+
3
+ Declarative workflow for extracting activation / verification links from a temporary-mail detail page. It is generic and driven by selectors plus href/text filters rather than any Qwen-specific assumptions.
4
+
5
+ ## Entry File
6
+
7
+ - `workflow.ts`
8
+
9
+ ## Workflow ID
10
+
11
+ - `workflow.temp-mail-extract-link.v1`
12
+
13
+ ## Structure
14
+
15
+ This workflow wraps generic browser primitives into a reusable mail-detail routine:
16
+
17
+ - Optional `page_navigate` to a mail detail page
18
+ - Initial wait after navigation
19
+ - Retry-aware `page_evaluate` extraction step that:
20
+ - waits through redirect/challenge style titles
21
+ - checks optional `readySelector` / `readyText`
22
+ - extracts matched links
23
+ - optionally returns fallback link dumps
24
+ - optionally auto-opens the first matched link
25
+ - Optional post-open wait step
26
+ - `console_execute` summary step for downstream orchestration
27
+
28
+ ## Tools Used
29
+
30
+ - `page_navigate`
31
+ - `page_evaluate`
32
+ - `console_execute`
33
+
34
+ ## Config
35
+
36
+ Prefix: `workflows.tempMailExtractLink.*`
37
+
38
+ - `detailUrl`
39
+ - `waitUntil`
40
+ - `initialWaitMs`
41
+ - `retryWaitMs`
42
+ - `maxWaitAttempts`
43
+ - `readySelector`
44
+ - `readyText`
45
+ - `titleBlocklist`
46
+ - `linkSelector`
47
+ - `hrefIncludes`
48
+ - `textIncludes`
49
+ - `regexPattern`
50
+ - `regexFlags`
51
+ - `maxLinks`
52
+ - `includeFallbackLinks`
53
+ - `fallbackMaxLinks`
54
+ - `openFirstMatch`
55
+ - `waitAfterOpenMs`
56
+
57
+ ## Example Use Cases
58
+
59
+ - Extract `/api/v1/auths/activate` links from a temporary mailbox
60
+ - Extract generic `/verify` or `/confirm` links from a magic-link email
61
+ - Run on a page that briefly shows `Redirecting` before actual content loads
62
+ - Return fallback link dumps when no verification link is found yet
63
+
64
+ ## Local Validation
65
+
66
+ 1. Run `pnpm install`.
67
+ 2. Run `pnpm typecheck`.
68
+ 3. Put this repo under a configured `workflows/` extension root.
69
+ 4. Run `extensions_reload` in `jshookmcp`.
70
+ 5. Confirm the workflow appears in `list_extension_workflows`.
71
+ 6. Execute the workflow on a mail detail page and verify that the extraction result includes either matched links or fallback links.
@@ -0,0 +1,4 @@
1
+ name: temp-mail-extract-link
2
+ description: Declarative workflow for extracting verification or activation links from a temp-mail detail page.
3
+ author: vmoranv
4
+ source_repo: https://github.com/vmoranv/jshook_workflow_temp_mail_extract_link
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@jshookmcpextension/workflow-temp-mail-extract-link",
3
+ "scripts": {
4
+ "build": "tsc -p tsconfig.json",
5
+ "typecheck": "tsc --noEmit -p tsconfig.json"
6
+ },
7
+ "type": "module",
8
+ "dependencies": {
9
+ "@jshookmcp/extension-sdk": "^0.3.0",
10
+ "@modelcontextprotocol/sdk": "^1.27.1",
11
+ "dotenv": "^17.3.1"
12
+ },
13
+ "version": "0.1.0",
14
+ "engines": {
15
+ "node": ">=20.0.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^25.3.0",
19
+ "typescript": "^5.9.3"
20
+ },
21
+ "private": true,
22
+ "packageManager": "pnpm@10.28.2"
23
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2022"],
7
+ "strict": true,
8
+ "skipLibCheck": true,
9
+ "esModuleInterop": true,
10
+ "resolveJsonModule": true,
11
+ "rootDir": ".",
12
+ "outDir": "dist"
13
+ },
14
+ "include": ["workflow.ts"],
15
+ "exclude": ["dist", "node_modules"]
16
+ }
@@ -0,0 +1,221 @@
1
+ import type { WorkflowContract } from '@jshookmcp/extension-sdk/workflow';
2
+ import { toolNode, sequenceNode, branchNode } from '@jshookmcp/extension-sdk/workflow';
3
+
4
+ const workflowId = 'workflow.temp-mail-extract-link.v1';
5
+
6
+ const workflow: WorkflowContract = {
7
+ kind: 'workflow-contract',
8
+ version: 1,
9
+ id: workflowId,
10
+ displayName: 'Temp Mail Extract Link',
11
+ description:
12
+ 'Navigate or reuse a temp-mail detail page, wait through redirects/challenges, scan main document and accessible iframes, classify fallback links, and optionally auto-open the first verification match.',
13
+ tags: ['workflow', 'mail', 'temp-mail', 'verification', 'link-extract'],
14
+ timeoutMs: 3 * 60_000,
15
+ defaultMaxConcurrency: 1,
16
+
17
+ build(ctx) {
18
+ const prefix = 'workflows.tempMailExtractLink';
19
+ const detailUrl = ctx.getConfig<string>(`${prefix}.detailUrl`, '');
20
+ const waitUntil = ctx.getConfig<string>(`${prefix}.waitUntil`, 'domcontentloaded');
21
+ const initialWaitMs = ctx.getConfig<number>(`${prefix}.initialWaitMs`, 1200);
22
+ const retryWaitMs = ctx.getConfig<number>(`${prefix}.retryWaitMs`, 1000);
23
+ const maxWaitAttempts = ctx.getConfig<number>(`${prefix}.maxWaitAttempts`, 5);
24
+ const readySelector = ctx.getConfig<string>(`${prefix}.readySelector`, '');
25
+ const readyText = ctx.getConfig<string>(`${prefix}.readyText`, '');
26
+ const titleBlocklist = ctx.getConfig<string[]>(`${prefix}.titleBlocklist`, ['Redirecting']);
27
+ const bodyBlocklist = ctx.getConfig<string[]>(`${prefix}.bodyBlocklist`, ['Checking your browser', 'Just a moment']);
28
+ const expectedContextHints = ctx.getConfig<string[]>(`${prefix}.expectedContextHints`, ['邮件', 'mail', '发件人', 'subject']);
29
+ const linkSelector = ctx.getConfig<string>(`${prefix}.linkSelector`, 'a');
30
+ const hrefIncludes = ctx.getConfig<string[]>(`${prefix}.hrefIncludes`, []);
31
+ const textIncludes = ctx.getConfig<string[]>(`${prefix}.textIncludes`, []);
32
+ const regexPattern = ctx.getConfig<string>(`${prefix}.regexPattern`, '');
33
+ const regexFlags = ctx.getConfig<string>(`${prefix}.regexFlags`, 'i');
34
+ const maxLinks = ctx.getConfig<number>(`${prefix}.maxLinks`, 20);
35
+ const includeFallbackLinks = ctx.getConfig<boolean>(`${prefix}.includeFallbackLinks`, true);
36
+ const fallbackMaxLinks = ctx.getConfig<number>(`${prefix}.fallbackMaxLinks`, 20);
37
+ const openFirstMatch = ctx.getConfig<boolean>(`${prefix}.openFirstMatch`, false);
38
+ const waitAfterOpenMs = ctx.getConfig<number>(`${prefix}.waitAfterOpenMs`, 2000);
39
+
40
+ return sequenceNode('temp-mail-extract-link-root')
41
+ .step(branchNode('maybe-navigate-detail', 'temp_mail_extract_link_has_detail_url')
42
+ .predicateFn(() => Boolean(detailUrl))
43
+ .whenTrue(toolNode('navigate-detail', 'page_navigate').input({ url: detailUrl, waitUntil, enableNetworkMonitoring: true }))
44
+ .whenFalse(toolNode('skip-navigate-detail', 'console_execute').input({
45
+ expression: '({ skipped: true, step: "navigate-detail", reason: "detailUrl not provided" })',
46
+ })))
47
+ .step(toolNode('initial-wait', 'page_evaluate')
48
+ .input({ code: `new Promise(resolve => setTimeout(() => resolve({ waitedMs: ${initialWaitMs} }), ${initialWaitMs}))` })
49
+ .timeout(Math.max(10_000, initialWaitMs + 2_000)))
50
+ .step(toolNode('extract-links', 'page_evaluate')
51
+ .input({
52
+ code: `(async function(){
53
+ const settings = {
54
+ readySelector: ${JSON.stringify(readySelector)},
55
+ readyText: ${JSON.stringify(readyText)},
56
+ titleBlocklist: ${JSON.stringify(titleBlocklist)},
57
+ bodyBlocklist: ${JSON.stringify(bodyBlocklist)},
58
+ expectedContextHints: ${JSON.stringify(expectedContextHints)},
59
+ linkSelector: ${JSON.stringify(linkSelector)},
60
+ hrefIncludes: ${JSON.stringify(hrefIncludes)},
61
+ textIncludes: ${JSON.stringify(textIncludes)},
62
+ regexPattern: ${JSON.stringify(regexPattern)},
63
+ regexFlags: ${JSON.stringify(regexFlags)},
64
+ maxLinks: ${JSON.stringify(maxLinks)},
65
+ includeFallbackLinks: ${JSON.stringify(includeFallbackLinks)},
66
+ fallbackMaxLinks: ${JSON.stringify(fallbackMaxLinks)},
67
+ openFirstMatch: ${JSON.stringify(openFirstMatch)},
68
+ retryWaitMs: ${JSON.stringify(retryWaitMs)},
69
+ maxWaitAttempts: ${JSON.stringify(maxWaitAttempts)}
70
+ };
71
+
72
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
73
+ const normalize = (value) => (value || '').trim();
74
+ const regex = settings.regexPattern ? new RegExp(settings.regexPattern, settings.regexFlags) : null;
75
+
76
+ const classifyLink = (item) => {
77
+ const combined = (item.href + ' ' + item.text).toLowerCase();
78
+ if (/activate|activation/.test(combined)) return 'activation';
79
+ if (/verify|verification|confirm/.test(combined)) return 'verification';
80
+ if (/mail\\/view/.test(combined)) return 'mail_view';
81
+ if (/login|signin|signup|register|auth/.test(combined)) return 'auth';
82
+ if (/privacy|terms|policy|contact|help/.test(combined)) return 'navigation';
83
+ return 'other';
84
+ };
85
+
86
+ const getDocuments = () => {
87
+ const docs = [{ label: 'main', doc: document }];
88
+ const frames = Array.from(document.querySelectorAll('iframe'));
89
+ for (let index = 0; index < frames.length; index += 1) {
90
+ const frame = frames[index];
91
+ try {
92
+ const frameDoc = frame.contentDocument || frame.contentWindow?.document;
93
+ if (frameDoc) {
94
+ docs.push({ label: 'iframe:' + index, doc: frameDoc });
95
+ }
96
+ } catch {
97
+ // cross-origin iframe; ignore safely
98
+ }
99
+ }
100
+ return docs;
101
+ };
102
+
103
+ const collectLinks = () => {
104
+ const docs = getDocuments();
105
+ const allLinks = [];
106
+ for (const item of docs) {
107
+ const anchors = Array.from(item.doc.querySelectorAll(settings.linkSelector));
108
+ for (const anchor of anchors) {
109
+ const href = normalize(anchor.href || anchor.getAttribute('href') || '');
110
+ const text = normalize(anchor.innerText || anchor.textContent || '');
111
+ if (!href && !text) continue;
112
+ allLinks.push({ href, text, source: item.label, kind: classifyLink({ href, text }) });
113
+ }
114
+ }
115
+
116
+ const matches = allLinks.filter((item) => {
117
+ const combined = (item.href + ' ' + item.text).trim();
118
+ const hrefOk = settings.hrefIncludes.length === 0 || settings.hrefIncludes.some((value) => item.href.includes(value));
119
+ const textOk = settings.textIncludes.length === 0 || settings.textIncludes.some((value) => item.text.includes(value));
120
+ const regexOk = !regex || regex.test(combined);
121
+ return hrefOk && textOk && regexOk;
122
+ }).slice(0, settings.maxLinks);
123
+
124
+ const fallbackLinks = settings.includeFallbackLinks
125
+ ? allLinks.slice(0, settings.fallbackMaxLinks)
126
+ : [];
127
+
128
+ const fallbackSummary = allLinks.reduce((acc, item) => {
129
+ acc[item.kind] = (acc[item.kind] || 0) + 1;
130
+ return acc;
131
+ }, {});
132
+
133
+ return { docsCount: docs.length, allLinksCount: allLinks.length, matches, fallbackLinks, fallbackSummary };
134
+ };
135
+
136
+ for (let attempt = 1; attempt <= settings.maxWaitAttempts; attempt++) {
137
+ const title = document.title || '';
138
+ const href = window.location.href || '';
139
+ const bodyText = document.body?.innerText || '';
140
+ const titleBlocked = settings.titleBlocklist.some((value) => value && title.includes(value));
141
+ const bodyBlocked = settings.bodyBlocklist.some((value) => value && bodyText.includes(value));
142
+ const selectorReady = !settings.readySelector || !!document.querySelector(settings.readySelector);
143
+ const textReady = !settings.readyText || bodyText.includes(settings.readyText);
144
+ const contextHintMatched = settings.expectedContextHints.length === 0 || settings.expectedContextHints.some((value) => title.includes(value) || bodyText.includes(value) || href.includes(value));
145
+ const linkData = collectLinks();
146
+
147
+ if (!titleBlocked && !bodyBlocked && selectorReady && textReady) {
148
+ const firstMatch = linkData.matches.length > 0 ? linkData.matches[0] : null;
149
+ let opened = false;
150
+ if (settings.openFirstMatch && firstMatch && firstMatch.href) {
151
+ window.location.href = firstMatch.href;
152
+ opened = true;
153
+ }
154
+ return {
155
+ success: linkData.matches.length > 0, attempt, title, href,
156
+ titleBlocked, bodyBlocked, selectorReady, textReady, contextHintMatched,
157
+ contextWarning: contextHintMatched ? null : 'current page does not look like a mail-detail context',
158
+ matchedCount: linkData.matches.length, firstMatch, opened,
159
+ matches: linkData.matches, fallbackLinks: linkData.fallbackLinks,
160
+ fallbackSummary: linkData.fallbackSummary,
161
+ allLinksCount: linkData.allLinksCount, docsCount: linkData.docsCount,
162
+ };
163
+ }
164
+
165
+ if (attempt < settings.maxWaitAttempts) {
166
+ await sleep(settings.retryWaitMs);
167
+ } else {
168
+ return {
169
+ success: false, attempt, title, href,
170
+ titleBlocked, bodyBlocked, selectorReady, textReady, contextHintMatched,
171
+ contextWarning: contextHintMatched ? null : 'current page does not look like a mail-detail context',
172
+ matchedCount: linkData.matches.length,
173
+ firstMatch: linkData.matches.length > 0 ? linkData.matches[0] : null,
174
+ opened: false,
175
+ matches: linkData.matches, fallbackLinks: linkData.fallbackLinks,
176
+ fallbackSummary: linkData.fallbackSummary,
177
+ allLinksCount: linkData.allLinksCount, docsCount: linkData.docsCount,
178
+ reason: 'ready_or_match_conditions_not_met',
179
+ };
180
+ }
181
+ }
182
+
183
+ return { success: false, reason: 'unreachable' };
184
+ })()`,
185
+ })
186
+ .timeout(Math.max(15_000, initialWaitMs + maxWaitAttempts * retryWaitMs + 5_000)))
187
+ .step(branchNode('maybe-wait-after-open', 'temp_mail_extract_link_wait_after_open')
188
+ .predicateFn(() => openFirstMatch)
189
+ .whenTrue(toolNode('wait-after-open', 'page_evaluate')
190
+ .input({ code: `new Promise(resolve => setTimeout(() => resolve({ waitedMs: ${waitAfterOpenMs} }), ${waitAfterOpenMs}))` })
191
+ .timeout(Math.max(10_000, waitAfterOpenMs + 2_000)))
192
+ .whenFalse(toolNode('skip-wait-after-open', 'console_execute').input({
193
+ expression: '({ skipped: true, step: "wait-after-open", reason: "openFirstMatch=false" })',
194
+ })))
195
+ .step(toolNode('emit-summary', 'console_execute').input({
196
+ expression: `(${JSON.stringify({
197
+ workflowId,
198
+ detailUrl, waitUntil, initialWaitMs, retryWaitMs, maxWaitAttempts,
199
+ readySelector, readyText, titleBlocklist, bodyBlocklist, expectedContextHints,
200
+ linkSelector, hrefIncludes, textIncludes, regexPattern, regexFlags,
201
+ maxLinks, includeFallbackLinks, fallbackMaxLinks, openFirstMatch, waitAfterOpenMs,
202
+ note: 'Inspect extract-links output for matched href/text pairs, contextWarning, fallbackLinks, fallbackSummary, and docsCount.',
203
+ })})`,
204
+ }))
205
+ .build();
206
+ },
207
+
208
+ onStart(ctx) {
209
+ ctx.emitMetric('workflow_runs_total', 1, 'counter', { workflowId, stage: 'start' });
210
+ },
211
+
212
+ onFinish(ctx) {
213
+ ctx.emitMetric('workflow_runs_total', 1, 'counter', { workflowId, stage: 'finish' });
214
+ },
215
+
216
+ onError(ctx, error) {
217
+ ctx.emitMetric('workflow_errors_total', 1, 'counter', { workflowId, error: error.name });
218
+ },
219
+ };
220
+
221
+ export default workflow;
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 1,
3
+ "kind": "workflow",
4
+ "slug": "temp-mail-open-latest",
5
+ "id": "workflow.temp-mail-open-latest.v1",
6
+ "source": {
7
+ "type": "git",
8
+ "repo": "https://github.com/vmoranv/jshook_workflow_temp_mail_open_latest",
9
+ "ref": "main",
10
+ "commit": "c0c067c",
11
+ "subpath": ".",
12
+ "entry": "workflow.ts"
13
+ }
14
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 vmoranv
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,61 @@
1
+ # temp-mail-open-latest workflow
2
+
3
+ Declarative workflow for opening the latest relevant message in a temporary mailbox.
4
+
5
+ ## Entry File
6
+
7
+ - `workflow.ts`
8
+
9
+ ## Workflow ID
10
+
11
+ - `workflow.temp-mail-open-latest.v1`
12
+
13
+ ## What It Does
14
+
15
+ - Navigates to a mailbox page
16
+ - Waits for an inbox-ready selector
17
+ - Optionally clicks a refresh button or trigger
18
+ - Waits for inbox updates to settle
19
+ - Scans mailbox anchors with configurable selectors and matching rules
20
+ - Opens the latest relevant message by navigating to its link
21
+ - Emits a small summary payload for downstream workflows or operators
22
+
23
+ ## Tools Used
24
+
25
+ - `page_navigate`
26
+ - `page_wait_for_selector`
27
+ - `page_evaluate`
28
+ - `console_execute`
29
+
30
+ ## Config
31
+
32
+ All config keys live under `workflows.tempMailOpenLatest.*`:
33
+
34
+ - `mailboxUrl`
35
+ - `waitUntil`
36
+ - `readySelector`
37
+ - `timeoutMs`
38
+ - `refreshSelector`
39
+ - `refreshWaitMs`
40
+ - `itemSelector`
41
+ - `hrefIncludes`
42
+ - `hrefRegex`
43
+ - `textIncludes`
44
+ - `textRegex`
45
+ - `openOrder` (`first` or `last`)
46
+
47
+ ## Matching Strategy
48
+
49
+ A candidate anchor is selected from `itemSelector` and filtered by:
50
+
51
+ - href contains `hrefIncludes` (if provided)
52
+ - href matches `hrefRegex` (if provided)
53
+ - text contains `textIncludes` (if provided)
54
+ - text matches `textRegex` (if provided)
55
+
56
+ Then the workflow opens either the `first` or `last` matching item.
57
+
58
+ ## Notes
59
+
60
+ - This workflow is intentionally provider-agnostic and is not tied to Qwen.
61
+ - It is designed to pair well with a separate link-extraction workflow on the message detail page.
@@ -0,0 +1,4 @@
1
+ name: temp-mail-open-latest
2
+ description: Declarative workflow for opening the latest relevant message in a temporary mailbox.
3
+ author: vmoranv
4
+ source_repo: https://github.com/vmoranv/jshook_workflow_temp_mail_open_latest
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@jshookmcpextension/workflow-temp-mail-open-latest",
3
+ "scripts": {
4
+ "build": "tsc -p tsconfig.json",
5
+ "typecheck": "tsc --noEmit -p tsconfig.json"
6
+ },
7
+ "type": "module",
8
+ "dependencies": {
9
+ "@jshookmcp/extension-sdk": "^0.3.0",
10
+ "@modelcontextprotocol/sdk": "^1.27.1",
11
+ "dotenv": "^17.3.1"
12
+ },
13
+ "version": "0.1.0",
14
+ "engines": {
15
+ "node": ">=20.0.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^25.3.0",
19
+ "typescript": "^5.9.3"
20
+ },
21
+ "private": true,
22
+ "packageManager": "pnpm@10.28.2"
23
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2022"],
7
+ "strict": true,
8
+ "skipLibCheck": true,
9
+ "esModuleInterop": true,
10
+ "resolveJsonModule": true,
11
+ "rootDir": ".",
12
+ "outDir": "dist"
13
+ },
14
+ "include": ["workflow.ts"],
15
+ "exclude": ["dist", "node_modules"]
16
+ }