@jshookmcp/jshook 0.2.2 → 0.2.3

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 (130) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +4 -4
  3. package/README.zh.md +3 -3
  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/src/modules/analyzer/CodeAnalyzer.d.ts +1 -1
  10. package/dist/src/modules/analyzer/CodeAnalyzer.js +1 -1
  11. package/dist/src/modules/browser/BrowserDiscovery.d.ts +6 -5
  12. package/dist/src/modules/browser/BrowserDiscovery.js +1 -1
  13. package/dist/src/modules/browser/BrowserModeManager.d.ts +1 -1
  14. package/dist/src/modules/browser/BrowserModeManager.js +1 -1
  15. package/dist/src/modules/browser/UnifiedBrowserManager.js +1 -1
  16. package/dist/src/modules/captcha/AICaptchaDetector.d.ts +22 -22
  17. package/dist/src/modules/captcha/AICaptchaDetector.js +75 -75
  18. package/dist/src/modules/captcha/CaptchaDetector.d.ts +31 -17
  19. package/dist/src/modules/captcha/CaptchaDetector.js +1 -1
  20. package/dist/src/modules/collector/CodeCache.d.ts +2 -2
  21. package/dist/src/modules/collector/CodeCollector.d.ts +12 -9
  22. package/dist/src/modules/collector/CodeCollector.js +1 -1
  23. package/dist/src/modules/collector/DOMInspector.d.ts +3 -2
  24. package/dist/src/modules/collector/DOMInspector.js +1 -1
  25. package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -1
  26. package/dist/src/modules/crypto/CryptoDetector.js +1 -1
  27. package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +1 -1
  28. package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -1
  29. package/dist/src/modules/deobfuscator/Deobfuscator.js +1 -1
  30. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +1 -1
  31. package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +2 -2
  32. package/dist/src/modules/deobfuscator/PackerDeobfuscator.js +1 -1
  33. package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +1 -1
  34. package/dist/src/modules/deobfuscator/VMDeobfuscator.js +82 -82
  35. package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +1 -1
  36. package/dist/src/modules/external/ExternalToolRunner.d.ts +1 -1
  37. package/dist/src/modules/external/ExternalToolRunner.js +1 -1
  38. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.compose.js +5 -5
  39. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.network.js +311 -311
  40. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.runtime.js +410 -410
  41. package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.storage.js +122 -122
  42. package/dist/src/modules/monitor/ConsoleMonitor.impl.core.dynamic.js +194 -194
  43. package/dist/src/modules/monitor/PlaywrightNetworkMonitor.js +62 -62
  44. package/dist/src/modules/process/LinuxProcessManager.js +2 -2
  45. package/dist/src/modules/process/MacProcessManager.js +26 -26
  46. package/dist/src/modules/process/ProcessManager.impl.js +1 -1
  47. package/dist/src/modules/process/memory/availability.js +49 -49
  48. package/dist/src/modules/process/memory/injector.js +185 -185
  49. package/dist/src/modules/process/memory/reader.js +50 -50
  50. package/dist/src/modules/process/memory/regions.dump.js +51 -51
  51. package/dist/src/modules/process/memory/regions.enumerate.js +107 -107
  52. package/dist/src/modules/process/memory/regions.modules.js +80 -80
  53. package/dist/src/modules/process/memory/regions.protection.js +106 -106
  54. package/dist/src/modules/process/memory/scanner.darwin.js +41 -41
  55. package/dist/src/modules/process/memory/scanner.windows.js +124 -124
  56. package/dist/src/modules/process/memory/writer.js +54 -54
  57. package/dist/src/modules/security/ExecutionSandbox.js +44 -44
  58. package/dist/src/modules/stealth/StealthScripts.d.ts +3 -2
  59. package/dist/src/modules/stealth/StealthScripts.js +35 -1
  60. package/dist/src/modules/stealth/StealthVerifier.d.ts +1 -1
  61. package/dist/src/modules/stealth/StealthVerifier.js +1 -1
  62. package/dist/src/modules/trace/TraceDB.js +63 -63
  63. package/dist/src/native/CodeInjector.js +1 -1
  64. package/dist/src/native/HardwareBreakpoint.js +1 -1
  65. package/dist/src/server/MCPServer.js +1 -0
  66. package/dist/src/server/MCPServer.search.helpers.js +1 -1
  67. package/dist/src/server/MCPServer.tools.js +1 -1
  68. package/dist/src/server/ToolCallContextGuard.d.ts +5 -0
  69. package/dist/src/server/ToolCallContextGuard.js +77 -0
  70. package/dist/src/server/ToolRouter.d.ts +1 -1
  71. package/dist/src/server/ToolRouter.js +2 -2
  72. package/dist/src/server/domains/analysis/handlers.impl.d.ts +8 -8
  73. package/dist/src/server/domains/analysis/handlers.impl.js +8 -8
  74. package/dist/src/server/domains/analysis/handlers.web-tools.js +2 -2
  75. package/dist/src/server/domains/browser/definitions.tools.page-core.js +59 -59
  76. package/dist/src/server/domains/browser/definitions.tools.runtime.js +41 -41
  77. package/dist/src/server/domains/browser/definitions.tools.security.js +114 -114
  78. package/dist/src/server/domains/browser/handlers/facade-initializer.d.ts +3 -3
  79. package/dist/src/server/domains/browser/handlers/facade-initializer.js +3 -3
  80. package/dist/src/server/domains/browser/handlers/framework-state.js +210 -0
  81. package/dist/src/server/domains/browser/handlers/stealth-injection.js +8 -2
  82. package/dist/src/server/domains/browser/handlers.impl.d.ts +15 -11
  83. package/dist/src/server/domains/browser/handlers.impl.js +4 -4
  84. package/dist/src/server/domains/coordination/definitions.js +67 -0
  85. package/dist/src/server/domains/coordination/index.d.ts +18 -0
  86. package/dist/src/server/domains/coordination/index.js +132 -0
  87. package/dist/src/server/domains/coordination/manifest.js +15 -0
  88. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +2 -2
  89. package/dist/src/server/domains/graphql/handlers.impl.core.runtime.shared.js +77 -77
  90. package/dist/src/server/domains/hooks/ai-handlers.js +3 -3
  91. package/dist/src/server/domains/maintenance/handlers.d.ts +2 -2
  92. package/dist/src/server/domains/maintenance/handlers.js +2 -2
  93. package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +1 -1
  94. package/dist/src/server/domains/platform/handlers/bridge-handlers.js +1 -1
  95. package/dist/src/server/domains/platform/handlers/miniapp-handlers.d.ts +1 -1
  96. package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +1 -1
  97. package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +1 -1
  98. package/dist/src/server/domains/trace/TraceSummarizer.d.ts +60 -0
  99. package/dist/src/server/domains/trace/TraceSummarizer.js +109 -0
  100. package/dist/src/server/domains/trace/definitions.tools.js +101 -71
  101. package/dist/src/server/domains/trace/handlers.d.ts +2 -1
  102. package/dist/src/server/domains/trace/handlers.js +59 -4
  103. package/dist/src/server/domains/trace/manifest.js +3 -1
  104. package/dist/src/server/domains/transform/handlers.impl.transform-base.js +103 -103
  105. package/dist/src/server/domains/wasm/handlers.js +2 -2
  106. package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +1 -1
  107. package/dist/src/server/domains/workflow/handlers.impl.workflow-api.js +51 -51
  108. package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +51 -51
  109. package/dist/src/server/extensions/ExtensionManager.roots.js +15 -5
  110. package/dist/src/server/http/HttpMiddleware.js +1 -1
  111. package/dist/src/server/registry/contracts.d.ts +6 -0
  112. package/dist/src/server/sandbox/MCPBridge.d.ts +9 -0
  113. package/dist/src/server/sandbox/MCPBridge.js +22 -0
  114. package/dist/src/server/sandbox/QuickJSSandbox.d.ts +4 -1
  115. package/dist/src/server/sandbox/QuickJSSandbox.js +149 -0
  116. package/dist/src/server/sandbox/SandboxHelpers.js +250 -250
  117. package/dist/src/server/sandbox/types.d.ts +13 -0
  118. package/dist/src/server/search/AffinityGraph.d.ts +7 -1
  119. package/dist/src/server/search/AffinityGraph.js +24 -3
  120. package/dist/src/services/LLMService.js +1 -1
  121. package/dist/src/utils/UnifiedCacheManager.d.ts +1 -1
  122. package/dist/src/utils/UnifiedCacheManager.js +2 -2
  123. package/dist/src/utils/cliFastPath.js +18 -4
  124. package/package.json +5 -3
  125. package/scripts/postinstall.cjs +37 -37
  126. package/src/native/scripts/linux/enum-windows.sh +12 -12
  127. package/src/native/scripts/macos/enum-windows.applescript +22 -22
  128. package/src/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
  129. package/src/native/scripts/windows/enum-windows.ps1 +44 -44
  130. package/src/native/scripts/windows/inject-dll.ps1 +21 -21
@@ -1,12 +1,34 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  export class MCPBridge {
2
3
  ctx;
3
4
  allowlist = null;
5
+ pendingCalls = [];
4
6
  constructor(ctx) {
5
7
  this.ctx = ctx;
6
8
  }
7
9
  setAllowlist(toolNames) {
8
10
  this.allowlist = toolNames ? new Set(toolNames) : null;
9
11
  }
12
+ enqueue(toolName, args = {}) {
13
+ const registeredNames = this.ctx.selectedTools?.map((t) => t.name) ?? [];
14
+ if (!registeredNames.includes(toolName)) {
15
+ throw new Error(`Tool "${toolName}" is not a registered MCP tool`);
16
+ }
17
+ if (this.allowlist && !this.allowlist.has(toolName)) {
18
+ throw new Error(`Tool "${toolName}" is not in the sandbox allowlist`);
19
+ }
20
+ const id = randomUUID().slice(0, 8);
21
+ this.pendingCalls.push({ id, toolName, args });
22
+ return id;
23
+ }
24
+ drainPending() {
25
+ const calls = [...this.pendingCalls];
26
+ this.pendingCalls.length = 0;
27
+ return calls;
28
+ }
29
+ hasPending() {
30
+ return this.pendingCalls.length > 0;
31
+ }
10
32
  async call(toolName, args = {}) {
11
33
  if (this.allowlist && !this.allowlist.has(toolName)) {
12
34
  throw new Error(`Tool "${toolName}" is not in the sandbox allowlist`);
@@ -1,11 +1,14 @@
1
- import type { SandboxOptions, SandboxResult } from '../sandbox/types.js';
1
+ import type { SandboxOptions, SandboxResult, OrchestrationOptions, OrchestrationResult } from '../sandbox/types.js';
2
2
  import type { MCPBridge } from '../sandbox/MCPBridge.js';
3
3
  export declare class QuickJSSandbox {
4
4
  private bridge;
5
5
  setBridge(bridge: MCPBridge): void;
6
6
  execute(code: string, options?: SandboxOptions): Promise<SandboxResult>;
7
+ executeWithOrchestration(code: string, bridge: MCPBridge, options?: OrchestrationOptions): Promise<OrchestrationResult>;
8
+ private _executeOneRound;
7
9
  private _injectConsole;
8
10
  private _injectGlobals;
9
11
  private _injectHelpers;
10
12
  private _injectBridge;
13
+ private _injectBridgeForOrchestration;
11
14
  }
@@ -2,6 +2,7 @@ import { getQuickJS } from 'quickjs-emscripten';
2
2
  import { SANDBOX_HELPER_SOURCE } from '../sandbox/SandboxHelpers.js';
3
3
  const DEFAULT_TIMEOUT_MS = 1_000;
4
4
  const DEFAULT_MEMORY_LIMIT_BYTES = 8 * 1024 * 1024;
5
+ const DEFAULT_MAX_BRIDGE_CALLS = 10;
5
6
  function marshalToQuickJS(ctx, value) {
6
7
  if (value === null || value === undefined)
7
8
  return ctx.undefined;
@@ -129,6 +130,127 @@ export class QuickJSSandbox {
129
130
  runtime.dispose();
130
131
  }
131
132
  }
133
+ async executeWithOrchestration(code, bridge, options = {}) {
134
+ const maxBridgeCalls = options.maxBridgeCalls ?? DEFAULT_MAX_BRIDGE_CALLS;
135
+ const startTime = Date.now();
136
+ const allLogs = [];
137
+ const allBridgeCalls = [];
138
+ if (options.bridgeAllowlist) {
139
+ bridge.setAllowlist(options.bridgeAllowlist);
140
+ }
141
+ let bridgeResults = {};
142
+ let lastOutput;
143
+ let round = 0;
144
+ while (round <= maxBridgeCalls) {
145
+ const roundGlobals = {
146
+ ...(options.globals ?? {}),
147
+ __bridgeRound: round,
148
+ };
149
+ if (round > 0) {
150
+ roundGlobals.__bridgeResults = bridgeResults;
151
+ }
152
+ const roundResult = await this._executeOneRound(code, bridge, {
153
+ ...options,
154
+ globals: roundGlobals,
155
+ });
156
+ allLogs.push(...roundResult.logs);
157
+ if (!roundResult.ok || roundResult.timedOut) {
158
+ return {
159
+ ...roundResult,
160
+ logs: allLogs,
161
+ durationMs: Date.now() - startTime,
162
+ bridgeCallCount: allBridgeCalls.length,
163
+ bridgeCalls: allBridgeCalls,
164
+ };
165
+ }
166
+ lastOutput = roundResult.output;
167
+ if (!bridge.hasPending()) {
168
+ break;
169
+ }
170
+ const pending = bridge.drainPending();
171
+ const roundResults = {};
172
+ for (const req of pending) {
173
+ try {
174
+ const result = await bridge.call(req.toolName, req.args);
175
+ roundResults[req.id] = result;
176
+ allBridgeCalls.push({ toolName: req.toolName, args: req.args, result });
177
+ }
178
+ catch (err) {
179
+ const errorMsg = err instanceof Error ? err.message : String(err);
180
+ roundResults[req.id] = { __error: true, message: errorMsg };
181
+ allBridgeCalls.push({ toolName: req.toolName, args: req.args, result: { __error: true, message: errorMsg } });
182
+ }
183
+ }
184
+ bridgeResults = { ...bridgeResults, ...roundResults };
185
+ round++;
186
+ }
187
+ return {
188
+ ok: true,
189
+ output: lastOutput,
190
+ timedOut: false,
191
+ durationMs: Date.now() - startTime,
192
+ logs: allLogs,
193
+ bridgeCallCount: allBridgeCalls.length,
194
+ bridgeCalls: allBridgeCalls,
195
+ };
196
+ }
197
+ async _executeOneRound(code, bridge, options = {}) {
198
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
199
+ const memoryLimitBytes = options.memoryLimitBytes ?? DEFAULT_MEMORY_LIMIT_BYTES;
200
+ const QuickJS = await getQuickJS();
201
+ const runtime = QuickJS.newRuntime();
202
+ runtime.setMemoryLimit(memoryLimitBytes);
203
+ const startTime = Date.now();
204
+ let timedOut = false;
205
+ runtime.setInterruptHandler(() => {
206
+ if (Date.now() - startTime > timeoutMs) {
207
+ timedOut = true;
208
+ return true;
209
+ }
210
+ return false;
211
+ });
212
+ const context = runtime.newContext();
213
+ const logs = [];
214
+ try {
215
+ this._injectConsole(context, logs);
216
+ this._injectHelpers(context);
217
+ this._injectBridgeForOrchestration(context, bridge, logs);
218
+ if (options.globals) {
219
+ this._injectGlobals(context, options.globals);
220
+ }
221
+ const result = context.evalCode(code, 'sandbox-eval.js');
222
+ if (result.error) {
223
+ const errorMsg = context.dump(result.error);
224
+ result.error.dispose();
225
+ if (timedOut) {
226
+ return { ok: false, error: 'Execution timed out', timedOut: true, durationMs: Date.now() - startTime, logs };
227
+ }
228
+ return {
229
+ ok: false,
230
+ error: typeof errorMsg === 'object' ? JSON.stringify(errorMsg) : String(errorMsg),
231
+ timedOut: false,
232
+ durationMs: Date.now() - startTime,
233
+ logs,
234
+ };
235
+ }
236
+ const output = unmarshalFromQuickJS(context, result.value);
237
+ result.value.dispose();
238
+ return { ok: true, output, timedOut: false, durationMs: Date.now() - startTime, logs };
239
+ }
240
+ catch (err) {
241
+ return {
242
+ ok: false,
243
+ error: err instanceof Error ? err.message : String(err),
244
+ timedOut,
245
+ durationMs: Date.now() - startTime,
246
+ logs,
247
+ };
248
+ }
249
+ finally {
250
+ context.dispose();
251
+ runtime.dispose();
252
+ }
253
+ }
132
254
  _injectConsole(ctx, logs) {
133
255
  const consoleObj = ctx.newObject();
134
256
  const logFn = ctx.newFunction('log', (...args) => {
@@ -181,4 +303,31 @@ export class QuickJSSandbox {
181
303
  listFn.dispose();
182
304
  mcpObj.dispose();
183
305
  }
306
+ _injectBridgeForOrchestration(ctx, bridge, logs) {
307
+ const mcpObj = ctx.newObject();
308
+ const callFn = ctx.newFunction('call', (nameHandle, argsHandle) => {
309
+ const name = ctx.getString(nameHandle);
310
+ const args = ctx.dump(argsHandle) ?? {};
311
+ try {
312
+ const callId = bridge.enqueue(name, args);
313
+ logs.push(`[mcp.call] enqueued ${name}(${JSON.stringify(args)}) → ${callId}`);
314
+ return marshalToQuickJS(ctx, { __bridgeCall: true, callId });
315
+ }
316
+ catch (err) {
317
+ const errorMsg = err instanceof Error ? err.message : String(err);
318
+ logs.push(`[mcp.call] rejected ${name}: ${errorMsg}`);
319
+ return marshalToQuickJS(ctx, { __bridgeCall: false, error: errorMsg });
320
+ }
321
+ });
322
+ const listFn = ctx.newFunction('listTools', () => {
323
+ const tools = bridge.listAvailableTools();
324
+ return marshalToQuickJS(ctx, tools);
325
+ });
326
+ ctx.setProp(mcpObj, 'call', callFn);
327
+ ctx.setProp(mcpObj, 'listTools', listFn);
328
+ ctx.setProp(ctx.global, 'mcp', mcpObj);
329
+ callFn.dispose();
330
+ listFn.dispose();
331
+ mcpObj.dispose();
332
+ }
184
333
  }