openchrome-mcp 1.2.2 → 1.2.4
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 +11 -4
- package/dist/cdp/client.d.ts +2 -2
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +4 -2
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/connection-pool.d.ts +2 -2
- package/dist/cdp/connection-pool.d.ts.map +1 -1
- package/dist/cdp/connection-pool.js +2 -1
- package/dist/cdp/connection-pool.js.map +1 -1
- package/dist/cdp/screenshot-scheduler.d.ts.map +1 -1
- package/dist/cdp/screenshot-scheduler.js +2 -1
- package/dist/cdp/screenshot-scheduler.js.map +1 -1
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +2 -1
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/config/defaults.d.ts +24 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +24 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/dom/dom-serializer.d.ts.map +1 -1
- package/dist/dom/dom-serializer.js +10 -5
- package/dist/dom/dom-serializer.js.map +1 -1
- package/dist/hints/hint-engine.d.ts +1 -0
- package/dist/hints/hint-engine.d.ts.map +1 -1
- package/dist/hints/hint-engine.js +30 -6
- package/dist/hints/hint-engine.js.map +1 -1
- package/dist/hints/rules/composite-suggestions.d.ts.map +1 -1
- package/dist/hints/rules/composite-suggestions.js +37 -0
- package/dist/hints/rules/composite-suggestions.js.map +1 -1
- package/dist/hints/rules/error-recovery.d.ts.map +1 -1
- package/dist/hints/rules/error-recovery.js +7 -3
- package/dist/hints/rules/error-recovery.js.map +1 -1
- package/dist/hints/rules/pagination-detection.d.ts +7 -0
- package/dist/hints/rules/pagination-detection.d.ts.map +1 -0
- package/dist/hints/rules/pagination-detection.js +220 -0
- package/dist/hints/rules/pagination-detection.js.map +1 -0
- package/dist/hints/rules/repetition-detection.d.ts.map +1 -1
- package/dist/hints/rules/repetition-detection.js +152 -0
- package/dist/hints/rules/repetition-detection.js.map +1 -1
- package/dist/hints/rules/sequence-detection.d.ts.map +1 -1
- package/dist/hints/rules/sequence-detection.js +23 -2
- package/dist/hints/rules/sequence-detection.js.map +1 -1
- package/dist/hints/rules/success-hints.d.ts.map +1 -1
- package/dist/hints/rules/success-hints.js +5 -1
- package/dist/hints/rules/success-hints.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +15 -16
- package/dist/mcp-server.js.map +1 -1
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +2 -1
- package/dist/session-manager.js.map +1 -1
- package/dist/tools/batch-execute.d.ts.map +1 -1
- package/dist/tools/batch-execute.js +0 -2
- package/dist/tools/batch-execute.js.map +1 -1
- package/dist/tools/batch-paginate.d.ts +10 -0
- package/dist/tools/batch-paginate.d.ts.map +1 -0
- package/dist/tools/batch-paginate.js +419 -0
- package/dist/tools/batch-paginate.js.map +1 -0
- package/dist/tools/click-element.d.ts.map +1 -1
- package/dist/tools/click-element.js +16 -21
- package/dist/tools/click-element.js.map +1 -1
- package/dist/tools/computer.d.ts.map +1 -1
- package/dist/tools/computer.js +232 -61
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/console-capture.d.ts.map +1 -1
- package/dist/tools/console-capture.js +1 -6
- package/dist/tools/console-capture.js.map +1 -1
- package/dist/tools/cookies.d.ts.map +1 -1
- package/dist/tools/cookies.js +1 -6
- package/dist/tools/cookies.js.map +1 -1
- package/dist/tools/emulate-device.d.ts.map +1 -1
- package/dist/tools/emulate-device.js +1 -3
- package/dist/tools/emulate-device.js.map +1 -1
- package/dist/tools/fill-form.d.ts.map +1 -1
- package/dist/tools/fill-form.js +129 -134
- package/dist/tools/fill-form.js.map +1 -1
- package/dist/tools/form-input.d.ts.map +1 -1
- package/dist/tools/form-input.js +47 -46
- package/dist/tools/form-input.js.map +1 -1
- package/dist/tools/geolocation.d.ts.map +1 -1
- package/dist/tools/geolocation.js +1 -3
- package/dist/tools/geolocation.js.map +1 -1
- package/dist/tools/http-auth.d.ts.map +1 -1
- package/dist/tools/http-auth.js +1 -5
- package/dist/tools/http-auth.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/javascript.d.ts.map +1 -1
- package/dist/tools/javascript.js +3 -8
- package/dist/tools/javascript.js.map +1 -1
- package/dist/tools/lightweight-scroll.d.ts.map +1 -1
- package/dist/tools/lightweight-scroll.js +1 -5
- package/dist/tools/lightweight-scroll.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +5 -7
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/network.d.ts.map +1 -1
- package/dist/tools/network.js +1 -4
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/page-reload.d.ts.map +1 -1
- package/dist/tools/page-reload.js +3 -2
- package/dist/tools/page-reload.js.map +1 -1
- package/dist/tools/read-page.d.ts.map +1 -1
- package/dist/tools/read-page.js +41 -6
- package/dist/tools/read-page.js.map +1 -1
- package/dist/tools/request-intercept.d.ts.map +1 -1
- package/dist/tools/request-intercept.js +1 -11
- package/dist/tools/request-intercept.js.map +1 -1
- package/dist/tools/storage.d.ts.map +1 -1
- package/dist/tools/storage.js +1 -7
- package/dist/tools/storage.js.map +1 -1
- package/dist/tools/tabs-close.js +1 -1
- package/dist/tools/tabs-close.js.map +1 -1
- package/dist/tools/tabs-create.js +1 -1
- package/dist/tools/tabs-create.js.map +1 -1
- package/dist/tools/user-agent.d.ts.map +1 -1
- package/dist/tools/user-agent.js +1 -3
- package/dist/tools/user-agent.js.map +1 -1
- package/dist/tools/wait-and-click.d.ts.map +1 -1
- package/dist/tools/wait-and-click.js +5 -10
- package/dist/tools/wait-and-click.js.map +1 -1
- package/dist/tools/wait-for.d.ts.map +1 -1
- package/dist/tools/wait-for.js +1 -7
- package/dist/tools/wait-for.js.map +1 -1
- package/dist/tools/xpath-query.d.ts.map +1 -1
- package/dist/tools/xpath-query.js +1 -6
- package/dist/tools/xpath-query.js.map +1 -1
- package/dist/utils/dom-delta.d.ts +29 -0
- package/dist/utils/dom-delta.d.ts.map +1 -0
- package/dist/utils/dom-delta.js +262 -0
- package/dist/utils/dom-delta.js.map +1 -0
- package/dist/utils/pagination-detector.d.ts +22 -0
- package/dist/utils/pagination-detector.d.ts.map +1 -0
- package/dist/utils/pagination-detector.js +292 -0
- package/dist/utils/pagination-detector.js.map +1 -0
- package/dist/utils/smart-goto.d.ts.map +1 -1
- package/dist/utils/smart-goto.js +2 -1
- package/dist/utils/smart-goto.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-execute.d.ts","sourceRoot":"","sources":["../../src/tools/batch-execute.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"batch-execute.d.ts","sourceRoot":"","sources":["../../src/tools/batch-execute.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAsP1C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEhE"}
|
|
@@ -13,8 +13,6 @@ const session_manager_1 = require("../session-manager");
|
|
|
13
13
|
const definition = {
|
|
14
14
|
name: 'batch_execute',
|
|
15
15
|
description: 'Execute JavaScript code across multiple tabs in parallel. Returns results from all tabs. ' +
|
|
16
|
-
'Use this instead of spawning separate agents when you need to run the same or similar ' +
|
|
17
|
-
'data extraction scripts across many tabs simultaneously. ' +
|
|
18
16
|
'Each task specifies a tabId and a JavaScript snippet to execute.',
|
|
19
17
|
inputSchema: {
|
|
20
18
|
type: 'object',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-execute.js","sourceRoot":"","sources":["../../src/tools/batch-execute.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;
|
|
1
|
+
{"version":3,"file":"batch-execute.js","sourceRoot":"","sources":["../../src/tools/batch-execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Paginate Tool - Capture multiple pages from a paginated viewer in a single MCP call
|
|
3
|
+
*
|
|
4
|
+
* Eliminates N LLM round-trips by executing the pagination loop server-side.
|
|
5
|
+
* Supports keyboard navigation, click-based pagination, URL-based parallel extraction,
|
|
6
|
+
* and infinite scroll.
|
|
7
|
+
*/
|
|
8
|
+
import { MCPServer } from '../mcp-server';
|
|
9
|
+
export declare function registerBatchPaginateTool(server: MCPServer): void;
|
|
10
|
+
//# sourceMappingURL=batch-paginate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-paginate.d.ts","sourceRoot":"","sources":["../../src/tools/batch-paginate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAke1C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEjE"}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Batch Paginate Tool - Capture multiple pages from a paginated viewer in a single MCP call
|
|
4
|
+
*
|
|
5
|
+
* Eliminates N LLM round-trips by executing the pagination loop server-side.
|
|
6
|
+
* Supports keyboard navigation, click-based pagination, URL-based parallel extraction,
|
|
7
|
+
* and infinite scroll.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.registerBatchPaginateTool = registerBatchPaginateTool;
|
|
11
|
+
const session_manager_1 = require("../session-manager");
|
|
12
|
+
const defaults_1 = require("../config/defaults");
|
|
13
|
+
const definition = {
|
|
14
|
+
name: 'batch_paginate',
|
|
15
|
+
description: 'Extract content from multiple pages of a paginated viewer (PDF, slides, articles) in a single call. ' +
|
|
16
|
+
'Supports keyboard navigation, click-based pagination, URL-based parallel extraction, and infinite scroll.',
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
tabId: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Tab ID of the paginated viewer',
|
|
23
|
+
},
|
|
24
|
+
strategy: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
enum: ['keyboard', 'click', 'url', 'scroll'],
|
|
27
|
+
description: 'Pagination strategy: "keyboard" (ArrowRight/ArrowDown), "click" (CSS selector), "url" (parallel multi-tab), "scroll" (infinite scroll)',
|
|
28
|
+
},
|
|
29
|
+
totalPages: {
|
|
30
|
+
type: 'number',
|
|
31
|
+
description: 'Total number of pages to capture. Required for keyboard/click strategies.',
|
|
32
|
+
},
|
|
33
|
+
startPage: {
|
|
34
|
+
type: 'number',
|
|
35
|
+
description: 'Starting page number (default: 1). Useful when resuming from a specific page.',
|
|
36
|
+
},
|
|
37
|
+
captureMode: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
enum: ['screenshot', 'text', 'dom', 'both'],
|
|
40
|
+
description: 'What to capture per page: "screenshot" (base64 image), "text" (accessibility text), "dom" (compact DOM), "both" (screenshot + text). Default: "text".',
|
|
41
|
+
},
|
|
42
|
+
keyAction: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
description: '(keyboard strategy) Key to press for next page. Default: "ArrowRight".',
|
|
45
|
+
},
|
|
46
|
+
nextSelector: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: '(click strategy) CSS selector for the "next page" button.',
|
|
49
|
+
},
|
|
50
|
+
urlTemplate: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
description: '(url strategy) URL template with {N}, {page}, or {offset} placeholder for page number, e.g. "https://example.com/page/{N}".',
|
|
53
|
+
},
|
|
54
|
+
waitBetweenPages: {
|
|
55
|
+
type: 'number',
|
|
56
|
+
description: 'Milliseconds to wait between page transitions for rendering. Default: 500.',
|
|
57
|
+
},
|
|
58
|
+
scrollAmount: {
|
|
59
|
+
type: 'number',
|
|
60
|
+
description: '(scroll strategy) Viewport heights to scroll per step. Default: 1.',
|
|
61
|
+
},
|
|
62
|
+
maxScrolls: {
|
|
63
|
+
type: 'number',
|
|
64
|
+
description: '(scroll strategy) Maximum number of scroll steps. Default: 50.',
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
required: ['tabId', 'strategy'],
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Simple concurrency limiter
|
|
72
|
+
*/
|
|
73
|
+
function createLimiter(concurrency) {
|
|
74
|
+
let active = 0;
|
|
75
|
+
const queue = [];
|
|
76
|
+
return async function (fn) {
|
|
77
|
+
if (active >= concurrency) {
|
|
78
|
+
await new Promise((resolve) => queue.push(resolve));
|
|
79
|
+
}
|
|
80
|
+
active++;
|
|
81
|
+
try {
|
|
82
|
+
return await fn();
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
active--;
|
|
86
|
+
if (queue.length > 0) {
|
|
87
|
+
const next = queue.shift();
|
|
88
|
+
next();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const handler = async (sessionId, args) => {
|
|
94
|
+
const tabId = args.tabId;
|
|
95
|
+
const strategy = args.strategy;
|
|
96
|
+
const totalPages = args.totalPages;
|
|
97
|
+
const startPage = args.startPage || 1;
|
|
98
|
+
const captureMode = args.captureMode || 'text';
|
|
99
|
+
const keyAction = args.keyAction || 'ArrowRight';
|
|
100
|
+
const nextSelector = args.nextSelector;
|
|
101
|
+
const urlTemplate = args.urlTemplate;
|
|
102
|
+
const waitBetweenPages = args.waitBetweenPages ?? 500;
|
|
103
|
+
const scrollAmount = args.scrollAmount || 1;
|
|
104
|
+
const maxScrolls = args.maxScrolls || 50;
|
|
105
|
+
if (!tabId) {
|
|
106
|
+
return {
|
|
107
|
+
content: [{ type: 'text', text: 'Error: tabId is required' }],
|
|
108
|
+
isError: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (!strategy) {
|
|
112
|
+
return {
|
|
113
|
+
content: [{ type: 'text', text: 'Error: strategy is required' }],
|
|
114
|
+
isError: true,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Validate strategy-specific params
|
|
118
|
+
if ((strategy === 'keyboard' || strategy === 'click') && !totalPages) {
|
|
119
|
+
return {
|
|
120
|
+
content: [
|
|
121
|
+
{
|
|
122
|
+
type: 'text',
|
|
123
|
+
text: `Error: totalPages is required for strategy "${strategy}"`,
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
isError: true,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
if (strategy === 'click' && !nextSelector) {
|
|
130
|
+
return {
|
|
131
|
+
content: [{ type: 'text', text: 'Error: nextSelector is required for strategy "click"' }],
|
|
132
|
+
isError: true,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (strategy === 'url' && !urlTemplate) {
|
|
136
|
+
return {
|
|
137
|
+
content: [{ type: 'text', text: 'Error: urlTemplate is required for strategy "url"' }],
|
|
138
|
+
isError: true,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (strategy === 'url' && !totalPages) {
|
|
142
|
+
return {
|
|
143
|
+
content: [{ type: 'text', text: 'Error: totalPages is required for strategy "url"' }],
|
|
144
|
+
isError: true,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
148
|
+
const startTime = Date.now();
|
|
149
|
+
const pages = [];
|
|
150
|
+
/**
|
|
151
|
+
* Capture content from the current page state
|
|
152
|
+
*/
|
|
153
|
+
async function capturePageContent(page, pageNumber) {
|
|
154
|
+
const result = { pageNumber };
|
|
155
|
+
try {
|
|
156
|
+
if (captureMode === 'screenshot' || captureMode === 'both') {
|
|
157
|
+
try {
|
|
158
|
+
const cdpSession = await page.target().createCDPSession();
|
|
159
|
+
try {
|
|
160
|
+
const { data } = await cdpSession.send('Page.captureScreenshot', {
|
|
161
|
+
format: 'webp',
|
|
162
|
+
quality: defaults_1.DEFAULT_SCREENSHOT_QUALITY,
|
|
163
|
+
optimizeForSpeed: true,
|
|
164
|
+
});
|
|
165
|
+
result.screenshot = data;
|
|
166
|
+
result.screenshotMimeType = 'image/webp';
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
await cdpSession.detach().catch(() => { });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Fallback to Puppeteer PNG
|
|
174
|
+
const screenshotData = await page.screenshot({ encoding: 'base64', type: 'png' });
|
|
175
|
+
result.screenshot = screenshotData;
|
|
176
|
+
result.screenshotMimeType = 'image/png';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (captureMode === 'text' || captureMode === 'both') {
|
|
180
|
+
result.text = await page.evaluate(() => document.body.innerText);
|
|
181
|
+
}
|
|
182
|
+
if (captureMode === 'dom') {
|
|
183
|
+
const rawHtml = await page.evaluate(() => document.body.innerHTML);
|
|
184
|
+
// Trim to avoid huge payloads
|
|
185
|
+
result.dom = rawHtml.length > defaults_1.MAX_OUTPUT_CHARS ? rawHtml.slice(0, defaults_1.MAX_OUTPUT_CHARS) + '...[truncated]' : rawHtml;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
result.error = err instanceof Error ? err.message : String(err);
|
|
190
|
+
}
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
// ----------------------------------------------------------------
|
|
195
|
+
// KEYBOARD STRATEGY
|
|
196
|
+
// ----------------------------------------------------------------
|
|
197
|
+
if (strategy === 'keyboard') {
|
|
198
|
+
const page = await sessionManager.getPage(sessionId, tabId, undefined, 'batch_paginate');
|
|
199
|
+
if (!page) {
|
|
200
|
+
return {
|
|
201
|
+
content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
|
|
202
|
+
isError: true,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
let failureCount = 0;
|
|
206
|
+
for (let i = startPage; i <= totalPages; i++) {
|
|
207
|
+
const pageResult = await capturePageContent(page, i);
|
|
208
|
+
pages.push(pageResult);
|
|
209
|
+
if (pageResult.error) {
|
|
210
|
+
failureCount++;
|
|
211
|
+
if (failureCount >= (totalPages - startPage + 1) * 0.5) {
|
|
212
|
+
// More than 50% failing, abort early
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Navigate to next page (don't press on last page)
|
|
217
|
+
if (i < totalPages) {
|
|
218
|
+
await page.keyboard.press(keyAction);
|
|
219
|
+
await new Promise((r) => setTimeout(r, waitBetweenPages));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ----------------------------------------------------------------
|
|
224
|
+
// CLICK STRATEGY
|
|
225
|
+
// ----------------------------------------------------------------
|
|
226
|
+
else if (strategy === 'click') {
|
|
227
|
+
const page = await sessionManager.getPage(sessionId, tabId, undefined, 'batch_paginate');
|
|
228
|
+
if (!page) {
|
|
229
|
+
return {
|
|
230
|
+
content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
|
|
231
|
+
isError: true,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
let failureCount = 0;
|
|
235
|
+
for (let i = startPage; i <= totalPages; i++) {
|
|
236
|
+
const pageResult = await capturePageContent(page, i);
|
|
237
|
+
pages.push(pageResult);
|
|
238
|
+
if (pageResult.error) {
|
|
239
|
+
failureCount++;
|
|
240
|
+
if (failureCount >= (totalPages - startPage + 1) * 0.5) {
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Click next button (don't click on last page)
|
|
245
|
+
if (i < totalPages) {
|
|
246
|
+
try {
|
|
247
|
+
const nextButton = await page.$(nextSelector);
|
|
248
|
+
if (!nextButton) {
|
|
249
|
+
pages.push({
|
|
250
|
+
pageNumber: i + 1,
|
|
251
|
+
error: `Next button selector "${nextSelector}" not found on page ${i}`,
|
|
252
|
+
});
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
await nextButton.click();
|
|
256
|
+
await new Promise((r) => setTimeout(r, waitBetweenPages));
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
pages.push({
|
|
260
|
+
pageNumber: i + 1,
|
|
261
|
+
error: `Failed to click next button: ${err instanceof Error ? err.message : String(err)}`,
|
|
262
|
+
});
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// ----------------------------------------------------------------
|
|
269
|
+
// SCROLL STRATEGY (infinite scroll)
|
|
270
|
+
// ----------------------------------------------------------------
|
|
271
|
+
else if (strategy === 'scroll') {
|
|
272
|
+
const page = await sessionManager.getPage(sessionId, tabId, undefined, 'batch_paginate');
|
|
273
|
+
if (!page) {
|
|
274
|
+
return {
|
|
275
|
+
content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
|
|
276
|
+
isError: true,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
let lastScrollHeight = await page.evaluate(() => document.documentElement.scrollHeight);
|
|
280
|
+
let stepNumber = 1;
|
|
281
|
+
// Capture initial view
|
|
282
|
+
const initialResult = await capturePageContent(page, stepNumber);
|
|
283
|
+
pages.push(initialResult);
|
|
284
|
+
for (let step = 1; step <= maxScrolls; step++) {
|
|
285
|
+
// Scroll and measure in a single CDP round-trip
|
|
286
|
+
const { newScrollHeight, atBottom } = await page.evaluate((amount) => {
|
|
287
|
+
window.scrollBy(0, window.innerHeight * amount);
|
|
288
|
+
const scrollHeight = document.documentElement.scrollHeight;
|
|
289
|
+
const scrollTop = window.scrollY;
|
|
290
|
+
const viewportHeight = window.innerHeight;
|
|
291
|
+
return {
|
|
292
|
+
newScrollHeight: scrollHeight,
|
|
293
|
+
atBottom: scrollTop + viewportHeight >= scrollHeight - 10,
|
|
294
|
+
};
|
|
295
|
+
}, scrollAmount);
|
|
296
|
+
await new Promise((r) => setTimeout(r, waitBetweenPages));
|
|
297
|
+
stepNumber++;
|
|
298
|
+
const stepResult = await capturePageContent(page, stepNumber);
|
|
299
|
+
pages.push(stepResult);
|
|
300
|
+
// Stop if reached bottom and height didn't change
|
|
301
|
+
if (atBottom && newScrollHeight === lastScrollHeight) {
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
lastScrollHeight = newScrollHeight;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// ----------------------------------------------------------------
|
|
308
|
+
// URL STRATEGY (parallel multi-tab)
|
|
309
|
+
// ----------------------------------------------------------------
|
|
310
|
+
else if (strategy === 'url') {
|
|
311
|
+
const limiter = createLimiter(5); // max 5 parallel tabs
|
|
312
|
+
const pageNumbers = Array.from({ length: totalPages - startPage + 1 }, (_, i) => startPage + i);
|
|
313
|
+
const urlResults = await Promise.all(pageNumbers.map((pageNum) => limiter(async () => {
|
|
314
|
+
const url = urlTemplate.replace(/\{N\}|\{page\}|\{offset\}/g, String(pageNum));
|
|
315
|
+
let newTabId = null;
|
|
316
|
+
try {
|
|
317
|
+
// Create a new tab for this page
|
|
318
|
+
const { targetId, page: newPage } = await sessionManager.createTarget(sessionId, url);
|
|
319
|
+
newTabId = targetId;
|
|
320
|
+
// Wait for page to settle
|
|
321
|
+
await new Promise((r) => setTimeout(r, waitBetweenPages));
|
|
322
|
+
const result = await capturePageContent(newPage, pageNum);
|
|
323
|
+
// Close the tab
|
|
324
|
+
await sessionManager.closeTarget(sessionId, targetId);
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
catch (err) {
|
|
328
|
+
// Attempt cleanup if tab was created
|
|
329
|
+
if (newTabId) {
|
|
330
|
+
try {
|
|
331
|
+
await sessionManager.closeTarget(sessionId, newTabId);
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// ignore cleanup errors
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
pageNumber: pageNum,
|
|
339
|
+
error: err instanceof Error ? err.message : String(err),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
})));
|
|
343
|
+
// Sort by page number (parallel execution may deliver out-of-order)
|
|
344
|
+
urlResults.sort((a, b) => a.pageNumber - b.pageNumber);
|
|
345
|
+
pages.push(...urlResults);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
return {
|
|
349
|
+
content: [
|
|
350
|
+
{
|
|
351
|
+
type: 'text',
|
|
352
|
+
text: `Error: Unknown strategy "${strategy}". Must be one of: keyboard, click, url, scroll`,
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
isError: true,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
const durationMs = Date.now() - startTime;
|
|
359
|
+
const capturedCount = pages.filter((p) => !p.error).length;
|
|
360
|
+
const failedCount = pages.filter((p) => p.error).length;
|
|
361
|
+
const estimatedSequentialMs = capturedCount * 5000; // rough 5s per round-trip estimate
|
|
362
|
+
const savedMs = Math.max(0, estimatedSequentialMs - durationMs);
|
|
363
|
+
// Build summary text
|
|
364
|
+
const summaryText = capturedCount > 0
|
|
365
|
+
? `Captured ${capturedCount} pages in ${(durationMs / 1000).toFixed(1)}s` +
|
|
366
|
+
(savedMs > 1000
|
|
367
|
+
? ` (vs ~${(estimatedSequentialMs / 1000).toFixed(0)}s sequential — saved ~${(savedMs / 1000).toFixed(0)}s)`
|
|
368
|
+
: '')
|
|
369
|
+
: `No pages captured`;
|
|
370
|
+
// For large screenshot sets, omit the actual data and note it's available
|
|
371
|
+
const tooManyScreenshots = (captureMode === 'screenshot' || captureMode === 'both') && capturedCount > 10;
|
|
372
|
+
const pagesForOutput = tooManyScreenshots
|
|
373
|
+
? pages.map((p) => ({
|
|
374
|
+
...p,
|
|
375
|
+
screenshot: p.screenshot ? '[screenshot omitted — >10 pages]' : undefined,
|
|
376
|
+
}))
|
|
377
|
+
: pages;
|
|
378
|
+
const output = {
|
|
379
|
+
totalCaptured: capturedCount,
|
|
380
|
+
totalFailed: failedCount,
|
|
381
|
+
strategy,
|
|
382
|
+
captureMode,
|
|
383
|
+
durationMs,
|
|
384
|
+
summary: summaryText,
|
|
385
|
+
pages: pagesForOutput,
|
|
386
|
+
};
|
|
387
|
+
const content = [
|
|
388
|
+
{ type: 'text', text: JSON.stringify(output, null, 2) },
|
|
389
|
+
];
|
|
390
|
+
// Include screenshots inline only when count is manageable
|
|
391
|
+
if ((captureMode === 'screenshot' || captureMode === 'both') && !tooManyScreenshots) {
|
|
392
|
+
for (const p of pages) {
|
|
393
|
+
if (p.screenshot) {
|
|
394
|
+
content.push({
|
|
395
|
+
type: 'image',
|
|
396
|
+
data: p.screenshot,
|
|
397
|
+
mimeType: p.screenshotMimeType ?? 'image/webp',
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return { content };
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
return {
|
|
406
|
+
content: [
|
|
407
|
+
{
|
|
408
|
+
type: 'text',
|
|
409
|
+
text: `batch_paginate error: ${error instanceof Error ? error.message : String(error)}`,
|
|
410
|
+
},
|
|
411
|
+
],
|
|
412
|
+
isError: true,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
function registerBatchPaginateTool(server) {
|
|
417
|
+
server.registerTool('batch_paginate', handler, definition);
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=batch-paginate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-paginate.js","sourceRoot":"","sources":["../../src/tools/batch-paginate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"click-element.d.ts","sourceRoot":"","sources":["../../src/tools/click-element.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"click-element.d.ts","sourceRoot":"","sources":["../../src/tools/click-element.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAsgB1C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEhE"}
|
|
@@ -8,16 +8,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
8
8
|
exports.registerClickElementTool = registerClickElementTool;
|
|
9
9
|
const session_manager_1 = require("../session-manager");
|
|
10
10
|
const ref_id_manager_1 = require("../utils/ref-id-manager");
|
|
11
|
+
const defaults_1 = require("../config/defaults");
|
|
12
|
+
const dom_delta_1 = require("../utils/dom-delta");
|
|
11
13
|
const definition = {
|
|
12
14
|
name: 'click_element',
|
|
13
|
-
description:
|
|
14
|
-
This is more efficient than calling find + computer(click) separately.
|
|
15
|
-
Returns the clicked element's info and optionally a verification screenshot.
|
|
16
|
-
|
|
17
|
-
Examples:
|
|
18
|
-
- click_element(query: "Login button")
|
|
19
|
-
- click_element(query: "Submit", wait_after: 1000)
|
|
20
|
-
- click_element(query: "Admin radio button", verify: true)`,
|
|
15
|
+
description: 'Find an element by natural language query and click it in one operation. Returns the clicked element info and optionally a verification screenshot.',
|
|
21
16
|
inputSchema: {
|
|
22
17
|
type: 'object',
|
|
23
18
|
properties: {
|
|
@@ -379,29 +374,29 @@ const handler = async (sessionId, args) => {
|
|
|
379
374
|
}
|
|
380
375
|
const finalX = Math.round(bestMatch.rect.x);
|
|
381
376
|
const finalY = Math.round(bestMatch.rect.y);
|
|
382
|
-
// Perform the click
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
377
|
+
// Perform the click with DOM delta capture (settleMs includes waitAfter)
|
|
378
|
+
const { delta } = await (0, dom_delta_1.withDomDelta)(page, async () => {
|
|
379
|
+
if (doubleClick) {
|
|
380
|
+
await page.mouse.click(finalX, finalY, { clickCount: 2 });
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
await page.mouse.click(finalX, finalY);
|
|
384
|
+
}
|
|
385
|
+
}, { settleMs: Math.max(150, waitAfter) });
|
|
391
386
|
// Generate ref for the clicked element
|
|
392
387
|
let refId = '';
|
|
393
388
|
if (bestMatch.backendDOMNodeId) {
|
|
394
389
|
refId = refIdManager.generateRef(sessionId, tabId, bestMatch.backendDOMNodeId, bestMatch.role, bestMatch.name);
|
|
395
390
|
}
|
|
396
391
|
const clickType = doubleClick ? 'Double-clicked' : 'Clicked';
|
|
397
|
-
const resultText = `${clickType} ${bestMatch.role} "${bestMatch.name.slice(0, 50)}" at (${finalX}, ${finalY})${refId ? ` [${refId}]` : ''}`;
|
|
392
|
+
const resultText = `${clickType} ${bestMatch.role} "${bestMatch.name.slice(0, 50)}" at (${finalX}, ${finalY})${refId ? ` [${refId}]` : ''}${delta}`;
|
|
398
393
|
// Optional verification screenshot — WebP via CDP for speed and consistency
|
|
399
394
|
if (verify) {
|
|
400
395
|
try {
|
|
401
396
|
const cdpSession = await page.target().createCDPSession();
|
|
402
397
|
const { data } = await cdpSession.send('Page.captureScreenshot', {
|
|
403
398
|
format: 'webp',
|
|
404
|
-
quality:
|
|
399
|
+
quality: defaults_1.DEFAULT_SCREENSHOT_QUALITY,
|
|
405
400
|
optimizeForSpeed: true,
|
|
406
401
|
});
|
|
407
402
|
await cdpSession.detach();
|
|
@@ -421,8 +416,8 @@ const handler = async (sessionId, args) => {
|
|
|
421
416
|
clip: {
|
|
422
417
|
x: 0,
|
|
423
418
|
y: 0,
|
|
424
|
-
width: Math.min(page.viewport()?.width ||
|
|
425
|
-
height: Math.min(page.viewport()?.height ||
|
|
419
|
+
width: Math.min(page.viewport()?.width || defaults_1.DEFAULT_VIEWPORT.width, defaults_1.DEFAULT_VIEWPORT.width),
|
|
420
|
+
height: Math.min(page.viewport()?.height || defaults_1.DEFAULT_VIEWPORT.height, defaults_1.DEFAULT_VIEWPORT.height),
|
|
426
421
|
},
|
|
427
422
|
});
|
|
428
423
|
return {
|