@jshookmcp/jshook 0.2.2 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +15 -6
  3. package/README.zh.md +19 -4
  4. package/dist/native/scripts/linux/enum-windows.sh +12 -12
  5. package/dist/native/scripts/macos/enum-windows.applescript +22 -22
  6. package/dist/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  7. package/dist/native/scripts/windows/enum-windows.ps1 +44 -44
  8. package/dist/native/scripts/windows/inject-dll.ps1 +21 -21
  9. package/dist/packages/extension-sdk/src/bridges/shared.js +2 -2
  10. package/dist/packages/extension-sdk/src/plugin.d.ts +5 -0
  11. package/dist/packages/extension-sdk/src/plugin.js +119 -33
  12. package/dist/packages/extension-sdk/src/workflow.d.ts +156 -0
  13. package/dist/packages/extension-sdk/src/workflow.js +236 -0
  14. package/dist/src/config/search-defaults.js +161 -0
  15. package/dist/src/constants.d.ts +3 -0
  16. package/dist/src/constants.js +4 -1
  17. package/dist/src/index.d.ts +1 -1
  18. package/dist/src/index.js +13 -17
  19. package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -3
  20. package/dist/src/modules/analyzer/CodeAnalyzer.js +16 -28
  21. package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.d.ts +1 -2
  22. package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.js +1 -45
  23. package/dist/src/modules/analyzer/IntelligentAnalyzer.d.ts +1 -37
  24. package/dist/src/modules/analyzer/IntelligentAnalyzer.js +9 -142
  25. package/dist/src/modules/analyzer/PatternDetector.js +3 -3
  26. package/dist/src/modules/analyzer/PatternDetectorAuthPatterns.js +1 -1
  27. package/dist/src/modules/browser/BrowserDiscovery.d.ts +6 -5
  28. package/dist/src/modules/browser/BrowserDiscovery.js +3 -3
  29. package/dist/src/modules/browser/BrowserModeManager.d.ts +1 -1
  30. package/dist/src/modules/browser/BrowserModeManager.js +11 -10
  31. package/dist/src/modules/browser/TabRegistry.js +2 -2
  32. package/dist/src/modules/browser/UnifiedBrowserManager.d.ts +1 -0
  33. package/dist/src/modules/browser/UnifiedBrowserManager.js +19 -4
  34. package/dist/src/modules/captcha/AICaptchaDetector.d.ts +14 -23
  35. package/dist/src/modules/captcha/AICaptchaDetector.js +8 -202
  36. package/dist/src/modules/captcha/CaptchaDetector.d.ts +31 -17
  37. package/dist/src/modules/captcha/CaptchaDetector.js +1 -1
  38. package/dist/src/modules/collector/CodeCache.d.ts +2 -2
  39. package/dist/src/modules/collector/CodeCollector.d.ts +12 -9
  40. package/dist/src/modules/collector/CodeCollector.js +5 -6
  41. package/dist/src/modules/collector/DOMInspector.d.ts +3 -2
  42. package/dist/src/modules/collector/DOMInspector.js +49 -59
  43. package/dist/src/modules/collector/PageController.d.ts +17 -4
  44. package/dist/src/modules/collector/PageController.js +2 -5
  45. package/dist/src/modules/collector/PageScriptCollectors.js +3 -3
  46. package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -4
  47. package/dist/src/modules/crypto/CryptoDetector.js +2 -42
  48. package/dist/src/modules/crypto/CryptoRules.js +1 -1
  49. package/dist/src/modules/debugger/BlackboxManager.js +1 -1
  50. package/dist/src/modules/debugger/DebuggerManager.impl.core.scope.js +1 -1
  51. package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +5 -3
  52. package/dist/src/modules/debugger/WatchExpressionManager.js +1 -1
  53. package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -4
  54. package/dist/src/modules/deobfuscator/Deobfuscator.js +4 -39
  55. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.d.ts +0 -3
  56. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.js +2 -8
  57. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +2 -3
  58. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +5 -57
  59. package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
  60. package/dist/src/modules/deobfuscator/PackerDeobfuscator.js +1 -1
  61. package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +2 -10
  62. package/dist/src/modules/deobfuscator/VMDeobfuscator.js +3 -128
  63. package/dist/src/modules/deobfuscator/webcrack.js +15 -2
  64. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.d.ts +5 -8
  65. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +10 -102
  66. package/dist/src/modules/emulator/EnvironmentEmulator.d.ts +1 -5
  67. package/dist/src/modules/emulator/EnvironmentEmulator.js +7 -91
  68. package/dist/src/modules/emulator/EnvironmentEmulatorFetch.js +58 -61
  69. package/dist/src/modules/emulator/templates/chrome-env.d.ts +17 -7
  70. package/dist/src/modules/emulator/templates/chrome-env.js +14 -7
  71. package/dist/src/modules/external/ExternalToolRunner.d.ts +1 -1
  72. package/dist/src/modules/external/ExternalToolRunner.js +26 -23
  73. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.d.ts +13 -0
  74. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.js +42 -0
  75. package/dist/src/modules/monitor/FetchInterceptor.d.ts +46 -0
  76. package/dist/src/modules/monitor/FetchInterceptor.js +191 -0
  77. package/dist/src/modules/monitor/PerformanceMonitor.js +8 -7
  78. package/dist/src/modules/process/BaseMemoryManager.d.ts +1 -1
  79. package/dist/src/modules/process/LinuxProcessManager.js +4 -2
  80. package/dist/src/modules/process/MacProcessManager.js +1 -1
  81. package/dist/src/modules/process/MemoryManager.d.ts +1 -1
  82. package/dist/src/modules/process/MemoryManager.js +2 -2
  83. package/dist/src/modules/process/ProcessManager.impl.js +1 -1
  84. package/dist/src/modules/process/memory/AuditTrail.js +1 -1
  85. package/dist/src/modules/process/memory/reader.js +35 -3
  86. package/dist/src/modules/process/memory/regions.enumerate.js +1 -1
  87. package/dist/src/modules/process/memory/regions.protection.js +42 -9
  88. package/dist/src/modules/process/memory/scanner.d.ts +5 -1
  89. package/dist/src/modules/process/memory/scanner.darwin.js +57 -0
  90. package/dist/src/modules/process/memory/scanner.js +88 -4
  91. package/dist/src/modules/process/memory/writer.js +44 -4
  92. package/dist/src/modules/security/ExecutionSandbox.js +7 -8
  93. package/dist/src/modules/stealth/FingerprintManager.js +1 -1
  94. package/dist/src/modules/stealth/StealthScripts.d.ts +4 -2
  95. package/dist/src/modules/stealth/StealthScripts.js +53 -14
  96. package/dist/src/modules/stealth/StealthVerifier.d.ts +1 -1
  97. package/dist/src/modules/stealth/StealthVerifier.js +2 -4
  98. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.d.ts +14 -0
  99. package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.js +181 -2
  100. package/dist/src/modules/trace/TraceDB.js +12 -6
  101. package/dist/src/modules/trace/TraceRecorder.js +1 -5
  102. package/dist/src/native/AntiCheatDetector.js +67 -16
  103. package/dist/src/native/CodeInjector.js +4 -4
  104. package/dist/src/native/HardwareBreakpoint.js +25 -16
  105. package/dist/src/native/HeapAnalyzer.js +2 -2
  106. package/dist/src/native/MemoryController.js +1 -1
  107. package/dist/src/native/MemoryScanSession.js +2 -2
  108. package/dist/src/native/MemoryScanner.js +4 -8
  109. package/dist/src/native/NativeMemoryManager.impl.js +2 -2
  110. package/dist/src/native/PEAnalyzer.js +14 -15
  111. package/dist/src/native/PointerChainEngine.js +2 -4
  112. package/dist/src/native/ScriptLoader.js +4 -9
  113. package/dist/src/native/Speedhack.js +1 -1
  114. package/dist/src/native/StructureAnalyzer.js +52 -33
  115. package/dist/src/native/Win32API.d.ts +1 -0
  116. package/dist/src/native/Win32API.js +13 -0
  117. package/dist/src/native/Win32Debug.js +19 -19
  118. package/dist/src/native/platform/darwin/DarwinAPI.d.ts +2 -0
  119. package/dist/src/native/platform/darwin/DarwinAPI.js +8 -0
  120. package/dist/src/native/platform/darwin/DarwinMemoryProvider.js +6 -1
  121. package/dist/src/server/MCPServer.context.d.ts +2 -1
  122. package/dist/src/server/MCPServer.d.ts +2 -1
  123. package/dist/src/server/MCPServer.domain.d.ts +1 -1
  124. package/dist/src/server/MCPServer.domain.js +81 -16
  125. package/dist/src/server/MCPServer.js +42 -14
  126. package/dist/src/server/MCPServer.resources.d.ts +2 -0
  127. package/dist/src/server/MCPServer.resources.js +91 -0
  128. package/dist/src/server/MCPServer.search.handlers.call.js +2 -1
  129. package/dist/src/server/MCPServer.search.helpers.js +2 -2
  130. package/dist/src/server/MCPServer.tools.js +1 -1
  131. package/dist/src/server/MCPServer.transport.js +12 -0
  132. package/dist/src/server/ToolCallContextGuard.d.ts +5 -0
  133. package/dist/src/server/ToolCallContextGuard.js +85 -0
  134. package/dist/src/server/ToolRouter.d.ts +26 -10
  135. package/dist/src/server/ToolRouter.intent.d.ts +26 -0
  136. package/dist/src/server/ToolRouter.intent.js +77 -0
  137. package/dist/src/server/ToolRouter.js +103 -284
  138. package/dist/src/server/ToolRouter.policy.d.ts +22 -0
  139. package/dist/src/server/ToolRouter.policy.js +163 -0
  140. package/dist/src/server/ToolRouter.probe.d.ts +17 -0
  141. package/dist/src/server/ToolRouter.probe.js +103 -0
  142. package/dist/src/server/ToolRouter.renderer.d.ts +9 -0
  143. package/dist/src/server/ToolRouter.renderer.js +52 -0
  144. package/dist/src/server/activation/ActivationController.js +15 -12
  145. package/dist/src/server/activation/CompoundConditionEngine.js +1 -1
  146. package/dist/src/server/activation/PredictiveBooster.js +1 -3
  147. package/dist/src/server/domains/analysis/definitions.js +155 -655
  148. package/dist/src/server/domains/analysis/handlers.impl.d.ts +8 -8
  149. package/dist/src/server/domains/analysis/handlers.impl.js +34 -28
  150. package/dist/src/server/domains/analysis/handlers.web-tools.js +4 -3
  151. package/dist/src/server/domains/analysis/manifest.js +6 -4
  152. package/dist/src/server/domains/antidebug/definitions.js +25 -111
  153. package/dist/src/server/domains/browser/definitions.tools.advanced.js +59 -88
  154. package/dist/src/server/domains/browser/definitions.tools.behavior.js +120 -227
  155. package/dist/src/server/domains/browser/definitions.tools.page-core.js +157 -386
  156. package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
  157. package/dist/src/server/domains/browser/definitions.tools.runtime.js +61 -174
  158. package/dist/src/server/domains/browser/definitions.tools.security.js +92 -237
  159. package/dist/src/server/domains/browser/handlers/camoufox-browser.js +3 -2
  160. package/dist/src/server/domains/browser/handlers/captcha-solver.js +3 -3
  161. package/dist/src/server/domains/browser/handlers/dom-query.js +2 -1
  162. package/dist/src/server/domains/browser/handlers/facade-initializer.d.ts +3 -3
  163. package/dist/src/server/domains/browser/handlers/facade-initializer.js +3 -3
  164. package/dist/src/server/domains/browser/handlers/framework-state.js +231 -3
  165. package/dist/src/server/domains/browser/handlers/indexeddb-dump.js +21 -20
  166. package/dist/src/server/domains/browser/handlers/script-management.js +1 -1
  167. package/dist/src/server/domains/browser/handlers/stealth-injection.js +8 -2
  168. package/dist/src/server/domains/browser/handlers.impl.d.ts +15 -12
  169. package/dist/src/server/domains/browser/handlers.impl.js +5 -6
  170. package/dist/src/server/domains/browser/manifest.js +37 -13
  171. package/dist/src/server/domains/coordination/definitions.js +50 -149
  172. package/dist/src/server/domains/coordination/index.d.ts +20 -1
  173. package/dist/src/server/domains/coordination/index.js +133 -0
  174. package/dist/src/server/domains/coordination/manifest.js +15 -0
  175. package/dist/src/server/domains/debugger/definitions.tools.advanced.js +72 -189
  176. package/dist/src/server/domains/debugger/definitions.tools.core.js +114 -288
  177. package/dist/src/server/domains/debugger/manifest.js +9 -2
  178. package/dist/src/server/domains/encoding/definitions.js +43 -153
  179. package/dist/src/server/domains/encoding/handlers.base.js +2 -2
  180. package/dist/src/server/domains/evidence/definitions.d.ts +2 -0
  181. package/dist/src/server/domains/evidence/definitions.js +42 -0
  182. package/dist/src/server/domains/evidence/handlers.d.ts +582 -0
  183. package/dist/src/server/domains/evidence/handlers.js +60 -0
  184. package/dist/src/server/domains/evidence/index.d.ts +2 -0
  185. package/dist/src/server/domains/evidence/index.js +2 -0
  186. package/dist/src/server/domains/evidence/manifest.d.ts +63 -0
  187. package/dist/src/server/domains/evidence/manifest.js +78 -0
  188. package/dist/src/server/domains/graphql/definitions.js +53 -141
  189. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +92 -114
  190. package/dist/src/server/domains/hooks/ai-handlers.d.ts +0 -7
  191. package/dist/src/server/domains/hooks/ai-handlers.js +4 -70
  192. package/dist/src/server/domains/hooks/definitions.js +69 -335
  193. package/dist/src/server/domains/hooks/manifest.d.ts +1 -1
  194. package/dist/src/server/domains/hooks/manifest.js +1 -2
  195. package/dist/src/server/domains/instrumentation/definitions.d.ts +2 -0
  196. package/dist/src/server/domains/instrumentation/definitions.js +99 -0
  197. package/dist/src/server/domains/instrumentation/handlers.d.ts +78 -0
  198. package/dist/src/server/domains/instrumentation/handlers.js +206 -0
  199. package/dist/src/server/domains/instrumentation/index.d.ts +2 -0
  200. package/dist/src/server/domains/instrumentation/index.js +2 -0
  201. package/dist/src/server/domains/instrumentation/manifest.d.ts +63 -0
  202. package/dist/src/server/domains/instrumentation/manifest.js +114 -0
  203. package/dist/src/server/domains/macro/definitions.js +16 -43
  204. package/dist/src/server/domains/maintenance/definitions.js +60 -219
  205. package/dist/src/server/domains/maintenance/handlers.d.ts +2 -2
  206. package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
  207. package/dist/src/server/domains/maintenance/handlers.js +2 -2
  208. package/dist/src/server/domains/memory/definitions.js +387 -559
  209. package/dist/src/server/domains/memory/handlers/hooks.d.ts +55 -0
  210. package/dist/src/server/domains/memory/handlers/hooks.js +115 -0
  211. package/dist/src/server/domains/memory/handlers/integrity.d.ts +77 -0
  212. package/dist/src/server/domains/memory/handlers/integrity.js +180 -0
  213. package/dist/src/server/domains/memory/handlers/pointer-chain.d.ts +29 -0
  214. package/dist/src/server/domains/memory/handlers/pointer-chain.js +82 -0
  215. package/dist/src/server/domains/memory/handlers/readwrite.d.ts +41 -0
  216. package/dist/src/server/domains/memory/handlers/readwrite.js +78 -0
  217. package/dist/src/server/domains/memory/handlers/scan.d.ts +35 -0
  218. package/dist/src/server/domains/memory/handlers/scan.js +97 -0
  219. package/dist/src/server/domains/memory/handlers/session.d.ts +23 -0
  220. package/dist/src/server/domains/memory/handlers/session.js +49 -0
  221. package/dist/src/server/domains/memory/handlers/structure.d.ts +29 -0
  222. package/dist/src/server/domains/memory/handlers/structure.js +74 -0
  223. package/dist/src/server/domains/memory/handlers.impl.d.ts +49 -54
  224. package/dist/src/server/domains/memory/handlers.impl.js +63 -494
  225. package/dist/src/server/domains/memory/manifest.js +236 -64
  226. package/dist/src/server/domains/native-bridge/definitions.js +54 -192
  227. package/dist/src/server/domains/native-bridge/index.d.ts +1 -0
  228. package/dist/src/server/domains/native-bridge/index.js +2 -1
  229. package/dist/src/server/domains/network/auth-extractor.js +1 -1
  230. package/dist/src/server/domains/network/definitions.js +175 -578
  231. package/dist/src/server/domains/network/handlers.base.core.d.ts +64 -0
  232. package/dist/src/server/domains/network/handlers.base.core.js +623 -0
  233. package/dist/src/server/domains/network/handlers.base.d.ts +2 -124
  234. package/dist/src/server/domains/network/handlers.base.js +3 -878
  235. package/dist/src/server/domains/network/handlers.base.performance.d.ts +63 -0
  236. package/dist/src/server/domains/network/handlers.base.performance.js +193 -0
  237. package/dist/src/server/domains/network/handlers.base.types.d.ts +42 -0
  238. package/dist/src/server/domains/network/handlers.base.types.js +89 -0
  239. package/dist/src/server/domains/network/handlers.impl.core.runtime.d.ts +1 -1
  240. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.d.ts +21 -0
  241. package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.js +186 -0
  242. package/dist/src/server/domains/network/handlers.impl.core.runtime.js +1 -1
  243. package/dist/src/server/domains/network/manifest.js +15 -0
  244. package/dist/src/server/domains/network/replay.js +1 -4
  245. package/dist/src/server/domains/platform/definitions.js +121 -112
  246. package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +5 -1
  247. package/dist/src/server/domains/platform/handlers/bridge-handlers.js +194 -5
  248. package/dist/src/server/domains/platform/handlers/electron-asar-helpers.js +26 -6
  249. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.d.ts +3 -0
  250. package/dist/src/server/domains/platform/handlers/electron-dual-cdp.js +170 -0
  251. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.d.ts +3 -0
  252. package/dist/src/server/domains/platform/handlers/electron-fuse-handler.js +193 -0
  253. package/dist/src/server/domains/platform/handlers/electron-handlers.d.ts +6 -0
  254. package/dist/src/server/domains/platform/handlers/electron-handlers.js +95 -2
  255. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.d.ts +2 -0
  256. package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.js +370 -0
  257. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.d.ts +2 -0
  258. package/dist/src/server/domains/platform/handlers/electron-userdata-handler.js +78 -0
  259. package/dist/src/server/domains/platform/handlers/miniapp-handlers.d.ts +1 -1
  260. package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +4 -4
  261. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.d.ts +2 -0
  262. package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.js +207 -0
  263. package/dist/src/server/domains/platform/handlers.d.ts +48 -0
  264. package/dist/src/server/domains/platform/handlers.js +29 -0
  265. package/dist/src/server/domains/platform/manifest.js +38 -0
  266. package/dist/src/server/domains/process/definitions.js +163 -647
  267. package/dist/src/server/domains/process/handlers.base.d.ts +3 -95
  268. package/dist/src/server/domains/process/handlers.base.js +7 -462
  269. package/dist/src/server/domains/process/handlers.base.process.d.ts +61 -0
  270. package/dist/src/server/domains/process/handlers.base.process.js +417 -0
  271. package/dist/src/server/domains/process/handlers.base.types.d.ts +57 -0
  272. package/dist/src/server/domains/process/handlers.base.types.js +50 -0
  273. package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +19 -17
  274. package/dist/src/server/domains/process/manifest.js +6 -1
  275. package/dist/src/server/domains/sandbox/definitions.js +11 -33
  276. package/dist/src/server/domains/sandbox/handlers.js +8 -3
  277. package/dist/src/server/domains/shared/ResponseBuilder.d.ts +209 -0
  278. package/dist/src/server/domains/shared/ResponseBuilder.js +48 -0
  279. package/dist/src/server/domains/shared/modules.d.ts +0 -2
  280. package/dist/src/server/domains/shared/modules.js +0 -1
  281. package/dist/src/server/domains/sourcemap/definitions.js +27 -111
  282. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-common.js +7 -2
  283. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-main.js +1 -1
  284. package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-parse-base.js +1 -1
  285. package/dist/src/server/domains/sourcemap/manifest.d.ts +1 -1
  286. package/dist/src/server/domains/sourcemap/manifest.js +1 -1
  287. package/dist/src/server/domains/streaming/definitions.js +36 -148
  288. package/dist/src/server/domains/streaming/handlers.impl.streaming-sse.js +163 -164
  289. package/dist/src/server/domains/streaming/handlers.impl.streaming-ws.js +1 -1
  290. package/dist/src/server/domains/trace/TraceSummarizer.d.ts +60 -0
  291. package/dist/src/server/domains/trace/TraceSummarizer.js +112 -0
  292. package/dist/src/server/domains/trace/definitions.tools.js +51 -176
  293. package/dist/src/server/domains/trace/handlers.d.ts +2 -1
  294. package/dist/src/server/domains/trace/handlers.js +62 -9
  295. package/dist/src/server/domains/trace/index.d.ts +2 -1
  296. package/dist/src/server/domains/trace/index.js +2 -1
  297. package/dist/src/server/domains/trace/manifest.js +18 -4
  298. package/dist/src/server/domains/transform/definitions.js +50 -210
  299. package/dist/src/server/domains/transform/handlers.impl.transform-base.js +6 -6
  300. package/dist/src/server/domains/transform/handlers.impl.transform-crypto.js +18 -19
  301. package/dist/src/server/domains/transform/manifest.d.ts +1 -1
  302. package/dist/src/server/domains/transform/manifest.js +1 -1
  303. package/dist/src/server/domains/wasm/definitions.js +55 -232
  304. package/dist/src/server/domains/wasm/handlers.js +3 -3
  305. package/dist/src/server/domains/workflow/definitions.js +144 -414
  306. package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +2 -2
  307. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.d.ts +2 -0
  308. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +126 -87
  309. package/dist/src/server/domains/workflow/handlers.impl.workflow-batch.js +5 -5
  310. package/dist/src/server/evidence/ReverseEvidenceGraph.d.ts +20 -0
  311. package/dist/src/server/evidence/ReverseEvidenceGraph.js +208 -0
  312. package/dist/src/server/evidence/index.d.ts +2 -0
  313. package/dist/src/server/evidence/index.js +1 -0
  314. package/dist/src/server/evidence/types.d.ts +22 -0
  315. package/dist/src/server/evidence/types.js +1 -0
  316. package/dist/src/server/extensions/ExtensionManager.d.ts +1 -0
  317. package/dist/src/server/extensions/ExtensionManager.discovery.js +72 -9
  318. package/dist/src/server/extensions/ExtensionManager.integrity.js +1 -1
  319. package/dist/src/server/extensions/ExtensionManager.js +193 -40
  320. package/dist/src/server/extensions/ExtensionManager.roots.d.ts +1 -1
  321. package/dist/src/server/extensions/ExtensionManager.roots.js +19 -9
  322. package/dist/src/server/extensions/plugin-config.js +1 -1
  323. package/dist/src/server/extensions/plugin-env.d.ts +1 -1
  324. package/dist/src/server/extensions/plugin-env.js +10 -4
  325. package/dist/src/server/extensions/types.d.ts +17 -0
  326. package/dist/src/server/extensions/types.js +1 -1
  327. package/dist/src/server/http/HttpMiddleware.js +1 -1
  328. package/dist/src/server/instrumentation/EvidenceGraphBridge.d.ts +13 -0
  329. package/dist/src/server/instrumentation/EvidenceGraphBridge.js +150 -0
  330. package/dist/src/server/instrumentation/InstrumentationSession.d.ts +60 -0
  331. package/dist/src/server/instrumentation/InstrumentationSession.js +269 -0
  332. package/dist/src/server/instrumentation/index.d.ts +2 -0
  333. package/dist/src/server/instrumentation/index.js +2 -0
  334. package/dist/src/server/instrumentation/types.d.ts +62 -0
  335. package/dist/src/server/instrumentation/types.js +7 -0
  336. package/dist/src/server/macros/MacroConfigLoader.d.ts +6 -5
  337. package/dist/src/server/macros/MacroConfigLoader.js +61 -59
  338. package/dist/src/server/macros/MacroRunner.js +6 -2
  339. package/dist/src/server/macros/builtins/index.d.ts +2 -3
  340. package/dist/src/server/macros/builtins/index.js +51 -7
  341. package/dist/src/server/plugins/PluginContract.d.ts +1 -1
  342. package/dist/src/server/registry/contracts.d.ts +7 -1
  343. package/dist/src/server/registry/discovery.js +5 -4
  344. package/dist/src/server/registry/ensure-browser-core.js +0 -3
  345. package/dist/src/server/registry/index.js +4 -4
  346. package/dist/src/server/registry/tool-builder.d.ts +46 -0
  347. package/dist/src/server/registry/tool-builder.js +105 -0
  348. package/dist/src/server/sandbox/MCPBridge.d.ts +9 -0
  349. package/dist/src/server/sandbox/MCPBridge.js +22 -0
  350. package/dist/src/server/sandbox/QuickJSSandbox.d.ts +4 -1
  351. package/dist/src/server/sandbox/QuickJSSandbox.js +162 -2
  352. package/dist/src/server/sandbox/types.d.ts +13 -0
  353. package/dist/src/server/search/AffinityGraph.d.ts +7 -1
  354. package/dist/src/server/search/AffinityGraph.js +24 -3
  355. package/dist/src/server/search/EmbeddingWorker.js +5 -3
  356. package/dist/src/server/search/FeedbackTracker.d.ts +9 -0
  357. package/dist/src/server/search/FeedbackTracker.js +26 -0
  358. package/dist/src/server/search/QueryNormalizer.d.ts +6 -0
  359. package/dist/src/server/search/QueryNormalizer.js +94 -0
  360. package/dist/src/server/search/ToolSearchEngineImpl.d.ts +2 -3
  361. package/dist/src/server/search/ToolSearchEngineImpl.js +38 -88
  362. package/dist/src/server/workflows/WorkflowContract.d.ts +24 -0
  363. package/dist/src/server/workflows/WorkflowContract.js +12 -0
  364. package/dist/src/server/workflows/WorkflowEngine.d.ts +1 -0
  365. package/dist/src/server/workflows/WorkflowEngine.js +136 -3
  366. package/dist/src/types/config.d.ts +0 -14
  367. package/dist/src/types/deobfuscator.d.ts +0 -1
  368. package/dist/src/types/index.d.ts +1 -1
  369. package/dist/src/utils/DetailedDataManager.js +2 -0
  370. package/dist/src/utils/RingBuffer.js +5 -5
  371. package/dist/src/utils/TokenBudgetManager.js +1 -1
  372. package/dist/src/utils/UnifiedCacheManager.d.ts +1 -1
  373. package/dist/src/utils/UnifiedCacheManager.js +3 -3
  374. package/dist/src/utils/artifactRetention.js +2 -2
  375. package/dist/src/utils/betterSqlite3.d.ts +11 -0
  376. package/dist/src/utils/betterSqlite3.js +88 -0
  377. package/dist/src/utils/browserExecutable.js +2 -2
  378. package/dist/src/utils/cliFastPath.js +17 -6
  379. package/dist/src/utils/config.js +4 -26
  380. package/dist/src/utils/environmentDoctor.js +138 -11
  381. package/dist/src/utils/outputPaths.js +16 -9
  382. package/dist/src/utils/parallel.js +1 -3
  383. package/package.json +76 -72
  384. package/scripts/postinstall.cjs +37 -37
  385. package/src/native/scripts/linux/enum-windows.sh +12 -12
  386. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  387. package/src/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  388. package/src/native/scripts/windows/enum-windows.ps1 +44 -44
  389. package/src/native/scripts/windows/inject-dll.ps1 +21 -21
  390. package/workflows/.gitkeep +0 -0
  391. package/dist/src/modules/analyzer/AISummarizer.d.ts +0 -39
  392. package/dist/src/modules/analyzer/AISummarizer.js +0 -122
  393. package/dist/src/modules/hook/AIHookGenerator.d.ts +0 -52
  394. package/dist/src/modules/hook/AIHookGenerator.js +0 -360
  395. package/dist/src/modules/hook/AIHookGeneratorTemplates.d.ts +0 -9
  396. package/dist/src/modules/hook/AIHookGeneratorTemplates.js +0 -157
  397. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.d.ts +0 -2
  398. package/dist/src/server/macros/builtins/deobfuscate-ast-flow.js +0 -25
  399. package/dist/src/server/macros/builtins/unpacker-flow.d.ts +0 -2
  400. package/dist/src/server/macros/builtins/unpacker-flow.js +0 -25
  401. package/dist/src/services/LLMService.d.ts +0 -37
  402. package/dist/src/services/LLMService.js +0 -233
  403. package/dist/src/services/prompts/analysis.d.ts +0 -9
  404. package/dist/src/services/prompts/analysis.js +0 -158
  405. package/dist/src/services/prompts/crypto.d.ts +0 -2
  406. package/dist/src/services/prompts/crypto.js +0 -108
  407. package/dist/src/services/prompts/deobfuscation.d.ts +0 -6
  408. package/dist/src/services/prompts/deobfuscation.js +0 -300
  409. package/dist/src/services/prompts/environment.d.ts +0 -16
  410. package/dist/src/services/prompts/environment.js +0 -372
  411. package/dist/src/services/prompts/intelligence.d.ts +0 -4
  412. package/dist/src/services/prompts/intelligence.js +0 -250
  413. package/dist/src/services/prompts/taint.d.ts +0 -2
  414. package/dist/src/services/prompts/taint.js +0 -54
@@ -0,0 +1,170 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { toTextResponse, toErrorResponse, parseStringArg, pathExists, } from '../../../domains/platform/handlers/platform-utils.js';
4
+ const FUSE_SENTINEL = 'dL7pKGdnNz796PbbjQWNKmHXBZIA';
5
+ const FUSE_ENABLE = 0x31;
6
+ const launchedProcesses = new Map();
7
+ async function quickFuseCheck(exePath) {
8
+ try {
9
+ const buffer = await readFile(exePath);
10
+ const sentinelBuf = Buffer.from(FUSE_SENTINEL, 'ascii');
11
+ const idx = buffer.indexOf(sentinelBuf);
12
+ if (idx === -1)
13
+ return { fuseFound: false, runAsNode: false, inspectArgs: false, nodeOptions: false };
14
+ const base = idx + sentinelBuf.length;
15
+ return {
16
+ fuseFound: true,
17
+ runAsNode: buffer[base] === FUSE_ENABLE,
18
+ nodeOptions: buffer[base + 2] === FUSE_ENABLE,
19
+ inspectArgs: buffer[base + 3] === FUSE_ENABLE,
20
+ };
21
+ }
22
+ catch {
23
+ return { fuseFound: false, runAsNode: false, inspectArgs: false, nodeOptions: false };
24
+ }
25
+ }
26
+ async function waitForCDP(port, timeoutMs = 10_000) {
27
+ const start = Date.now();
28
+ while (Date.now() - start < timeoutMs) {
29
+ try {
30
+ const res = await fetch(`http://127.0.0.1:${port}/json/version`, {
31
+ signal: AbortSignal.timeout(2000),
32
+ });
33
+ if (res.ok) {
34
+ const info = await res.text();
35
+ return { ok: true, info };
36
+ }
37
+ }
38
+ catch {
39
+ }
40
+ await new Promise((r) => setTimeout(r, 500));
41
+ }
42
+ return { ok: false, error: `CDP port ${port} did not respond within ${timeoutMs}ms` };
43
+ }
44
+ export async function handleElectronLaunchDebug(args) {
45
+ try {
46
+ const exePath = parseStringArg(args, 'exePath', true);
47
+ if (!exePath) {
48
+ throw new Error('exePath is required — path to the Electron .exe');
49
+ }
50
+ if (!(await pathExists(exePath))) {
51
+ return toTextResponse({
52
+ success: false,
53
+ tool: 'electron_launch_debug',
54
+ error: `File does not exist: ${exePath}`,
55
+ });
56
+ }
57
+ const mainPort = args.mainPort ?? 9229;
58
+ const rendererPort = args.rendererPort ?? 9222;
59
+ const extraArgs = args.args ?? [];
60
+ const skipFuseCheck = args.skipFuseCheck === true;
61
+ const waitMs = args.waitMs ?? 8000;
62
+ const fuseWarnings = [];
63
+ if (!skipFuseCheck) {
64
+ const fuses = await quickFuseCheck(exePath);
65
+ if (fuses.fuseFound) {
66
+ if (!fuses.inspectArgs) {
67
+ fuseWarnings.push('EnableNodeCliInspectArguments is DISABLED — main process --inspect may be blocked. Use electron_patch_fuses first.');
68
+ }
69
+ if (!fuses.nodeOptions) {
70
+ fuseWarnings.push('EnableNodeOptionsEnvironmentVariable is DISABLED — NODE_OPTIONS injection blocked.');
71
+ }
72
+ if (!fuses.runAsNode) {
73
+ fuseWarnings.push('RunAsNode is DISABLED — ELECTRON_RUN_AS_NODE=1 will not work.');
74
+ }
75
+ }
76
+ }
77
+ const launchArgs = [
78
+ `--inspect=${mainPort}`,
79
+ `--remote-debugging-port=${rendererPort}`,
80
+ ...extraArgs,
81
+ ];
82
+ const child = spawn(exePath, launchArgs, {
83
+ stdio: 'ignore',
84
+ detached: true,
85
+ env: { ...process.env },
86
+ });
87
+ child.unref();
88
+ if (!child.pid) {
89
+ return toTextResponse({
90
+ success: false,
91
+ tool: 'electron_launch_debug',
92
+ error: 'Failed to spawn process — no PID returned.',
93
+ });
94
+ }
95
+ const sessionId = `electron-${child.pid}`;
96
+ launchedProcesses.set(sessionId, {
97
+ child,
98
+ pid: child.pid,
99
+ ports: { main: mainPort, renderer: rendererPort },
100
+ });
101
+ const [mainCDP, rendererCDP] = await Promise.all([
102
+ waitForCDP(mainPort, waitMs),
103
+ waitForCDP(rendererPort, waitMs),
104
+ ]);
105
+ return toTextResponse({
106
+ success: true,
107
+ tool: 'electron_launch_debug',
108
+ sessionId,
109
+ pid: child.pid,
110
+ ports: {
111
+ main: { port: mainPort, available: mainCDP.ok, info: mainCDP.ok ? 'Ready' : mainCDP.error },
112
+ renderer: {
113
+ port: rendererPort,
114
+ available: rendererCDP.ok,
115
+ info: rendererCDP.ok ? 'Ready' : rendererCDP.error,
116
+ },
117
+ },
118
+ fuseWarnings: fuseWarnings.length > 0 ? fuseWarnings : undefined,
119
+ usage: {
120
+ main: `Use electron_attach(port=${mainPort}) to debug the main process (Node.js)`,
121
+ renderer: `Use electron_attach(port=${rendererPort}) to debug the renderer (Chromium)`,
122
+ combined: 'Both sessions can be used simultaneously for cross-process analysis',
123
+ },
124
+ });
125
+ }
126
+ catch (error) {
127
+ return toErrorResponse('electron_launch_debug', error);
128
+ }
129
+ }
130
+ export async function handleElectronDebugStatus(args) {
131
+ try {
132
+ const sessionId = parseStringArg(args, 'sessionId');
133
+ if (sessionId) {
134
+ const session = launchedProcesses.get(sessionId);
135
+ if (!session) {
136
+ return toTextResponse({
137
+ success: false,
138
+ tool: 'electron_debug_status',
139
+ error: `No session found: ${sessionId}`,
140
+ activeSessions: Array.from(launchedProcesses.keys()),
141
+ });
142
+ }
143
+ const [mainCDP, rendererCDP] = await Promise.all([
144
+ waitForCDP(session.ports.main, 2000),
145
+ waitForCDP(session.ports.renderer, 2000),
146
+ ]);
147
+ return toTextResponse({
148
+ success: true,
149
+ tool: 'electron_debug_status',
150
+ sessionId,
151
+ pid: session.pid,
152
+ main: { port: session.ports.main, alive: mainCDP.ok },
153
+ renderer: { port: session.ports.renderer, alive: rendererCDP.ok },
154
+ });
155
+ }
156
+ const sessions = Array.from(launchedProcesses.entries()).map(([id, s]) => ({
157
+ sessionId: id,
158
+ pid: s.pid,
159
+ ports: s.ports,
160
+ }));
161
+ return toTextResponse({
162
+ success: true,
163
+ tool: 'electron_debug_status',
164
+ sessions,
165
+ });
166
+ }
167
+ catch (error) {
168
+ return toErrorResponse('electron_debug_status', error);
169
+ }
170
+ }
@@ -0,0 +1,3 @@
1
+ import { toTextResponse } from '../../../domains/platform/handlers/platform-utils.js';
2
+ export declare function handleElectronCheckFuses(args: Record<string, unknown>): Promise<ReturnType<typeof toTextResponse>>;
3
+ export declare function handleElectronPatchFuses(args: Record<string, unknown>): Promise<ReturnType<typeof toTextResponse>>;
@@ -0,0 +1,193 @@
1
+ import { readFile, writeFile, copyFile } from 'node:fs/promises';
2
+ import { toTextResponse, toErrorResponse, parseStringArg, pathExists, } from '../../../domains/platform/handlers/platform-utils.js';
3
+ const FUSE_SENTINEL = 'dL7pKGdnNz796PbbjQWNKmHXBZIA';
4
+ const FUSE_NAMES = [
5
+ 'RunAsNode',
6
+ 'EnableCookieEncryption',
7
+ 'EnableNodeOptionsEnvironmentVariable',
8
+ 'EnableNodeCliInspectArguments',
9
+ 'EnableEmbeddedAsarIntegrityValidation',
10
+ 'OnlyLoadAppFromAsar',
11
+ 'LoadBrowserProcessSpecificV8Snapshot',
12
+ 'GrantFileProtocolExtraPrivileges',
13
+ ];
14
+ const FUSE_DISABLE = 0x30;
15
+ const FUSE_ENABLE = 0x31;
16
+ const FUSE_REMOVED = 0x72;
17
+ const FUSE_LABEL = {
18
+ [FUSE_DISABLE]: 'DISABLE',
19
+ [FUSE_ENABLE]: 'ENABLE',
20
+ [FUSE_REMOVED]: 'REMOVED',
21
+ };
22
+ const DEBUG_PATCH_PROFILE = {
23
+ RunAsNode: 'ENABLE',
24
+ EnableNodeOptionsEnvironmentVariable: 'ENABLE',
25
+ EnableNodeCliInspectArguments: 'ENABLE',
26
+ OnlyLoadAppFromAsar: 'DISABLE',
27
+ };
28
+ function parseFuses(buffer, sentinelIndex) {
29
+ const fuseDataStart = sentinelIndex + Buffer.from(FUSE_SENTINEL, 'ascii').length;
30
+ const fuses = {};
31
+ for (let i = 0; i < FUSE_NAMES.length; i++) {
32
+ const fuseName = FUSE_NAMES[i];
33
+ if (!fuseName)
34
+ continue;
35
+ const byteIndex = fuseDataStart + i;
36
+ if (byteIndex >= buffer.length) {
37
+ fuses[fuseName] = 'UNKNOWN';
38
+ continue;
39
+ }
40
+ const byteValue = buffer[byteIndex];
41
+ if (byteValue === undefined) {
42
+ fuses[fuseName] = 'UNKNOWN';
43
+ continue;
44
+ }
45
+ fuses[fuseName] = FUSE_LABEL[byteValue] ?? 'UNKNOWN';
46
+ }
47
+ return fuses;
48
+ }
49
+ export async function handleElectronCheckFuses(args) {
50
+ try {
51
+ const exePath = parseStringArg(args, 'exePath', true);
52
+ if (!exePath) {
53
+ throw new Error('exePath is required');
54
+ }
55
+ if (!(await pathExists(exePath))) {
56
+ return toTextResponse({
57
+ success: false,
58
+ tool: 'electron_check_fuses',
59
+ error: `File does not exist: ${exePath}`,
60
+ });
61
+ }
62
+ const buffer = await readFile(exePath);
63
+ const sentinelBuffer = Buffer.from(FUSE_SENTINEL, 'ascii');
64
+ const sentinelIndex = buffer.indexOf(sentinelBuffer);
65
+ if (sentinelIndex === -1) {
66
+ return toTextResponse({
67
+ success: true,
68
+ tool: 'electron_check_fuses',
69
+ exePath,
70
+ fuseWireFound: false,
71
+ fuses: {},
72
+ note: 'No fuse sentinel found. This may not be an Electron binary, or fuses are not configured.',
73
+ });
74
+ }
75
+ const fuses = parseFuses(buffer, sentinelIndex);
76
+ return toTextResponse({
77
+ success: true,
78
+ tool: 'electron_check_fuses',
79
+ exePath,
80
+ fuseWireFound: true,
81
+ fuses,
82
+ });
83
+ }
84
+ catch (error) {
85
+ return toErrorResponse('electron_check_fuses', error);
86
+ }
87
+ }
88
+ export async function handleElectronPatchFuses(args) {
89
+ try {
90
+ const exePath = parseStringArg(args, 'exePath', true);
91
+ if (!exePath) {
92
+ throw new Error('exePath is required');
93
+ }
94
+ if (!(await pathExists(exePath))) {
95
+ return toTextResponse({
96
+ success: false,
97
+ tool: 'electron_patch_fuses',
98
+ error: `File does not exist: ${exePath}`,
99
+ });
100
+ }
101
+ const profile = parseStringArg(args, 'profile') ?? 'debug';
102
+ const createBackup = args.createBackup !== false;
103
+ let patchMap;
104
+ if (profile === 'debug') {
105
+ patchMap = { ...DEBUG_PATCH_PROFILE };
106
+ }
107
+ else if (profile === 'custom') {
108
+ const customFuses = args.fuses;
109
+ if (!customFuses || Object.keys(customFuses).length === 0) {
110
+ throw new Error('profile="custom" requires a `fuses` object mapping fuse names to ENABLE/DISABLE');
111
+ }
112
+ patchMap = {};
113
+ for (const [name, value] of Object.entries(customFuses)) {
114
+ if (!FUSE_NAMES.includes(name)) {
115
+ throw new Error(`Unknown fuse: ${name}. Valid: ${FUSE_NAMES.join(', ')}`);
116
+ }
117
+ if (value !== 'ENABLE' && value !== 'DISABLE') {
118
+ throw new Error(`Invalid fuse value for ${name}: ${value}. Must be ENABLE or DISABLE`);
119
+ }
120
+ patchMap[name] = value;
121
+ }
122
+ }
123
+ else {
124
+ throw new Error(`Unknown profile: ${profile}. Use "debug" or "custom"`);
125
+ }
126
+ const buffer = await readFile(exePath);
127
+ const sentinelBuffer = Buffer.from(FUSE_SENTINEL, 'ascii');
128
+ const sentinelIndex = buffer.indexOf(sentinelBuffer);
129
+ if (sentinelIndex === -1) {
130
+ return toTextResponse({
131
+ success: false,
132
+ tool: 'electron_patch_fuses',
133
+ error: 'No fuse sentinel found. This may not be an Electron binary.',
134
+ exePath,
135
+ });
136
+ }
137
+ const fusesBefore = parseFuses(buffer, sentinelIndex);
138
+ const fuseDataStart = sentinelIndex + sentinelBuffer.length;
139
+ const changes = [];
140
+ for (const [fuseName, targetState] of Object.entries(patchMap)) {
141
+ const fuseIndex = FUSE_NAMES.indexOf(fuseName);
142
+ if (fuseIndex === -1)
143
+ continue;
144
+ const byteIndex = fuseDataStart + fuseIndex;
145
+ if (byteIndex >= buffer.length)
146
+ continue;
147
+ const currentByte = buffer[byteIndex];
148
+ if (currentByte === FUSE_REMOVED) {
149
+ changes.push({ fuse: fuseName, before: 'REMOVED', after: 'REMOVED (cannot patch)' });
150
+ continue;
151
+ }
152
+ const targetByte = targetState === 'ENABLE' ? FUSE_ENABLE : FUSE_DISABLE;
153
+ const currentLabel = FUSE_LABEL[currentByte ?? 0] ?? 'UNKNOWN';
154
+ if (currentByte === targetByte) {
155
+ continue;
156
+ }
157
+ buffer[byteIndex] = targetByte;
158
+ changes.push({ fuse: fuseName, before: currentLabel, after: targetState });
159
+ }
160
+ if (changes.length === 0) {
161
+ return toTextResponse({
162
+ success: true,
163
+ tool: 'electron_patch_fuses',
164
+ exePath,
165
+ message: 'All target fuses are already in the desired state. No changes needed.',
166
+ fuses: fusesBefore,
167
+ });
168
+ }
169
+ let backupPath = null;
170
+ if (createBackup) {
171
+ backupPath = `${exePath}.bak`;
172
+ await copyFile(exePath, backupPath);
173
+ }
174
+ await writeFile(exePath, buffer);
175
+ const fusesAfter = parseFuses(buffer, sentinelIndex);
176
+ return toTextResponse({
177
+ success: true,
178
+ tool: 'electron_patch_fuses',
179
+ exePath,
180
+ backupPath,
181
+ profile,
182
+ changes,
183
+ fusesBefore,
184
+ fusesAfter,
185
+ note: backupPath
186
+ ? `Backup created at ${backupPath}. Restore with: copy "${backupPath}" "${exePath}"`
187
+ : 'No backup created (createBackup=false).',
188
+ });
189
+ }
190
+ catch (error) {
191
+ return toErrorResponse('electron_patch_fuses', error);
192
+ }
193
+ }
@@ -14,4 +14,10 @@ export declare class ElectronHandlers {
14
14
  text: string;
15
15
  }[];
16
16
  }>;
17
+ handleAsarSearch(args: Record<string, unknown>): Promise<{
18
+ content: {
19
+ type: "text";
20
+ text: string;
21
+ }[];
22
+ }>;
17
23
  }
@@ -200,7 +200,7 @@ export class ElectronHandlers {
200
200
  : 'index.js';
201
201
  const version = typeof packageJson.version === 'string' ? packageJson.version : null;
202
202
  const dependenciesRaw = packageJson.dependencies;
203
- const dependencies = isRecord(dependenciesRaw) ? Object.keys(dependenciesRaw).sort() : [];
203
+ const dependencies = isRecord(dependenciesRaw) ? Object.keys(dependenciesRaw).toSorted() : [];
204
204
  let mainScriptSource = '';
205
205
  let mainScriptPath = '';
206
206
  if (packageSource === 'asar' && parsedAsar && asarBuffer) {
@@ -273,7 +273,7 @@ export class ElectronHandlers {
273
273
  scanRoot: scanRoot.replace(/\\/g, '/'),
274
274
  mainEntry,
275
275
  version,
276
- preloadScripts: Array.from(preloadScripts).sort(),
276
+ preloadScripts: Array.from(preloadScripts).toSorted(),
277
277
  dependencies,
278
278
  devToolsEnabled,
279
279
  packageSource,
@@ -292,4 +292,97 @@ export class ElectronHandlers {
292
292
  return toErrorResponse('electron_inspect_app', error);
293
293
  }
294
294
  }
295
+ async handleAsarSearch(args) {
296
+ try {
297
+ const inputPath = parseStringArg(args, 'inputPath', true);
298
+ const searchPattern = parseStringArg(args, 'pattern', true);
299
+ if (!inputPath)
300
+ throw new Error('inputPath is required');
301
+ if (!searchPattern)
302
+ throw new Error('pattern is required');
303
+ const fileGlob = parseStringArg(args, 'fileGlob') || '*.js';
304
+ const maxResults = typeof args.maxResults === 'number' && args.maxResults > 0 ? args.maxResults : 100;
305
+ const searchAbsPath = resolve(inputPath);
306
+ if (!(await pathExists(searchAbsPath))) {
307
+ return toTextResponse({
308
+ success: false,
309
+ tool: 'asar_search',
310
+ error: `File does not exist: ${inputPath}`,
311
+ });
312
+ }
313
+ const searchAsarBuf = await readFile(searchAbsPath);
314
+ const searchParsed = parseAsarBuffer(searchAsarBuf);
315
+ const globExt = fileGlob.startsWith('*.') ? fileGlob.slice(1) : null;
316
+ const matchingFiles = searchParsed.files.filter((entry) => {
317
+ if (entry.unpacked || entry.size <= 0)
318
+ return false;
319
+ if (globExt) {
320
+ return extname(entry.path).toLowerCase() === globExt.toLowerCase();
321
+ }
322
+ return true;
323
+ });
324
+ let regex;
325
+ try {
326
+ regex = new RegExp(searchPattern, 'gi');
327
+ }
328
+ catch {
329
+ return toTextResponse({
330
+ success: false,
331
+ tool: 'asar_search',
332
+ error: `Invalid regex pattern: ${searchPattern}`,
333
+ });
334
+ }
335
+ const matches = [];
336
+ let totalMatches = 0;
337
+ let filesScanned = 0;
338
+ for (const entry of matchingFiles) {
339
+ if (totalMatches >= maxResults)
340
+ break;
341
+ const start = searchParsed.dataOffset + entry.offset;
342
+ const end = start + entry.size;
343
+ if (start < 0 || end > searchAsarBuf.length || end < start)
344
+ continue;
345
+ if (entry.size > 512_000)
346
+ continue;
347
+ const content = searchAsarBuf.subarray(start, end).toString('utf-8');
348
+ filesScanned++;
349
+ regex.lastIndex = 0;
350
+ const lines = content.split('\n');
351
+ const fileMatches = [];
352
+ for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
353
+ if (totalMatches >= maxResults)
354
+ break;
355
+ const line = lines[lineIdx];
356
+ if (!line)
357
+ continue;
358
+ regex.lastIndex = 0;
359
+ if (regex.test(line)) {
360
+ fileMatches.push({
361
+ lineNumber: lineIdx + 1,
362
+ text: line.slice(0, 200),
363
+ });
364
+ totalMatches++;
365
+ }
366
+ }
367
+ if (fileMatches.length > 0) {
368
+ matches.push({
369
+ filePath: entry.path,
370
+ matchCount: fileMatches.length,
371
+ matchLines: fileMatches,
372
+ });
373
+ }
374
+ }
375
+ return toTextResponse({
376
+ success: true,
377
+ tool: 'asar_search',
378
+ matches,
379
+ totalMatches,
380
+ filesScanned,
381
+ pattern: searchPattern,
382
+ });
383
+ }
384
+ catch (error) {
385
+ return toErrorResponse('asar_search', error);
386
+ }
387
+ }
295
388
  }
@@ -0,0 +1,2 @@
1
+ import { toTextResponse } from '../../../domains/platform/handlers/platform-utils.js';
2
+ export declare function handleElectronIPCSniff(args: Record<string, unknown>): Promise<ReturnType<typeof toTextResponse>>;