@natchs/browser-mcp 2.0.0
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.
- package/README.md +141 -0
- package/dist/core/auth.d.ts +7 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +23 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/cache.d.ts +24 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +67 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/config.d.ts +362 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +281 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/context.d.ts +38 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +19 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/errors.d.ts +82 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +98 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/logger.d.ts +22 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +41 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/metrics.d.ts +24 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +59 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/network-capture.d.ts +117 -0
- package/dist/core/network-capture.d.ts.map +1 -0
- package/dist/core/network-capture.js +349 -0
- package/dist/core/network-capture.js.map +1 -0
- package/dist/core/network-export.d.ts +6 -0
- package/dist/core/network-export.d.ts.map +1 -0
- package/dist/core/network-export.js +163 -0
- package/dist/core/network-export.js.map +1 -0
- package/dist/core/output.d.ts +66 -0
- package/dist/core/output.d.ts.map +1 -0
- package/dist/core/output.js +114 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/pipeline.d.ts +25 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +52 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/plugin.d.ts +26 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +49 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/rate-limit.d.ts +33 -0
- package/dist/core/rate-limit.d.ts.map +1 -0
- package/dist/core/rate-limit.js +89 -0
- package/dist/core/rate-limit.js.map +1 -0
- package/dist/core/registry.d.ts +67 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +270 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/sandbox.d.ts +20 -0
- package/dist/core/sandbox.d.ts.map +1 -0
- package/dist/core/sandbox.js +168 -0
- package/dist/core/sandbox.js.map +1 -0
- package/dist/core/schema-gen.d.ts +5 -0
- package/dist/core/schema-gen.d.ts.map +1 -0
- package/dist/core/schema-gen.js +115 -0
- package/dist/core/schema-gen.js.map +1 -0
- package/dist/core/session.d.ts +88 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +300 -0
- package/dist/core/session.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +192 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +11 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +121 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/tools/admin/cache.d.ts +7 -0
- package/dist/tools/admin/cache.d.ts.map +1 -0
- package/dist/tools/admin/cache.js +27 -0
- package/dist/tools/admin/cache.js.map +1 -0
- package/dist/tools/admin/index.d.ts +3 -0
- package/dist/tools/admin/index.d.ts.map +1 -0
- package/dist/tools/admin/index.js +9 -0
- package/dist/tools/admin/index.js.map +1 -0
- package/dist/tools/admin/server-status.d.ts +14 -0
- package/dist/tools/admin/server-status.d.ts.map +1 -0
- package/dist/tools/admin/server-status.js +33 -0
- package/dist/tools/admin/server-status.js.map +1 -0
- package/dist/tools/browser/cookies.d.ts +46 -0
- package/dist/tools/browser/cookies.d.ts.map +1 -0
- package/dist/tools/browser/cookies.js +65 -0
- package/dist/tools/browser/cookies.js.map +1 -0
- package/dist/tools/browser/evaluate.d.ts +12 -0
- package/dist/tools/browser/evaluate.d.ts.map +1 -0
- package/dist/tools/browser/evaluate.js +61 -0
- package/dist/tools/browser/evaluate.js.map +1 -0
- package/dist/tools/browser/index.d.ts +3 -0
- package/dist/tools/browser/index.d.ts.map +1 -0
- package/dist/tools/browser/index.js +17 -0
- package/dist/tools/browser/index.js.map +1 -0
- package/dist/tools/browser/page-info.d.ts +6 -0
- package/dist/tools/browser/page-info.d.ts.map +1 -0
- package/dist/tools/browser/page-info.js +25 -0
- package/dist/tools/browser/page-info.js.map +1 -0
- package/dist/tools/browser/pdf.d.ts +45 -0
- package/dist/tools/browser/pdf.d.ts.map +1 -0
- package/dist/tools/browser/pdf.js +57 -0
- package/dist/tools/browser/pdf.js.map +1 -0
- package/dist/tools/browser/screenshot.d.ts +21 -0
- package/dist/tools/browser/screenshot.d.ts.map +1 -0
- package/dist/tools/browser/screenshot.js +41 -0
- package/dist/tools/browser/screenshot.js.map +1 -0
- package/dist/tools/extraction/extract-css.d.ts +33 -0
- package/dist/tools/extraction/extract-css.d.ts.map +1 -0
- package/dist/tools/extraction/extract-css.js +112 -0
- package/dist/tools/extraction/extract-css.js.map +1 -0
- package/dist/tools/extraction/extract.d.ts +10 -0
- package/dist/tools/extraction/extract.d.ts.map +1 -0
- package/dist/tools/extraction/extract.js +71 -0
- package/dist/tools/extraction/extract.js.map +1 -0
- package/dist/tools/extraction/index.d.ts +3 -0
- package/dist/tools/extraction/index.d.ts.map +1 -0
- package/dist/tools/extraction/index.js +17 -0
- package/dist/tools/extraction/index.js.map +1 -0
- package/dist/tools/interaction/click.d.ts +15 -0
- package/dist/tools/interaction/click.d.ts.map +1 -0
- package/dist/tools/interaction/click.js +31 -0
- package/dist/tools/interaction/click.js.map +1 -0
- package/dist/tools/interaction/drag.d.ts +18 -0
- package/dist/tools/interaction/drag.d.ts.map +1 -0
- package/dist/tools/interaction/drag.js +27 -0
- package/dist/tools/interaction/drag.js.map +1 -0
- package/dist/tools/interaction/file-upload.d.ts +18 -0
- package/dist/tools/interaction/file-upload.d.ts.map +1 -0
- package/dist/tools/interaction/file-upload.js +37 -0
- package/dist/tools/interaction/file-upload.js.map +1 -0
- package/dist/tools/interaction/fill.d.ts +18 -0
- package/dist/tools/interaction/fill.d.ts.map +1 -0
- package/dist/tools/interaction/fill.js +34 -0
- package/dist/tools/interaction/fill.js.map +1 -0
- package/dist/tools/interaction/hover.d.ts +15 -0
- package/dist/tools/interaction/hover.d.ts.map +1 -0
- package/dist/tools/interaction/hover.js +26 -0
- package/dist/tools/interaction/hover.js.map +1 -0
- package/dist/tools/interaction/index.d.ts +3 -0
- package/dist/tools/interaction/index.d.ts.map +1 -0
- package/dist/tools/interaction/index.js +19 -0
- package/dist/tools/interaction/index.js.map +1 -0
- package/dist/tools/interaction/press-key.d.ts +12 -0
- package/dist/tools/interaction/press-key.d.ts.map +1 -0
- package/dist/tools/interaction/press-key.js +24 -0
- package/dist/tools/interaction/press-key.js.map +1 -0
- package/dist/tools/interaction/select.d.ts +18 -0
- package/dist/tools/interaction/select.d.ts.map +1 -0
- package/dist/tools/interaction/select.js +28 -0
- package/dist/tools/interaction/select.js.map +1 -0
- package/dist/tools/interaction/type.d.ts +21 -0
- package/dist/tools/interaction/type.d.ts.map +1 -0
- package/dist/tools/interaction/type.js +30 -0
- package/dist/tools/interaction/type.js.map +1 -0
- package/dist/tools/navigation/back.d.ts +6 -0
- package/dist/tools/navigation/back.d.ts.map +1 -0
- package/dist/tools/navigation/back.js +16 -0
- package/dist/tools/navigation/back.js.map +1 -0
- package/dist/tools/navigation/forward.d.ts +6 -0
- package/dist/tools/navigation/forward.d.ts.map +1 -0
- package/dist/tools/navigation/forward.js +16 -0
- package/dist/tools/navigation/forward.js.map +1 -0
- package/dist/tools/navigation/index.d.ts +3 -0
- package/dist/tools/navigation/index.d.ts.map +1 -0
- package/dist/tools/navigation/index.js +13 -0
- package/dist/tools/navigation/index.js.map +1 -0
- package/dist/tools/navigation/navigate.d.ts +19 -0
- package/dist/tools/navigation/navigate.d.ts.map +1 -0
- package/dist/tools/navigation/navigate.js +52 -0
- package/dist/tools/navigation/navigate.js.map +1 -0
- package/dist/tools/navigation/refresh.d.ts +15 -0
- package/dist/tools/navigation/refresh.d.ts.map +1 -0
- package/dist/tools/navigation/refresh.js +26 -0
- package/dist/tools/navigation/refresh.js.map +1 -0
- package/dist/tools/navigation/wait-for.d.ts +12 -0
- package/dist/tools/navigation/wait-for.d.ts.map +1 -0
- package/dist/tools/navigation/wait-for.js +23 -0
- package/dist/tools/navigation/wait-for.js.map +1 -0
- package/dist/tools/network/console.d.ts +17 -0
- package/dist/tools/network/console.d.ts.map +1 -0
- package/dist/tools/network/console.js +29 -0
- package/dist/tools/network/console.js.map +1 -0
- package/dist/tools/network/dialog.d.ts +14 -0
- package/dist/tools/network/dialog.d.ts.map +1 -0
- package/dist/tools/network/dialog.js +34 -0
- package/dist/tools/network/dialog.js.map +1 -0
- package/dist/tools/network/index.d.ts +3 -0
- package/dist/tools/network/index.d.ts.map +1 -0
- package/dist/tools/network/index.js +21 -0
- package/dist/tools/network/index.js.map +1 -0
- package/dist/tools/network/network-clear.d.ts +11 -0
- package/dist/tools/network/network-clear.d.ts.map +1 -0
- package/dist/tools/network/network-clear.js +24 -0
- package/dist/tools/network/network-clear.js.map +1 -0
- package/dist/tools/network/network-entries.d.ts +35 -0
- package/dist/tools/network/network-entries.d.ts.map +1 -0
- package/dist/tools/network/network-entries.js +73 -0
- package/dist/tools/network/network-entries.js.map +1 -0
- package/dist/tools/network/network-export.d.ts +14 -0
- package/dist/tools/network/network-export.d.ts.map +1 -0
- package/dist/tools/network/network-export.js +24 -0
- package/dist/tools/network/network-export.js.map +1 -0
- package/dist/tools/network/network-requests.d.ts +20 -0
- package/dist/tools/network/network-requests.d.ts.map +1 -0
- package/dist/tools/network/network-requests.js +36 -0
- package/dist/tools/network/network-requests.js.map +1 -0
- package/dist/tools/network/network-response.d.ts +14 -0
- package/dist/tools/network/network-response.d.ts.map +1 -0
- package/dist/tools/network/network-response.js +56 -0
- package/dist/tools/network/network-response.js.map +1 -0
- package/dist/tools/network/wait-nav.d.ts +15 -0
- package/dist/tools/network/wait-nav.d.ts.map +1 -0
- package/dist/tools/network/wait-nav.js +26 -0
- package/dist/tools/network/wait-nav.js.map +1 -0
- package/dist/tools/network/websocket-frames.d.ts +17 -0
- package/dist/tools/network/websocket-frames.d.ts.map +1 -0
- package/dist/tools/network/websocket-frames.js +24 -0
- package/dist/tools/network/websocket-frames.js.map +1 -0
- package/dist/tools/re/api-discover.d.ts +11 -0
- package/dist/tools/re/api-discover.d.ts.map +1 -0
- package/dist/tools/re/api-discover.js +57 -0
- package/dist/tools/re/api-discover.js.map +1 -0
- package/dist/tools/re/auth-analyze.d.ts +11 -0
- package/dist/tools/re/auth-analyze.d.ts.map +1 -0
- package/dist/tools/re/auth-analyze.js +86 -0
- package/dist/tools/re/auth-analyze.js.map +1 -0
- package/dist/tools/re/index.d.ts +3 -0
- package/dist/tools/re/index.d.ts.map +1 -0
- package/dist/tools/re/index.js +11 -0
- package/dist/tools/re/index.js.map +1 -0
- package/dist/tools/re/js-beautify.d.ts +14 -0
- package/dist/tools/re/js-beautify.d.ts.map +1 -0
- package/dist/tools/re/js-beautify.js +132 -0
- package/dist/tools/re/js-beautify.js.map +1 -0
- package/dist/tools/re/js-deobfuscate.d.ts +11 -0
- package/dist/tools/re/js-deobfuscate.d.ts.map +1 -0
- package/dist/tools/re/js-deobfuscate.js +96 -0
- package/dist/tools/re/js-deobfuscate.js.map +1 -0
- package/dist/tools/session/close.d.ts +11 -0
- package/dist/tools/session/close.d.ts.map +1 -0
- package/dist/tools/session/close.js +24 -0
- package/dist/tools/session/close.js.map +1 -0
- package/dist/tools/session/index.d.ts +3 -0
- package/dist/tools/session/index.d.ts.map +1 -0
- package/dist/tools/session/index.js +9 -0
- package/dist/tools/session/index.js.map +1 -0
- package/dist/tools/session/list.d.ts +14 -0
- package/dist/tools/session/list.d.ts.map +1 -0
- package/dist/tools/session/list.js +26 -0
- package/dist/tools/session/list.js.map +1 -0
- package/dist/tools/session/open.d.ts +11 -0
- package/dist/tools/session/open.d.ts.map +1 -0
- package/dist/tools/session/open.js +25 -0
- package/dist/tools/session/open.js.map +1 -0
- package/dist/tools/stealth/fingerprint.d.ts +11 -0
- package/dist/tools/stealth/fingerprint.d.ts.map +1 -0
- package/dist/tools/stealth/fingerprint.js +72 -0
- package/dist/tools/stealth/fingerprint.js.map +1 -0
- package/dist/tools/stealth/human-behavior.d.ts +29 -0
- package/dist/tools/stealth/human-behavior.d.ts.map +1 -0
- package/dist/tools/stealth/human-behavior.js +86 -0
- package/dist/tools/stealth/human-behavior.js.map +1 -0
- package/dist/tools/stealth/index.d.ts +3 -0
- package/dist/tools/stealth/index.d.ts.map +1 -0
- package/dist/tools/stealth/index.js +7 -0
- package/dist/tools/stealth/index.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { errorResult, okResult } from '../../core/output.js';
|
|
3
|
+
import { ErrorCode } from '../../core/errors.js';
|
|
4
|
+
import { sanitizeInput } from '../../core/sandbox.js';
|
|
5
|
+
function deobfuscateJS(code) {
|
|
6
|
+
let result = code;
|
|
7
|
+
const transformations = [];
|
|
8
|
+
const summary = { hexStringsDecoded: 0, unicodeEscapesDecoded: 0, base64StringsDetected: 0, numericExpressionsEvaluated: 0 };
|
|
9
|
+
const hexRegex = /\\x([0-9a-fA-F]{2})/g;
|
|
10
|
+
const hexMatches = result.match(hexRegex);
|
|
11
|
+
if (hexMatches) {
|
|
12
|
+
summary.hexStringsDecoded = hexMatches.length;
|
|
13
|
+
result = result.replace(hexRegex, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
|
|
14
|
+
transformations.push(`Decoded ${summary.hexStringsDecoded} hex escape sequences`);
|
|
15
|
+
}
|
|
16
|
+
const unicodeRegex = /\\u([0-9a-fA-F]{4})/g;
|
|
17
|
+
const unicodeMatches = result.match(unicodeRegex);
|
|
18
|
+
if (unicodeMatches) {
|
|
19
|
+
summary.unicodeEscapesDecoded = unicodeMatches.length;
|
|
20
|
+
result = result.replace(unicodeRegex, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
|
|
21
|
+
transformations.push(`Decoded ${summary.unicodeEscapesDecoded} unicode escape sequences`);
|
|
22
|
+
}
|
|
23
|
+
const unicodeCurlyRegex = /\\u\{([0-9a-fA-F]+)\}/g;
|
|
24
|
+
const unicodeCurlyMatches = result.match(unicodeCurlyRegex);
|
|
25
|
+
if (unicodeCurlyMatches) {
|
|
26
|
+
summary.unicodeEscapesDecoded += unicodeCurlyMatches.length;
|
|
27
|
+
result = result.replace(unicodeCurlyRegex, (_, hex) => String.fromCodePoint(Number.parseInt(hex, 16)));
|
|
28
|
+
transformations.push(`Decoded ${unicodeCurlyMatches.length} extended unicode escape sequences`);
|
|
29
|
+
}
|
|
30
|
+
const base64Regex = /["']([A-Za-z0-9+/]{20,}={0,2})["']/g;
|
|
31
|
+
const base64Candidates = new Set();
|
|
32
|
+
let b64Match;
|
|
33
|
+
while ((b64Match = base64Regex.exec(code)) !== null) {
|
|
34
|
+
const candidate = b64Match[1];
|
|
35
|
+
try {
|
|
36
|
+
const decoded = Buffer.from(candidate, 'base64').toString('utf-8');
|
|
37
|
+
if (decoded.length > 4 && /[\w\s,.;:!?(){}\[\]<>@#$%^&*+=\-|/~`]+/.test(decoded) && !decoded.includes('\uFFFD')) {
|
|
38
|
+
base64Candidates.add(candidate);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch { /* not valid base64 */ }
|
|
42
|
+
}
|
|
43
|
+
summary.base64StringsDetected = base64Candidates.size;
|
|
44
|
+
if (base64Candidates.size > 0) {
|
|
45
|
+
transformations.push(`Detected ${base64Candidates.size} potential base64 encoded strings`);
|
|
46
|
+
}
|
|
47
|
+
const numberExprRegex = /0x[0-9a-fA-F]+/g;
|
|
48
|
+
const hexNumberMatches = result.match(numberExprRegex);
|
|
49
|
+
if (hexNumberMatches) {
|
|
50
|
+
summary.numericExpressionsEvaluated = hexNumberMatches.length;
|
|
51
|
+
result = result.replace(numberExprRegex, (match) => String(Number.parseInt(match, 16)));
|
|
52
|
+
transformations.push(`Evaluated ${summary.numericExpressionsEvaluated} hex numeric expressions`);
|
|
53
|
+
}
|
|
54
|
+
const concatBinary = /(\d+)\s*\+\s*(\d+)/g;
|
|
55
|
+
let concatMatch;
|
|
56
|
+
let concatFound = 0;
|
|
57
|
+
const evaluated = new Set();
|
|
58
|
+
while ((concatMatch = concatBinary.exec(result)) !== null) {
|
|
59
|
+
const expr = concatMatch[0];
|
|
60
|
+
if (!evaluated.has(expr)) {
|
|
61
|
+
evaluated.add(expr);
|
|
62
|
+
concatFound++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (concatFound > 0) {
|
|
66
|
+
summary.numericExpressionsEvaluated += concatFound;
|
|
67
|
+
result = result.replace(concatBinary, (_, a, b) => String(Number(a) + Number(b)));
|
|
68
|
+
transformations.push(`Evaluated ${concatFound} simple numeric expressions`);
|
|
69
|
+
}
|
|
70
|
+
return { code: result, transformations, summary };
|
|
71
|
+
}
|
|
72
|
+
export const JsDeobfuscateArgs = z.object({
|
|
73
|
+
code: z.string().min(1).describe('Obfuscated JavaScript code to clean'),
|
|
74
|
+
});
|
|
75
|
+
export const jsDeobfuscateHandler = async (args, _ctx) => {
|
|
76
|
+
const parsed = JsDeobfuscateArgs.safeParse(args);
|
|
77
|
+
if (!parsed.success)
|
|
78
|
+
return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
|
|
79
|
+
const { code } = parsed.data;
|
|
80
|
+
const { sanitized: safeCode } = sanitizeInput(code);
|
|
81
|
+
try {
|
|
82
|
+
const result = deobfuscateJS(safeCode);
|
|
83
|
+
return okResult({
|
|
84
|
+
originalLength: safeCode.length,
|
|
85
|
+
deobfuscatedLength: result.code.length,
|
|
86
|
+
transformations: result.transformations,
|
|
87
|
+
summary: result.summary,
|
|
88
|
+
code: result.code,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
93
|
+
return errorResult(ErrorCode.DEOBFUSCATE_FAILED, message);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=js-deobfuscate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-deobfuscate.js","sourceRoot":"","sources":["../../../src/tools/re/js-deobfuscate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolHandler } from '../../core/registry.js';
|
|
3
|
+
export declare const CloseSessionArgs: z.ZodObject<{
|
|
4
|
+
sessionId: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
}, {
|
|
8
|
+
sessionId: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare const closeSessionHandler: ToolHandler;
|
|
11
|
+
//# sourceMappingURL=close.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../src/tools/session/close.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,eAAO,MAAM,gBAAgB;;;;;;EAE3B,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,WAajC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { errorResult, okResult } from '../../core/output.js';
|
|
3
|
+
import { ErrorCode } from '../../core/errors.js';
|
|
4
|
+
export const CloseSessionArgs = z.object({
|
|
5
|
+
sessionId: z.string().min(1),
|
|
6
|
+
});
|
|
7
|
+
export const closeSessionHandler = async (args, ctx) => {
|
|
8
|
+
const parsed = CloseSessionArgs.safeParse(args);
|
|
9
|
+
if (!parsed.success)
|
|
10
|
+
return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
|
|
11
|
+
const { sessionId } = parsed.data;
|
|
12
|
+
const sm = ctx.sessionManager;
|
|
13
|
+
if (!sm)
|
|
14
|
+
return errorResult(ErrorCode.SESSION_MANAGER_UNAVAILABLE, 'Session manager not available');
|
|
15
|
+
try {
|
|
16
|
+
await sm.destroySession(sessionId);
|
|
17
|
+
return okResult({ sessionId, closed: true });
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
21
|
+
return errorResult(ErrorCode.SESSION_CLOSE_FAILED, message);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=close.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.js","sourceRoot":"","sources":["../../../src/tools/session/close.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAgB,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAClC,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,CAAC;IACpG,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAK3D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAajE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { openSessionHandler, OpenSessionArgs } from './open.js';
|
|
2
|
+
import { closeSessionHandler, CloseSessionArgs } from './close.js';
|
|
3
|
+
import { listSessionsHandler, ListSessionsArgs } from './list.js';
|
|
4
|
+
export function registerSessionTools(registry) {
|
|
5
|
+
registry.register({ name: 'browser_open_session', description: 'Open a new browser session (tab)', category: 'session', schema: OpenSessionArgs }, openSessionHandler);
|
|
6
|
+
registry.register({ name: 'browser_close_session', description: 'Close a browser session by ID', category: 'session', schema: CloseSessionArgs }, closeSessionHandler);
|
|
7
|
+
registry.register({ name: 'browser_list_sessions', description: 'List all active browser sessions', category: 'session', schema: ListSessionsArgs }, listSessionsHandler);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/session/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElE,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,EAC/H,kBAAkB,CACnB,CAAC;IACF,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAC9H,mBAAmB,CACpB,CAAC;IACF,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,EACjI,mBAAmB,CACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolHandler } from '../../core/registry.js';
|
|
3
|
+
export declare const ListSessionsArgs: z.ZodObject<{
|
|
4
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
offset?: number | undefined;
|
|
8
|
+
limit?: number | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
offset?: number | undefined;
|
|
11
|
+
limit?: number | undefined;
|
|
12
|
+
}>;
|
|
13
|
+
export declare const listSessionsHandler: ToolHandler;
|
|
14
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/tools/session/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,WAcjC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { errorResult, applyPagination, paginatedOkResult } from '../../core/output.js';
|
|
3
|
+
import { ErrorCode } from '../../core/errors.js';
|
|
4
|
+
export const ListSessionsArgs = z.object({
|
|
5
|
+
offset: z.number().int().min(0).optional(),
|
|
6
|
+
limit: z.number().int().min(1).max(100).optional(),
|
|
7
|
+
});
|
|
8
|
+
export const listSessionsHandler = async (args, ctx) => {
|
|
9
|
+
const sm = ctx.sessionManager;
|
|
10
|
+
if (!sm)
|
|
11
|
+
return errorResult(ErrorCode.SESSION_MANAGER_UNAVAILABLE, 'Session manager not available');
|
|
12
|
+
try {
|
|
13
|
+
const parsed = ListSessionsArgs.safeParse(args);
|
|
14
|
+
if (!parsed.success)
|
|
15
|
+
return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
|
|
16
|
+
const { offset, limit } = parsed.data;
|
|
17
|
+
const sessions = sm.listSessions ? await sm.listSessions() : [];
|
|
18
|
+
const { items, totalCount } = applyPagination(sessions, { offset, limit });
|
|
19
|
+
return paginatedOkResult(items, totalCount, offset ?? 0, limit ?? 50);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
23
|
+
return errorResult(ErrorCode.LIST_SESSIONS_FAILED, message);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/tools/session/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAgB,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAClE,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,CAAC;IACpG,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;QACtC,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,OAAO,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolHandler } from '../../core/registry.js';
|
|
3
|
+
export declare const OpenSessionArgs: z.ZodObject<{
|
|
4
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
sessionId?: string | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
sessionId?: string | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
export declare const openSessionHandler: ToolHandler;
|
|
11
|
+
//# sourceMappingURL=open.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/tools/session/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,WAchC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { errorResult, okResult } from '../../core/output.js';
|
|
3
|
+
import { ErrorCode } from '../../core/errors.js';
|
|
4
|
+
export const OpenSessionArgs = z.object({
|
|
5
|
+
sessionId: z.string().optional(),
|
|
6
|
+
});
|
|
7
|
+
export const openSessionHandler = async (args, ctx) => {
|
|
8
|
+
const parsed = OpenSessionArgs.safeParse(args);
|
|
9
|
+
if (!parsed.success)
|
|
10
|
+
return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
|
|
11
|
+
const { sessionId } = parsed.data;
|
|
12
|
+
const sm = ctx.sessionManager;
|
|
13
|
+
if (!sm)
|
|
14
|
+
return errorResult(ErrorCode.SESSION_MANAGER_UNAVAILABLE, 'Session manager not available');
|
|
15
|
+
try {
|
|
16
|
+
const id = sessionId ?? `sess-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
17
|
+
await sm.getOrCreateSession(id);
|
|
18
|
+
return okResult({ sessionId: id, created: true });
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
22
|
+
return errorResult(ErrorCode.SESSION_OPEN_FAILED, message);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/tools/session/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAgB,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACjE,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAClC,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,CAAC;IACpG,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,SAAS,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolHandler } from '../../core/registry.js';
|
|
3
|
+
export declare const FingerprintArgs: z.ZodObject<{
|
|
4
|
+
platform: z.ZodOptional<z.ZodEnum<["windows", "mac", "linux"]>>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
platform?: "windows" | "mac" | "linux" | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
platform?: "windows" | "mac" | "linux" | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
export declare const fingerprintHandler: ToolHandler;
|
|
11
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/tools/stealth/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AA0D1D,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,WAWhC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { errorResult, okResult } from '../../core/output.js';
|
|
3
|
+
import { ErrorCode } from '../../core/errors.js';
|
|
4
|
+
const USER_AGENTS = [
|
|
5
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
|
|
6
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
|
|
7
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0',
|
|
8
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0',
|
|
9
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0',
|
|
10
|
+
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
|
|
11
|
+
];
|
|
12
|
+
const VIEWPORTS = [
|
|
13
|
+
{ width: 1920, height: 1080 },
|
|
14
|
+
{ width: 1366, height: 768 },
|
|
15
|
+
{ width: 1536, height: 864 },
|
|
16
|
+
{ width: 1440, height: 900 },
|
|
17
|
+
{ width: 1280, height: 720 },
|
|
18
|
+
{ width: 2560, height: 1440 },
|
|
19
|
+
];
|
|
20
|
+
const TIMEZONES = [
|
|
21
|
+
'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles',
|
|
22
|
+
'Europe/London', 'Europe/Berlin', 'Europe/Paris', 'Europe/Istanbul',
|
|
23
|
+
'Asia/Tokyo', 'Asia/Shanghai', 'Asia/Seoul', 'Asia/Dubai',
|
|
24
|
+
'Australia/Sydney', 'Pacific/Auckland',
|
|
25
|
+
];
|
|
26
|
+
const LOCALES = ['en-US', 'en-GB', 'de-DE', 'fr-FR', 'es-ES', 'ja-JP', 'ko-KR', 'zh-CN', 'tr-TR', 'ar-SA'];
|
|
27
|
+
function pickRandom(arr) {
|
|
28
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
29
|
+
}
|
|
30
|
+
function generateProfile(platform) {
|
|
31
|
+
let ua;
|
|
32
|
+
if (platform === 'windows') {
|
|
33
|
+
ua = pickRandom(USER_AGENTS.filter(a => a.includes('Windows')));
|
|
34
|
+
}
|
|
35
|
+
else if (platform === 'mac') {
|
|
36
|
+
ua = pickRandom(USER_AGENTS.filter(a => a.includes('Macintosh')));
|
|
37
|
+
}
|
|
38
|
+
else if (platform === 'linux') {
|
|
39
|
+
ua = pickRandom(USER_AGENTS.filter(a => a.includes('Linux')));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
ua = pickRandom(USER_AGENTS);
|
|
43
|
+
}
|
|
44
|
+
const viewport = pickRandom(VIEWPORTS);
|
|
45
|
+
const timezone = pickRandom(TIMEZONES);
|
|
46
|
+
const locale = pickRandom(LOCALES);
|
|
47
|
+
return {
|
|
48
|
+
userAgent: ua,
|
|
49
|
+
viewport,
|
|
50
|
+
timezone,
|
|
51
|
+
locale,
|
|
52
|
+
platform: platform ?? 'random',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export const FingerprintArgs = z.object({
|
|
56
|
+
platform: z.enum(['windows', 'mac', 'linux']).optional().describe('Target platform'),
|
|
57
|
+
});
|
|
58
|
+
export const fingerprintHandler = async (args, _ctx) => {
|
|
59
|
+
const parsed = FingerprintArgs.safeParse(args);
|
|
60
|
+
if (!parsed.success)
|
|
61
|
+
return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
|
|
62
|
+
const { platform } = parsed.data;
|
|
63
|
+
try {
|
|
64
|
+
const profile = generateProfile(platform);
|
|
65
|
+
return okResult(profile);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
69
|
+
return errorResult(ErrorCode.FINGERPRINT_FAILED, message);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../src/tools/stealth/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,WAAW,GAAG;IAClB,iHAAiH;IACjH,uHAAuH;IACvH,kFAAkF;IAClF,sFAAsF;IACtF,+HAA+H;IAC/H,uGAAuG;CACxG,CAAC;AAEF,MAAM,SAAS,GAAG;IAChB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CAC9B,CAAC;AAEF,MAAM,SAAS,GAAG;IAChB,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB;IAC9E,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB;IACnE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY;IACzD,kBAAkB,EAAE,kBAAkB;CACvC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAE3G,SAAS,UAAU,CAAI,GAAQ;IAC7B,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CAAC,QAAiB;IACxC,IAAI,EAAU,CAAC;IACf,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;SAAM,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC9B,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEnC,OAAO;QACL,SAAS,EAAE,EAAE;QACb,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,QAAQ,EAAE,QAAQ,IAAI,QAAQ;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACrF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAgB,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolHandler } from '../../core/registry.js';
|
|
3
|
+
export declare const HumanBehaviorArgs: z.ZodObject<{
|
|
4
|
+
action: z.ZodEnum<["typing", "mouse", "scroll"]>;
|
|
5
|
+
text: z.ZodOptional<z.ZodString>;
|
|
6
|
+
startX: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
startY: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
endX: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
endY: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
skillLevel: z.ZodDefault<z.ZodEnum<["slow", "normal", "fast"]>>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
skillLevel: "slow" | "normal" | "fast";
|
|
13
|
+
action: "scroll" | "typing" | "mouse";
|
|
14
|
+
text?: string | undefined;
|
|
15
|
+
startX?: number | undefined;
|
|
16
|
+
startY?: number | undefined;
|
|
17
|
+
endX?: number | undefined;
|
|
18
|
+
endY?: number | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
action: "scroll" | "typing" | "mouse";
|
|
21
|
+
text?: string | undefined;
|
|
22
|
+
skillLevel?: "slow" | "normal" | "fast" | undefined;
|
|
23
|
+
startX?: number | undefined;
|
|
24
|
+
startY?: number | undefined;
|
|
25
|
+
endX?: number | undefined;
|
|
26
|
+
endY?: number | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const humanBehaviorHandler: ToolHandler;
|
|
29
|
+
//# sourceMappingURL=human-behavior.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-behavior.d.ts","sourceRoot":"","sources":["../../../src/tools/stealth/human-behavior.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAgD1D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;EAQ5B,CAAC;AAEH,eAAO,MAAM,oBAAoB,EAAE,WAkClC,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { errorResult, okResult } from '../../core/output.js';
|
|
3
|
+
import { ErrorCode } from '../../core/errors.js';
|
|
4
|
+
function generateTypingProfile(text, skillLevel) {
|
|
5
|
+
const speedConfig = {
|
|
6
|
+
slow: { minDelay: 120, maxDelay: 350, mistakeRate: 0.08, pauseEvery: 5, pauseDurationMs: 600 },
|
|
7
|
+
normal: { minDelay: 60, maxDelay: 180, mistakeRate: 0.03, pauseEvery: 8, pauseDurationMs: 300 },
|
|
8
|
+
fast: { minDelay: 30, maxDelay: 80, mistakeRate: 0.01, pauseEvery: 12, pauseDurationMs: 150 },
|
|
9
|
+
};
|
|
10
|
+
const config = speedConfig[skillLevel];
|
|
11
|
+
const delays = [];
|
|
12
|
+
for (let i = 0; i < text.length; i++) {
|
|
13
|
+
const delay = config.minDelay + Math.random() * (config.maxDelay - config.minDelay);
|
|
14
|
+
delays.push(Math.round(delay));
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
textLength: text.length,
|
|
18
|
+
skillLevel,
|
|
19
|
+
estimatedTypingTimeMs: delays.reduce((a, b) => a + b, 0),
|
|
20
|
+
delays,
|
|
21
|
+
mistakes: Math.round(text.length * config.mistakeRate),
|
|
22
|
+
pausesEvery: config.pauseEvery,
|
|
23
|
+
pauseDurationMs: config.pauseDurationMs,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function generateMousePath(startX, startY, endX, endY) {
|
|
27
|
+
const steps = 5 + Math.floor(Math.random() * 10);
|
|
28
|
+
const points = [];
|
|
29
|
+
const totalTime = 200 + Math.random() * 600;
|
|
30
|
+
for (let i = 0; i <= steps; i++) {
|
|
31
|
+
const t = i / steps;
|
|
32
|
+
const eased = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
|
|
33
|
+
const jitterX = (Math.random() - 0.5) * 3;
|
|
34
|
+
const jitterY = (Math.random() - 0.5) * 3;
|
|
35
|
+
points.push({
|
|
36
|
+
x: Math.round(startX + (endX - startX) * eased + jitterX),
|
|
37
|
+
y: Math.round(startY + (endY - startY) * eased + jitterY),
|
|
38
|
+
t: Math.round(t * totalTime),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return { start: { x: startX, y: startY }, end: { x: endX, y: endY }, points, totalTimeMs: Math.round(totalTime) };
|
|
42
|
+
}
|
|
43
|
+
export const HumanBehaviorArgs = z.object({
|
|
44
|
+
action: z.enum(['typing', 'mouse', 'scroll']).describe('Type of human behavior simulation'),
|
|
45
|
+
text: z.string().optional().describe('Text for typing simulation'),
|
|
46
|
+
startX: z.number().optional().describe('Mouse start X'),
|
|
47
|
+
startY: z.number().optional().describe('Mouse start Y'),
|
|
48
|
+
endX: z.number().optional().describe('Mouse end X'),
|
|
49
|
+
endY: z.number().optional().describe('Mouse end Y'),
|
|
50
|
+
skillLevel: z.enum(['slow', 'normal', 'fast']).default('normal').describe('Typing skill level'),
|
|
51
|
+
});
|
|
52
|
+
export const humanBehaviorHandler = async (args, _ctx) => {
|
|
53
|
+
const parsed = HumanBehaviorArgs.safeParse(args);
|
|
54
|
+
if (!parsed.success)
|
|
55
|
+
return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
|
|
56
|
+
const { action, text, startX, startY, endX, endY, skillLevel } = parsed.data;
|
|
57
|
+
try {
|
|
58
|
+
if (action === 'typing') {
|
|
59
|
+
if (!text)
|
|
60
|
+
return errorResult(ErrorCode.INVALID_ARGS, 'text is required for typing simulation');
|
|
61
|
+
const profile = generateTypingProfile(text, skillLevel);
|
|
62
|
+
return okResult({ action: 'typing', ...profile });
|
|
63
|
+
}
|
|
64
|
+
if (action === 'mouse') {
|
|
65
|
+
if (startX === undefined || startY === undefined || endX === undefined || endY === undefined) {
|
|
66
|
+
return errorResult(ErrorCode.INVALID_ARGS, 'startX, startY, endX, endY are required for mouse simulation');
|
|
67
|
+
}
|
|
68
|
+
const path = generateMousePath(startX, startY, endX, endY);
|
|
69
|
+
return okResult({ action: 'mouse', ...path });
|
|
70
|
+
}
|
|
71
|
+
if (action === 'scroll') {
|
|
72
|
+
return okResult({
|
|
73
|
+
action: 'scroll',
|
|
74
|
+
strategy: 'Incremental scroll with variable speed',
|
|
75
|
+
description: 'Scrolls in steps of 100-300px with 50-200ms delays between steps',
|
|
76
|
+
recommendation: 'Use page.evaluate to scroll: window.scrollBy({ top: 300, behavior: "smooth" })',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return errorResult(ErrorCode.INVALID_ARGS, `Unknown action: ${action}`);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
83
|
+
return errorResult(ErrorCode.HUMAN_BEHAVIOR_FAILED, message);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=human-behavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-behavior.js","sourceRoot":"","sources":["../../../src/tools/stealth/human-behavior.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,SAAS,qBAAqB,CAAC,IAAY,EAAE,UAAsC;IACjF,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE;QAC9F,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE;QAC/F,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE;KAC9F,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,UAAU;QACV,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;QACtD,WAAW,EAAE,MAAM,CAAC,UAAU;QAC9B,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,MAAc,EAAE,IAAY,EAAE,IAAY;IACnF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAA+C,EAAE,CAAC;IAC9D,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC;YACV,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;YACzD,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;YACzD,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;AACpH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC3F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IACvD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IACvD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IACnD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IACnD,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;CAChG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAgB,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACpE,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAE7E,IAAI,CAAC;QACH,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI;gBAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,wCAAwC,CAAC,CAAC;YAChG,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACxD,OAAO,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7F,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,8DAA8D,CAAC,CAAC;YAC7G,CAAC;YACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3D,OAAO,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC;gBACd,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,wCAAwC;gBAClD,WAAW,EAAE,kEAAkE;gBAC/E,cAAc,EAAE,gFAAgF;aACjG,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/stealth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CASjE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { fingerprintHandler, FingerprintArgs } from './fingerprint.js';
|
|
2
|
+
import { humanBehaviorHandler, HumanBehaviorArgs } from './human-behavior.js';
|
|
3
|
+
export function registerStealthTools(registry) {
|
|
4
|
+
registry.register({ name: 'browser_fingerprint', description: 'Generate randomized browser fingerprint profile', category: 'stealth', needsBrowser: false, schema: FingerprintArgs }, fingerprintHandler);
|
|
5
|
+
registry.register({ name: 'browser_human_behavior', description: 'Generate human-like typing, mouse, or scroll behavior profile', category: 'stealth', needsBrowser: false, schema: HumanBehaviorArgs }, humanBehaviorHandler);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/stealth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,iDAAiD,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,EAClK,kBAAkB,CACnB,CAAC;IACF,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,+DAA+D,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,EACrL,oBAAoB,CACrB,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@natchs/browser-mcp",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "MCP server for browser automation with reverse engineering focus",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"dev": "tsc --watch",
|
|
10
|
+
"lint": "tsc --noEmit",
|
|
11
|
+
"test": "vitest run",
|
|
12
|
+
"test:watch": "vitest",
|
|
13
|
+
"test:coverage": "vitest run --coverage"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"mcp",
|
|
20
|
+
"browser",
|
|
21
|
+
"playwright",
|
|
22
|
+
"automation"
|
|
23
|
+
],
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
27
|
+
"playwright": "^1.51.0",
|
|
28
|
+
"zod": "^3.24.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^24.3.0",
|
|
32
|
+
"@types/ws": "^8.18.1",
|
|
33
|
+
"@vitest/coverage-v8": "^3.2.6",
|
|
34
|
+
"typescript": "^5.8.0",
|
|
35
|
+
"vitest": "^3.2.6"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18"
|
|
39
|
+
}
|
|
40
|
+
}
|