real-browser-mcp-server 1.2.0 → 1.2.2
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 +96 -9
- package/dist/lib/cjs/index.d.ts +2 -0
- package/dist/lib/cjs/index.d.ts.map +1 -0
- package/dist/lib/cjs/index.js +385 -0
- package/dist/lib/cjs/index.js.map +1 -0
- package/dist/lib/cjs/module/pageController.d.ts +2 -0
- package/dist/lib/cjs/module/pageController.d.ts.map +1 -0
- package/{lib → dist/lib}/cjs/module/pageController.js +28 -29
- package/dist/lib/cjs/module/pageController.js.map +1 -0
- package/dist/lib/cjs/module/turnstile.d.ts +2 -0
- package/dist/lib/cjs/module/turnstile.d.ts.map +1 -0
- package/{lib → dist/lib}/cjs/module/turnstile.js +24 -12
- package/dist/lib/cjs/module/turnstile.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +118 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/handlers/browser.d.ts +30 -0
- package/dist/src/mcp/handlers/browser.d.ts.map +1 -0
- package/dist/src/mcp/handlers/browser.js +231 -0
- package/dist/src/mcp/handlers/browser.js.map +1 -0
- package/dist/src/mcp/handlers/dom.d.ts +134 -0
- package/dist/src/mcp/handlers/dom.d.ts.map +1 -0
- package/dist/src/mcp/handlers/dom.js +551 -0
- package/dist/src/mcp/handlers/dom.js.map +1 -0
- package/dist/src/mcp/handlers/extract.d.ts +59 -0
- package/dist/src/mcp/handlers/extract.d.ts.map +1 -0
- package/dist/src/mcp/handlers/extract.js +455 -0
- package/dist/src/mcp/handlers/extract.js.map +1 -0
- package/dist/src/mcp/handlers/form-handlers.d.ts +9 -0
- package/dist/src/mcp/handlers/form-handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers/form-handlers.js +56 -0
- package/dist/src/mcp/handlers/form-handlers.js.map +1 -0
- package/dist/src/mcp/handlers/helpers.d.ts +47 -0
- package/dist/src/mcp/handlers/helpers.d.ts.map +1 -0
- package/dist/src/mcp/handlers/helpers.js +515 -0
- package/dist/src/mcp/handlers/helpers.js.map +1 -0
- package/dist/src/mcp/handlers/index.d.ts +6 -0
- package/dist/src/mcp/handlers/index.d.ts.map +1 -0
- package/dist/src/mcp/handlers/index.js +61 -0
- package/dist/src/mcp/handlers/index.js.map +1 -0
- package/dist/src/mcp/handlers/media-handlers.d.ts +10 -0
- package/dist/src/mcp/handlers/media-handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers/media-handlers.js +535 -0
- package/dist/src/mcp/handlers/media-handlers.js.map +1 -0
- package/dist/src/mcp/handlers/network.d.ts +147 -0
- package/dist/src/mcp/handlers/network.d.ts.map +1 -0
- package/dist/src/mcp/handlers/network.js +1135 -0
- package/dist/src/mcp/handlers/network.js.map +1 -0
- package/dist/src/mcp/handlers/state.d.ts +34 -0
- package/dist/src/mcp/handlers/state.d.ts.map +1 -0
- package/dist/src/mcp/handlers/state.js +225 -0
- package/dist/src/mcp/handlers/state.js.map +1 -0
- package/dist/src/mcp/handlers/utility-handlers.d.ts +167 -0
- package/dist/src/mcp/handlers/utility-handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers/utility-handlers.js +280 -0
- package/dist/src/mcp/handlers/utility-handlers.js.map +1 -0
- package/dist/src/mcp/handlers/vision.d.ts +127 -0
- package/dist/src/mcp/handlers/vision.d.ts.map +1 -0
- package/dist/src/mcp/handlers/vision.js +483 -0
- package/dist/src/mcp/handlers/vision.js.map +1 -0
- package/dist/src/mcp/index.d.ts +3 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +166 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/server.d.ts +2 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +117 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools.d.ts +8 -0
- package/dist/src/mcp/tools.d.ts.map +1 -0
- package/{src → dist/src}/mcp/tools.js +12 -11
- package/dist/src/mcp/tools.js.map +1 -0
- package/dist/src/shared/cache-manager.d.ts +80 -0
- package/dist/src/shared/cache-manager.d.ts.map +1 -0
- package/dist/src/shared/cache-manager.js +221 -0
- package/dist/src/shared/cache-manager.js.map +1 -0
- package/dist/src/shared/tools.d.ts +2 -0
- package/dist/src/shared/tools.d.ts.map +1 -0
- package/dist/src/shared/tools.js +599 -0
- package/dist/src/shared/tools.js.map +1 -0
- package/dist/src/types.d.ts +365 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +9 -0
- package/dist/src/types.js.map +1 -0
- package/dist/test/cjs/test.d.ts +11 -0
- package/dist/test/cjs/test.d.ts.map +1 -0
- package/dist/test/cjs/test.js +289 -0
- package/dist/test/cjs/test.js.map +1 -0
- package/dist/test/mcp/smoke-test.d.ts +29 -0
- package/dist/test/mcp/smoke-test.d.ts.map +1 -0
- package/dist/test/mcp/smoke-test.js +132 -0
- package/dist/test/mcp/smoke-test.js.map +1 -0
- package/lib/esm/index.mjs +232 -79
- package/lib/esm/module/pageController.mjs +21 -18
- package/lib/esm/module/turnstile.mjs +7 -0
- package/package.json +25 -15
- package/typings.d.ts +12 -6
- package/.github/ISSUE_TEMPLATE/general_issue.yaml +0 -58
- package/.github/SETUP.md +0 -111
- package/.github/workflows/publish.yml +0 -135
- package/Dockerfile +0 -79
- package/lib/cjs/adblocker.bin +0 -0
- package/lib/cjs/index.js +0 -249
- package/src/ai/action-parser.js +0 -274
- package/src/ai/core.js +0 -378
- package/src/ai/element-finder.js +0 -466
- package/src/ai/index.js +0 -82
- package/src/ai/page-analyzer.js +0 -304
- package/src/ai/selector-healer.js +0 -236
- package/src/index.js +0 -121
- package/src/mcp/handlers.js +0 -5071
- package/src/mcp/index.js +0 -190
- package/src/mcp/server.js +0 -144
- package/src/shared/tools.js +0 -618
- package/test/cjs/test.js +0 -259
- package/test/esm/package.json +0 -13
- package/test/esm/test.js +0 -226
- package/test/esm/test_option2.js +0 -46
- package/test/esm/test_playwright_ghost.js +0 -30
|
@@ -1,15 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
3
|
const { checkTurnstile } = require('./turnstile.js');
|
|
2
|
-
|
|
3
4
|
async function pageController({ browser, page, proxy, turnstile }) {
|
|
4
|
-
if (page._pageControllerApplied)
|
|
5
|
+
if (page._pageControllerApplied)
|
|
6
|
+
return page;
|
|
5
7
|
page._pageControllerApplied = true;
|
|
6
|
-
|
|
7
8
|
let solveStatus = turnstile;
|
|
8
|
-
|
|
9
9
|
page.on('close', () => {
|
|
10
10
|
solveStatus = false;
|
|
11
11
|
});
|
|
12
|
-
|
|
13
12
|
async function turnstileSolver() {
|
|
14
13
|
while (solveStatus) {
|
|
15
14
|
await checkTurnstile({ page }).catch(() => { });
|
|
@@ -17,34 +16,35 @@ async function pageController({ browser, page, proxy, turnstile }) {
|
|
|
17
16
|
}
|
|
18
17
|
return;
|
|
19
18
|
}
|
|
20
|
-
|
|
21
19
|
if (solveStatus) {
|
|
22
20
|
turnstileSolver();
|
|
23
21
|
}
|
|
24
|
-
|
|
25
22
|
// === POPUP AD BLOCKING ===
|
|
26
23
|
const context = page.context();
|
|
27
|
-
context.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
url.
|
|
34
|
-
url
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
24
|
+
if (!context._popupBlockerApplied) {
|
|
25
|
+
context._popupBlockerApplied = true;
|
|
26
|
+
context.on('page', async (newPage) => {
|
|
27
|
+
try {
|
|
28
|
+
const opener = await newPage.opener();
|
|
29
|
+
if (opener) {
|
|
30
|
+
const url = newPage.url();
|
|
31
|
+
const isAdPopup = url === 'about:blank' ||
|
|
32
|
+
url.includes('ad') ||
|
|
33
|
+
url.includes('pop') ||
|
|
34
|
+
url.includes('click') ||
|
|
35
|
+
url.includes('redirect') ||
|
|
36
|
+
url.includes('track');
|
|
37
|
+
if (isAdPopup) {
|
|
38
|
+
await newPage.close().catch(() => { });
|
|
39
|
+
console.error('[popup-blocker] Blocked popup ad:', url.substring(0, 50));
|
|
40
|
+
}
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
catch (e) {
|
|
44
|
+
// Ignore errors
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
48
|
// NOTE: JS stealth overrides are commented out because Patchright natively handles automation hiding.
|
|
49
49
|
// Manual JS overrides trigger Pixelscan fingerprint masking detectors.
|
|
50
50
|
/*
|
|
@@ -63,8 +63,7 @@ async function pageController({ browser, page, proxy, turnstile }) {
|
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
65
|
*/
|
|
66
|
-
|
|
67
66
|
return page;
|
|
68
67
|
}
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
module.exports = { pageController };
|
|
69
|
+
//# sourceMappingURL=pageController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageController.js","sourceRoot":"","sources":["../../../../lib/cjs/module/pageController.ts"],"names":[],"mappings":";;AAEA,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAErD,KAAK,UAAU,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7D,IAAI,IAAI,CAAC,sBAAsB;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAEnC,IAAI,WAAW,GAAG,SAAS,CAAC;IAE5B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,WAAW,GAAG,KAAK,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,eAAe;QAC1B,OAAO,WAAW,EAAE,CAAC;YACjB,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAChD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO;IACX,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;IACtB,CAAC;IAED,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAChC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACpC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrC,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtC,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,GAAG,KAAK,aAAa;wBACnC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAClB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACnB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;wBACrB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;wBACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC1B,IAAI,SAAS,EAAE,CAAC;wBACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;wBACvC,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC7E,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,gBAAgB;YACpB,CAAC;QACL,CAAC,CAAC,CAAC;IACH,CAAC;IAED,sGAAsG;IACtG,uEAAuE;IACvE;;;;;;;;;;;;;;;MAeE;IAEF,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnstile.d.ts","sourceRoot":"","sources":["../../../../lib/cjs/module/turnstile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
3
|
const checkTurnstile = async ({ page }) => {
|
|
2
4
|
try {
|
|
3
5
|
const elements = await page.locator('[name="cf-turnstile-response"]').all();
|
|
4
6
|
if (elements.length <= 0) {
|
|
7
|
+
const isChallenge = await page.evaluate(() => {
|
|
8
|
+
return document.title.includes('Just a moment') ||
|
|
9
|
+
document.querySelector('#challenge-stage') !== null ||
|
|
10
|
+
document.querySelector('.cf-turnstile') !== null;
|
|
11
|
+
});
|
|
12
|
+
if (!isChallenge)
|
|
13
|
+
return false;
|
|
5
14
|
const coordinates = await page.evaluate(() => {
|
|
6
15
|
let coordinates = [];
|
|
7
16
|
document.querySelectorAll('div').forEach(item => {
|
|
@@ -11,9 +20,9 @@ const checkTurnstile = async ({ page }) => {
|
|
|
11
20
|
if (itemCss.margin == "0px" && itemCss.padding == "0px" && itemCoordinates.width > 290 && itemCoordinates.width <= 310 && !item.querySelector('*')) {
|
|
12
21
|
coordinates.push({ x: itemCoordinates.x, y: item.getBoundingClientRect().y, w: item.getBoundingClientRect().width, h: item.getBoundingClientRect().height });
|
|
13
22
|
}
|
|
14
|
-
}
|
|
23
|
+
}
|
|
24
|
+
catch (err) { }
|
|
15
25
|
});
|
|
16
|
-
|
|
17
26
|
if (coordinates.length <= 0) {
|
|
18
27
|
document.querySelectorAll('div').forEach(item => {
|
|
19
28
|
try {
|
|
@@ -21,28 +30,29 @@ const checkTurnstile = async ({ page }) => {
|
|
|
21
30
|
if (itemCoordinates.width > 290 && itemCoordinates.width <= 310 && !item.querySelector('*')) {
|
|
22
31
|
coordinates.push({ x: itemCoordinates.x, y: item.getBoundingClientRect().y, w: item.getBoundingClientRect().width, h: item.getBoundingClientRect().height });
|
|
23
32
|
}
|
|
24
|
-
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) { }
|
|
25
35
|
});
|
|
26
36
|
}
|
|
27
37
|
return coordinates;
|
|
28
38
|
});
|
|
29
|
-
|
|
30
39
|
for (const item of coordinates) {
|
|
31
40
|
try {
|
|
32
41
|
let x = item.x + 30;
|
|
33
42
|
let y = item.y + item.h / 2;
|
|
34
43
|
await page.mouse.click(x, y);
|
|
35
|
-
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) { }
|
|
36
46
|
}
|
|
37
47
|
return true;
|
|
38
48
|
}
|
|
39
|
-
|
|
40
49
|
for (const element of elements) {
|
|
41
50
|
try {
|
|
42
51
|
// Get the parent element bounding box
|
|
43
52
|
const box = await element.evaluate(el => {
|
|
44
53
|
const parent = el.parentElement;
|
|
45
|
-
if (!parent)
|
|
54
|
+
if (!parent)
|
|
55
|
+
return null;
|
|
46
56
|
const rect = parent.getBoundingClientRect();
|
|
47
57
|
return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
|
|
48
58
|
});
|
|
@@ -51,12 +61,14 @@ const checkTurnstile = async ({ page }) => {
|
|
|
51
61
|
let y = box.y + box.height / 2;
|
|
52
62
|
await page.mouse.click(x, y);
|
|
53
63
|
}
|
|
54
|
-
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) { }
|
|
55
66
|
}
|
|
56
67
|
return true;
|
|
57
|
-
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
58
70
|
return false;
|
|
59
71
|
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
72
|
+
};
|
|
73
|
+
module.exports = { checkTurnstile };
|
|
74
|
+
//# sourceMappingURL=turnstile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnstile.js","sourceRoot":"","sources":["../../../../lib/cjs/module/turnstile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Real Browser MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node src/index.js - Start MCP Server (default)
|
|
7
|
+
* node src/index.js --help - Show help
|
|
8
|
+
* node src/index.js --list - List all available tools
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AA0HH,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
// @ts-nocheck
|
|
4
|
+
/**
|
|
5
|
+
* Real Browser MCP Server
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node src/index.js - Start MCP Server (default)
|
|
9
|
+
* node src/index.js --help - Show help
|
|
10
|
+
* node src/index.js --list - List all available tools
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
const { TOOLS, TOOL_DISPLAY, CATEGORIES } = require('./shared/tools');
|
|
14
|
+
// ANSI colors for terminal
|
|
15
|
+
const colors = {
|
|
16
|
+
reset: '\x1b[0m',
|
|
17
|
+
bright: '\x1b[1m',
|
|
18
|
+
dim: '\x1b[2m',
|
|
19
|
+
green: '\x1b[32m',
|
|
20
|
+
yellow: '\x1b[33m',
|
|
21
|
+
blue: '\x1b[34m',
|
|
22
|
+
magenta: '\x1b[35m',
|
|
23
|
+
cyan: '\x1b[36m',
|
|
24
|
+
red: '\x1b[31m',
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Display help message
|
|
28
|
+
*/
|
|
29
|
+
function showHelp() {
|
|
30
|
+
console.log(`
|
|
31
|
+
${colors.bright}${colors.cyan}🦁 Real Browser MCP Server${colors.reset}
|
|
32
|
+
|
|
33
|
+
${colors.bright}USAGE:${colors.reset}
|
|
34
|
+
node src/index.js [options]
|
|
35
|
+
|
|
36
|
+
${colors.bright}OPTIONS:${colors.reset}
|
|
37
|
+
${colors.yellow}--help, -h${colors.reset} Show this help message
|
|
38
|
+
${colors.yellow}--verbose, -v${colors.reset} Show detailed tool information
|
|
39
|
+
${colors.yellow}--list${colors.reset} List all available tools
|
|
40
|
+
|
|
41
|
+
${colors.bright}EXAMPLES:${colors.reset}
|
|
42
|
+
node src/index.js # Start MCP server
|
|
43
|
+
node src/index.js --list # List all tools
|
|
44
|
+
|
|
45
|
+
${colors.bright}NPM SCRIPTS:${colors.reset}
|
|
46
|
+
npm run dev # Start MCP server
|
|
47
|
+
npm run mcp # Start MCP server only
|
|
48
|
+
|
|
49
|
+
${colors.bright}ARCHITECTURE:${colors.reset}
|
|
50
|
+
${colors.cyan}MCP Server${colors.reset} → STDIO transport → AI Agents (Claude, Cursor, Copilot)
|
|
51
|
+
|
|
52
|
+
${colors.bright}TOOL CATEGORIES (${TOOLS.length} tools):${colors.reset}
|
|
53
|
+
${Object.entries(CATEGORIES).map(([key, cat]) => {
|
|
54
|
+
const count = TOOLS.filter(t => t.category === key).length;
|
|
55
|
+
return ` ${cat.emoji} ${colors.yellow}${cat.name.padEnd(15)}${colors.reset} ${colors.dim}(${count} tools)${colors.reset}`;
|
|
56
|
+
}).join('\n')}
|
|
57
|
+
`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* List all available tools
|
|
61
|
+
*/
|
|
62
|
+
function listTools() {
|
|
63
|
+
console.log(`\n${colors.bright}${colors.cyan}🦁 Available Tools (${TOOLS.length}):${colors.reset}\n`);
|
|
64
|
+
for (const [key, category] of Object.entries(CATEGORIES)) {
|
|
65
|
+
const cat = category;
|
|
66
|
+
const tools = TOOLS.filter(t => t.category === key);
|
|
67
|
+
if (tools.length === 0)
|
|
68
|
+
continue;
|
|
69
|
+
console.log(`${colors.bright}${cat.emoji} ${cat.name}${colors.reset} ${colors.dim}(${tools.length})${colors.reset}`);
|
|
70
|
+
console.log(`${colors.dim}${'─'.repeat(50)}${colors.reset}`);
|
|
71
|
+
for (const tool of tools) {
|
|
72
|
+
console.log(` ${tool.emoji} ${colors.yellow}${tool.name.padEnd(25)}${colors.reset} ${colors.dim}${tool.description.substring(0, 40)}${colors.reset}`);
|
|
73
|
+
}
|
|
74
|
+
console.log('');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Main entry point
|
|
79
|
+
*/
|
|
80
|
+
async function main() {
|
|
81
|
+
const args = process.argv.slice(2);
|
|
82
|
+
// Parse arguments
|
|
83
|
+
const hasHelp = args.includes('--help') || args.includes('-h');
|
|
84
|
+
const hasList = args.includes('--list');
|
|
85
|
+
if (hasHelp) {
|
|
86
|
+
showHelp();
|
|
87
|
+
process.exit(0);
|
|
88
|
+
}
|
|
89
|
+
if (hasList) {
|
|
90
|
+
listTools();
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
console.error('');
|
|
94
|
+
console.error(`${colors.bright}${colors.cyan}╔════════════════════════════════════════════════════════════╗${colors.reset}`);
|
|
95
|
+
console.error(`${colors.bright}${colors.cyan}║${colors.reset} ${colors.bright}${colors.magenta}🦁 Real Browser MCP Server${colors.reset} ${colors.cyan}║${colors.reset}`);
|
|
96
|
+
console.error(`${colors.bright}${colors.cyan}║${colors.reset} ${colors.dim}MCP (AI Agents) Server running on STDIO${colors.reset} ${colors.cyan}║${colors.reset}`);
|
|
97
|
+
console.error(`${colors.bright}${colors.cyan}╚════════════════════════════════════════════════════════════╝${colors.reset}`);
|
|
98
|
+
console.error('');
|
|
99
|
+
console.error(`${colors.bright}${colors.blue}🚀 Starting MCP Server...${colors.reset}`);
|
|
100
|
+
// Import and run MCP server
|
|
101
|
+
require('./mcp/index');
|
|
102
|
+
}
|
|
103
|
+
// Export for programmatic use
|
|
104
|
+
module.exports = {
|
|
105
|
+
TOOLS,
|
|
106
|
+
TOOL_DISPLAY,
|
|
107
|
+
CATEGORIES,
|
|
108
|
+
startMCP: () => require('./mcp/index'),
|
|
109
|
+
startBoth: () => require('./mcp/index'),
|
|
110
|
+
};
|
|
111
|
+
// Run if called directly
|
|
112
|
+
if (require.main === module) {
|
|
113
|
+
main().catch(error => {
|
|
114
|
+
console.error(`${colors.red}❌ Fatal error:${colors.reset}`, error.message);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;AACA,cAAc;AACd;;;;;;;GAOG;;AAEH,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEtE,2BAA2B;AAC3B,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,UAAU;CAChB,CAAC;AAEF;;GAEG;AACH,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;EACZ,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,6BAA6B,MAAM,CAAC,KAAK;;EAEpE,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,KAAK;;;EAGlC,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,KAAK;IAClC,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,KAAK;IACtC,MAAM,CAAC,MAAM,gBAAgB,MAAM,CAAC,KAAK;IACzC,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,KAAK;;EAEpC,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,KAAK;;;;EAIrC,MAAM,CAAC,MAAM,eAAe,MAAM,CAAC,KAAK;;;;EAIxC,MAAM,CAAC,MAAM,gBAAgB,MAAM,CAAC,KAAK;IACvC,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,KAAK;;EAEtC,MAAM,CAAC,MAAM,oBAAoB,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,KAAK;EACpE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAgB,EAAE,EAAE;QAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3D,OAAO,KAAK,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7H,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;GACV,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,uBAAuB,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAEtG,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,MAAM,GAAG,GAAQ,QAAQ,CAAC;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;QACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEjC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACrH,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACzJ,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,iEAAiE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7H,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,6BAA6B,MAAM,CAAC,KAAK,mCAAmC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1M,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,GAAG,0CAA0C,MAAM,CAAC,KAAK,qBAAqB,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACrL,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,iEAAiE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7H,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAElB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,4BAA4B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAExF,4BAA4B;IAC5B,OAAO,CAAC,aAAa,CAAC,CAAC;AACzB,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,OAAO,GAAG;IACf,KAAK;IACL,YAAY;IACZ,UAAU;IACV,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;IACtC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;CACxC,CAAC;AAEF,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,iBAAiB,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const browserHandlers: {
|
|
2
|
+
browser_init(params?: {}): Promise<{
|
|
3
|
+
success: boolean;
|
|
4
|
+
message: string;
|
|
5
|
+
pid: any;
|
|
6
|
+
headless: any;
|
|
7
|
+
blockerEnabled: any;
|
|
8
|
+
}>;
|
|
9
|
+
navigate(params: any): Promise<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
url: string;
|
|
12
|
+
title: string;
|
|
13
|
+
recovered?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
success: boolean;
|
|
16
|
+
url: string;
|
|
17
|
+
title: string;
|
|
18
|
+
recovered: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
wait(params: any): Promise<{
|
|
21
|
+
success: boolean;
|
|
22
|
+
type: any;
|
|
23
|
+
value: any;
|
|
24
|
+
}>;
|
|
25
|
+
browser_close(params?: {}): Promise<{
|
|
26
|
+
success: boolean;
|
|
27
|
+
message: string;
|
|
28
|
+
}>;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/mcp/handlers/browser.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgQ3B,CAAC"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.browserHandlers = void 0;
|
|
4
|
+
const state_1 = require("./state");
|
|
5
|
+
// Auto-generated browser handlers
|
|
6
|
+
exports.browserHandlers = {
|
|
7
|
+
async browser_init(params = {}) {
|
|
8
|
+
(0, state_1.notifyProgress)('browser_init', 'started', 'Initializing browser...');
|
|
9
|
+
const { connect } = require('../../../lib/cjs/index.js');
|
|
10
|
+
// Get headless from params OR environment variable
|
|
11
|
+
const envHeadless = (0, state_1.getHeadlessFromEnv)();
|
|
12
|
+
const headless = params.headless !== undefined ? params.headless : envHeadless;
|
|
13
|
+
const { proxy = {}, turnstile = false, enableBlocker = true } = params;
|
|
14
|
+
(0, state_1.notifyProgress)('browser_init', 'progress', `Mode: ${headless ? 'Headless' : 'GUI (Visible)'}`, { headless });
|
|
15
|
+
const result = await connect({
|
|
16
|
+
headless,
|
|
17
|
+
proxy,
|
|
18
|
+
turnstile,
|
|
19
|
+
enableBlocker,
|
|
20
|
+
});
|
|
21
|
+
state_1.state.browserInstance = result.browser;
|
|
22
|
+
state_1.state.pageInstance = result.page;
|
|
23
|
+
state_1.state.blockerInstance = result.blocker;
|
|
24
|
+
state_1.state.setupPageFn = result.setupPage; // Store CDP early injection function
|
|
25
|
+
// ═══════════════════════════════════════════════════════════════
|
|
26
|
+
// GLOBAL DIALOG HANDLER - Auto-handle dialogs
|
|
27
|
+
// Logic: BLOCK redirects to external sites, ACCEPT everything else
|
|
28
|
+
// ═══════════════════════════════════════════════════════════════
|
|
29
|
+
state_1.state.pageInstance.on('dialog', async (dialog) => {
|
|
30
|
+
const dialogType = dialog.type();
|
|
31
|
+
const msg = dialog.message().toLowerCase();
|
|
32
|
+
(0, state_1.notifyProgress)('browser_init', 'progress', `🔔 Handling dialog: ${dialogType} - ${dialog.message().substring(0, 100)}...`);
|
|
33
|
+
try {
|
|
34
|
+
// Critical Fix: BLOCK redirects to external sites (e.g., eCommittee)
|
|
35
|
+
// These redirects take the user away from the search page
|
|
36
|
+
if (msg.includes('redirect') || msg.includes('external') || msg.includes('leaving')) {
|
|
37
|
+
console.error('🚫 Blocking redirect dialog (Dismiss)');
|
|
38
|
+
await dialog.dismiss(); // Simulate clicking 'Cancel'
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Auto-accept other dialogs (like alerts or simple confirmations)
|
|
42
|
+
await dialog.accept(); // Simulate clicking 'OK'
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
// Ignore errors (dialog might be closed by injected script)
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
// ═══════════════════════════════════════════════════════════════
|
|
50
|
+
// INJECTED SCRIPT - Silent Handling of Popups
|
|
51
|
+
// Override window.confirm/alert to handle them inside the page context
|
|
52
|
+
// Note: Using addInitScript (Playwright) to intercept popups early
|
|
53
|
+
// ═══════════════════════════════════════════════════════════════
|
|
54
|
+
await state_1.state.pageInstance.addInitScript(() => {
|
|
55
|
+
window.originalConfirm = window.confirm;
|
|
56
|
+
window.originalAlert = window.alert;
|
|
57
|
+
// Smart Confirm Handler
|
|
58
|
+
window.confirm = (msg) => {
|
|
59
|
+
console.log('Intercepted Confirm Dialog:', msg);
|
|
60
|
+
if (msg && (msg.toLowerCase().includes('redirect') || msg.toLowerCase().includes('external'))) {
|
|
61
|
+
console.log('🚫 Blocking redirect confirmation inside page');
|
|
62
|
+
return false; // Return FALSE = Click Cancel
|
|
63
|
+
}
|
|
64
|
+
return true; // Return TRUE = Click OK
|
|
65
|
+
};
|
|
66
|
+
// Silently ignore alerts (always OK)
|
|
67
|
+
window.alert = (msg) => {
|
|
68
|
+
console.log('Blocked Alert Dialog:', msg);
|
|
69
|
+
return true;
|
|
70
|
+
};
|
|
71
|
+
// Silently return null for prompts
|
|
72
|
+
window.prompt = (msg) => {
|
|
73
|
+
console.log('Blocked Prompt Dialog:', msg);
|
|
74
|
+
return null;
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
const pid = (typeof state_1.state.browserInstance.process === 'function') ? state_1.state.browserInstance.process()?.pid : null;
|
|
78
|
+
(0, state_1.notifyProgress)('browser_init', 'completed', `Browser started (PID: ${pid})`, {
|
|
79
|
+
headless,
|
|
80
|
+
pid,
|
|
81
|
+
blockerEnabled: enableBlocker
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
success: true,
|
|
85
|
+
message: `Browser initialized in ${headless ? 'headless' : 'GUI'} mode`,
|
|
86
|
+
pid,
|
|
87
|
+
headless,
|
|
88
|
+
blockerEnabled: enableBlocker
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
async navigate(params) {
|
|
92
|
+
const { page } = (0, state_1.requireBrowser)();
|
|
93
|
+
let { url, waitUntil = 'networkidle', timeout = 30000, retries = 2 } = params;
|
|
94
|
+
// Playwright/Patchright wait states: load | domcontentloaded | networkidle | commit
|
|
95
|
+
waitUntil = (0, state_1.resolveWaitUntil)(waitUntil);
|
|
96
|
+
(0, state_1.notifyProgress)('navigate', 'started', `Navigating to: ${url}`);
|
|
97
|
+
// ═══════════════════════════════════════════════════════════════
|
|
98
|
+
// CDP EARLY INJECTION - Setup BEFORE navigation for better ad blocking
|
|
99
|
+
// This ensures CSS and scripts are injected before page scripts run
|
|
100
|
+
// ═══════════════════════════════════════════════════════════════
|
|
101
|
+
console.error('[Navigate] state.setupPageFn available:', !!state_1.state.setupPageFn);
|
|
102
|
+
if (state_1.state.setupPageFn) {
|
|
103
|
+
try {
|
|
104
|
+
await state_1.state.setupPageFn(page);
|
|
105
|
+
(0, state_1.notifyProgress)('navigate', 'progress', 'CDP early injection setup complete');
|
|
106
|
+
console.error('[Navigate] CDP early injection SUCCESS');
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
// Non-critical error, continue navigation
|
|
110
|
+
console.error('[Navigate] CDP early injection failed:', e.message);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.error('[Navigate] No state.setupPageFn available - CDP early injection skipped');
|
|
115
|
+
}
|
|
116
|
+
let lastError = null;
|
|
117
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
118
|
+
try {
|
|
119
|
+
// Wait a bit if this is a retry
|
|
120
|
+
if (attempt > 0) {
|
|
121
|
+
(0, state_1.notifyProgress)('navigate', 'progress', `Retry attempt ${attempt}...`);
|
|
122
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
123
|
+
}
|
|
124
|
+
await page.goto(url, { waitUntil, timeout });
|
|
125
|
+
// Wait for page to stabilize after navigation
|
|
126
|
+
await new Promise(r => setTimeout(r, 500));
|
|
127
|
+
// Try to get title with error handling
|
|
128
|
+
let title = '';
|
|
129
|
+
try {
|
|
130
|
+
title = await page.title();
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
// Title might fail if page is still loading
|
|
134
|
+
title = 'Loading...';
|
|
135
|
+
}
|
|
136
|
+
(0, state_1.notifyProgress)('navigate', 'completed', `Loaded: ${title}`, { url: page.url(), title });
|
|
137
|
+
return {
|
|
138
|
+
success: true,
|
|
139
|
+
url: page.url(),
|
|
140
|
+
title
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
lastError = error;
|
|
145
|
+
// Handle specific errors that might be recoverable
|
|
146
|
+
if (error.message?.includes('Execution context was destroyed') ||
|
|
147
|
+
error.message?.includes('context') ||
|
|
148
|
+
error.message?.includes('Target closed')) {
|
|
149
|
+
(0, state_1.notifyProgress)('navigate', 'progress', `Navigation interrupted (${error.message.substring(0, 50)}...), waiting for page...`);
|
|
150
|
+
// Wait for any ongoing navigation to complete
|
|
151
|
+
try {
|
|
152
|
+
await page.waitForNavigation({ timeout: 5000, waitUntil: 'domcontentloaded' }).catch(() => { });
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
// Ignore timeout
|
|
156
|
+
}
|
|
157
|
+
// Check if we actually landed on the page
|
|
158
|
+
try {
|
|
159
|
+
const currentUrl = page.url();
|
|
160
|
+
if (currentUrl && currentUrl !== 'about:blank') {
|
|
161
|
+
const title = await page.title().catch(() => 'Unknown');
|
|
162
|
+
(0, state_1.notifyProgress)('navigate', 'completed', `Loaded after recovery: ${title}`, { url: currentUrl, title });
|
|
163
|
+
return {
|
|
164
|
+
success: true,
|
|
165
|
+
url: currentUrl,
|
|
166
|
+
title,
|
|
167
|
+
recovered: true
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
// Continue to retry
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Non-recoverable error, throw immediately
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// All retries failed
|
|
182
|
+
(0, state_1.notifyProgress)('navigate', 'error', `Navigation failed after ${retries + 1} attempts: ${lastError?.message}`);
|
|
183
|
+
throw lastError || new Error('Navigation failed');
|
|
184
|
+
},
|
|
185
|
+
async wait(params) {
|
|
186
|
+
const { page } = (0, state_1.requireBrowser)();
|
|
187
|
+
const { type = 'timeout', value, timeout = 30000 } = params;
|
|
188
|
+
(0, state_1.notifyProgress)('wait', 'started', `Waiting for ${type}: ${value}`);
|
|
189
|
+
switch (type) {
|
|
190
|
+
case 'selector':
|
|
191
|
+
await page.waitForSelector(value, { timeout });
|
|
192
|
+
break;
|
|
193
|
+
case 'navigation':
|
|
194
|
+
await page.waitForNavigation({ timeout });
|
|
195
|
+
break;
|
|
196
|
+
case 'networkidle':
|
|
197
|
+
await page.waitForLoadState('networkidle', { timeout });
|
|
198
|
+
break;
|
|
199
|
+
case 'timeout':
|
|
200
|
+
default:
|
|
201
|
+
await new Promise(r => setTimeout(r, parseInt(value) || 1000));
|
|
202
|
+
}
|
|
203
|
+
(0, state_1.notifyProgress)('wait', 'completed', `Wait completed: ${type}`, { type, value });
|
|
204
|
+
return { success: true, type, value };
|
|
205
|
+
},
|
|
206
|
+
async browser_close(params = {}) {
|
|
207
|
+
const { force = false } = params;
|
|
208
|
+
(0, state_1.notifyProgress)('browser_close', 'started', 'Closing browser...');
|
|
209
|
+
if (state_1.state.browserInstance) {
|
|
210
|
+
try {
|
|
211
|
+
await state_1.state.browserInstance.close();
|
|
212
|
+
(0, state_1.notifyProgress)('browser_close', 'progress', 'Browser closed gracefully');
|
|
213
|
+
}
|
|
214
|
+
catch (e) {
|
|
215
|
+
if (force) {
|
|
216
|
+
if (typeof state_1.state.browserInstance.process === 'function') {
|
|
217
|
+
state_1.state.browserInstance.process()?.kill('SIGKILL');
|
|
218
|
+
}
|
|
219
|
+
(0, state_1.notifyProgress)('browser_close', 'progress', 'Browser force killed');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
state_1.state.browserInstance = null;
|
|
223
|
+
state_1.state.pageInstance = null;
|
|
224
|
+
state_1.state.blockerInstance = null;
|
|
225
|
+
state_1.state.setupPageFn = null;
|
|
226
|
+
}
|
|
227
|
+
(0, state_1.notifyProgress)('browser_close', 'completed', 'Browser closed');
|
|
228
|
+
return { success: true, message: 'Browser closed' };
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../../src/mcp/handlers/browser.ts"],"names":[],"mappings":"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"}
|