openchrome-mcp 1.9.0 → 1.9.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 +55 -1
- package/dist/cdp/client.d.ts +6 -0
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +13 -0
- package/dist/cdp/client.js.map +1 -1
- package/dist/chrome/headed-fallback.d.ts +3 -0
- package/dist/chrome/headed-fallback.d.ts.map +1 -1
- package/dist/chrome/headed-fallback.js +4 -0
- package/dist/chrome/headed-fallback.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/config/global.d.ts +1 -0
- package/dist/config/global.d.ts.map +1 -1
- package/dist/config/global.js.map +1 -1
- package/dist/config/tool-tiers.d.ts.map +1 -1
- package/dist/config/tool-tiers.js +3 -0
- package/dist/config/tool-tiers.js.map +1 -1
- package/dist/connect/clipboard.d.ts +6 -0
- package/dist/connect/clipboard.d.ts.map +1 -0
- package/dist/connect/clipboard.js +54 -0
- package/dist/connect/clipboard.js.map +1 -0
- package/dist/connect/config-generator.d.ts +9 -0
- package/dist/connect/config-generator.d.ts.map +1 -0
- package/dist/connect/config-generator.js +43 -0
- package/dist/connect/config-generator.js.map +1 -0
- package/dist/connect/hosts.d.ts +9 -0
- package/dist/connect/hosts.d.ts.map +1 -0
- package/dist/connect/hosts.js +81 -0
- package/dist/connect/hosts.js.map +1 -0
- package/dist/connect/index.d.ts +8 -0
- package/dist/connect/index.d.ts.map +1 -0
- package/dist/connect/index.js +15 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/open-url.d.ts +6 -0
- package/dist/connect/open-url.d.ts.map +1 -0
- package/dist/connect/open-url.js +42 -0
- package/dist/connect/open-url.js.map +1 -0
- package/dist/connect/types.d.ts +48 -0
- package/dist/connect/types.d.ts.map +1 -0
- package/dist/connect/types.js +7 -0
- package/dist/connect/types.js.map +1 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +47 -0
- package/dist/dashboard/index.js.map +1 -1
- package/dist/dashboard/types.d.ts +1 -1
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/dashboard/views/connect-view.d.ts +25 -0
- package/dist/dashboard/views/connect-view.d.ts.map +1 -0
- package/dist/dashboard/views/connect-view.js +135 -0
- package/dist/dashboard/views/connect-view.js.map +1 -0
- package/dist/dashboard/views/main-view.d.ts.map +1 -1
- package/dist/dashboard/views/main-view.js +1 -0
- package/dist/dashboard/views/main-view.js.map +1 -1
- package/dist/desktop/chrome-detector.d.ts +58 -0
- package/dist/desktop/chrome-detector.d.ts.map +1 -0
- package/dist/desktop/chrome-detector.js +211 -0
- package/dist/desktop/chrome-detector.js.map +1 -0
- package/dist/desktop/cli-coexistence.d.ts +90 -0
- package/dist/desktop/cli-coexistence.d.ts.map +1 -0
- package/dist/desktop/cli-coexistence.js +219 -0
- package/dist/desktop/cli-coexistence.js.map +1 -0
- package/dist/desktop/dashboard-state.d.ts +50 -0
- package/dist/desktop/dashboard-state.d.ts.map +1 -0
- package/dist/desktop/dashboard-state.js +155 -0
- package/dist/desktop/dashboard-state.js.map +1 -0
- package/dist/desktop/error-log.d.ts +53 -0
- package/dist/desktop/error-log.d.ts.map +1 -0
- package/dist/desktop/error-log.js +127 -0
- package/dist/desktop/error-log.js.map +1 -0
- package/dist/desktop/sidecar-manager.d.ts +80 -0
- package/dist/desktop/sidecar-manager.d.ts.map +1 -0
- package/dist/desktop/sidecar-manager.js +222 -0
- package/dist/desktop/sidecar-manager.js.map +1 -0
- package/dist/desktop/tunnel-failure-handler.d.ts +56 -0
- package/dist/desktop/tunnel-failure-handler.d.ts.map +1 -0
- package/dist/desktop/tunnel-failure-handler.js +157 -0
- package/dist/desktop/tunnel-failure-handler.js.map +1 -0
- package/dist/desktop/tunnel-manager.d.ts +85 -0
- package/dist/desktop/tunnel-manager.d.ts.map +1 -0
- package/dist/desktop/tunnel-manager.js +363 -0
- package/dist/desktop/tunnel-manager.js.map +1 -0
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +4 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/session-manager.d.ts +6 -0
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +12 -0
- package/dist/session-manager.js.map +1 -1
- package/dist/tools/connect.d.ts +7 -0
- package/dist/tools/connect.d.ts.map +1 -0
- package/dist/tools/connect.js +125 -0
- package/dist/tools/connect.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +15 -6
- package/dist/tools/navigate.js.map +1 -1
- package/dist/transports/http.d.ts +26 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +161 -4
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/index.d.ts +1 -0
- package/dist/transports/index.d.ts.map +1 -1
- package/dist/transports/index.js +1 -1
- package/dist/transports/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/tools/click-element.d.ts +0 -8
- package/dist/tools/click-element.d.ts.map +0 -1
- package/dist/tools/click-element.js +0 -347
- package/dist/tools/click-element.js.map +0 -1
- package/dist/tools/wait-and-click.d.ts +0 -8
- package/dist/tools/wait-and-click.d.ts.map +0 -1
- package/dist/tools/wait-and-click.js +0 -208
- package/dist/tools/wait-and-click.js.map +0 -1
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Click Element Tool - Composite tool that finds and clicks an element in one operation
|
|
4
|
-
*
|
|
5
|
-
* This reduces the typical find → get coordinates → click pattern into a single tool call.
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.registerClickElementTool = registerClickElementTool;
|
|
9
|
-
const mcp_1 = require("../types/mcp");
|
|
10
|
-
const session_manager_1 = require("../session-manager");
|
|
11
|
-
const ref_id_manager_1 = require("../utils/ref-id-manager");
|
|
12
|
-
const defaults_1 = require("../config/defaults");
|
|
13
|
-
const dom_delta_1 = require("../utils/dom-delta");
|
|
14
|
-
const adaptive_screenshot_1 = require("../utils/adaptive-screenshot");
|
|
15
|
-
const element_finder_1 = require("../utils/element-finder");
|
|
16
|
-
const element_discovery_1 = require("../utils/element-discovery");
|
|
17
|
-
const ax_element_resolver_1 = require("../utils/ax-element-resolver");
|
|
18
|
-
const outcome_classifier_1 = require("../utils/ralph/outcome-classifier");
|
|
19
|
-
const puppeteer_helpers_1 = require("../utils/puppeteer-helpers");
|
|
20
|
-
const definition = {
|
|
21
|
-
name: 'click_element',
|
|
22
|
-
description: 'Find and click an element by query in one call.',
|
|
23
|
-
inputSchema: {
|
|
24
|
-
type: 'object',
|
|
25
|
-
properties: {
|
|
26
|
-
tabId: {
|
|
27
|
-
type: 'string',
|
|
28
|
-
description: 'Tab ID to execute on',
|
|
29
|
-
},
|
|
30
|
-
query: {
|
|
31
|
-
type: 'string',
|
|
32
|
-
description: 'Element to click (natural language)',
|
|
33
|
-
},
|
|
34
|
-
wait_after: {
|
|
35
|
-
type: 'number',
|
|
36
|
-
description: 'Wait after click in ms. Default: 100',
|
|
37
|
-
},
|
|
38
|
-
verify: {
|
|
39
|
-
type: 'boolean',
|
|
40
|
-
description: 'Return screenshot after click',
|
|
41
|
-
},
|
|
42
|
-
double_click: {
|
|
43
|
-
type: 'boolean',
|
|
44
|
-
description: 'Perform double-click instead of single',
|
|
45
|
-
},
|
|
46
|
-
waitForMs: {
|
|
47
|
-
type: 'number',
|
|
48
|
-
description: 'Poll timeout for element in ms. Default: 0',
|
|
49
|
-
},
|
|
50
|
-
pollInterval: {
|
|
51
|
-
type: 'number',
|
|
52
|
-
description: 'Poll interval in ms. Default: 200',
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
required: ['tabId', 'query'],
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
const handler = async (sessionId, args, context) => {
|
|
59
|
-
const tabId = args.tabId;
|
|
60
|
-
const query = args.query;
|
|
61
|
-
const waitAfter = Math.min(Math.max(args.wait_after || 100, 0), 5000);
|
|
62
|
-
const verify = args.verify;
|
|
63
|
-
const doubleClick = args.double_click;
|
|
64
|
-
const waitForMs = args.waitForMs;
|
|
65
|
-
const pollInterval = Math.min(Math.max(args.pollInterval || 200, 50), 2000);
|
|
66
|
-
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
67
|
-
const refIdManager = (0, ref_id_manager_1.getRefIdManager)();
|
|
68
|
-
if (!tabId) {
|
|
69
|
-
return {
|
|
70
|
-
content: [{ type: 'text', text: 'Error: tabId is required' }],
|
|
71
|
-
isError: true,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
if (!query) {
|
|
75
|
-
return {
|
|
76
|
-
content: [{ type: 'text', text: 'Error: query is required' }],
|
|
77
|
-
isError: true,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
try {
|
|
81
|
-
const page = await sessionManager.getPage(sessionId, tabId, undefined, 'click_element');
|
|
82
|
-
if (!page) {
|
|
83
|
-
return {
|
|
84
|
-
content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
|
|
85
|
-
isError: true,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
const queryNorm = (0, element_finder_1.normalizeQuery)(query);
|
|
89
|
-
const queryLower = queryNorm;
|
|
90
|
-
const queryTokens = (0, element_finder_1.tokenizeQuery)(queryNorm);
|
|
91
|
-
// Optional polling for dynamic/lazy content
|
|
92
|
-
const maxWait = waitForMs ? Math.min(Math.max(waitForMs, 100), 30000) : 0;
|
|
93
|
-
let bestMatch = null;
|
|
94
|
-
const startTime = Date.now();
|
|
95
|
-
const cdpClient = sessionManager.getCDPClient();
|
|
96
|
-
// ─── AX-First Resolution ───
|
|
97
|
-
try {
|
|
98
|
-
const axMatches = await (0, ax_element_resolver_1.resolveElementsByAXTree)(page, cdpClient, query, {
|
|
99
|
-
useCenter: true, maxResults: 3,
|
|
100
|
-
});
|
|
101
|
-
if (axMatches.length > 0) {
|
|
102
|
-
const ax = axMatches[0];
|
|
103
|
-
// Scroll into view and re-resolve coordinates
|
|
104
|
-
try {
|
|
105
|
-
await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', { backendNodeId: ax.backendDOMNodeId });
|
|
106
|
-
await new Promise(resolve => setTimeout(resolve, defaults_1.DEFAULT_DOM_SETTLE_DELAY_MS));
|
|
107
|
-
const { model } = await cdpClient.send(page, 'DOM.getBoxModel', { backendNodeId: ax.backendDOMNodeId });
|
|
108
|
-
if (model?.content && model.content.length >= 8) {
|
|
109
|
-
const bx = model.content[0], by = model.content[1];
|
|
110
|
-
const bw = model.content[2] - bx, bh = model.content[5] - by;
|
|
111
|
-
if (bw > 0 && bh > 0)
|
|
112
|
-
ax.rect = { x: bx + bw / 2, y: by + bh / 2, width: bw, height: bh };
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
catch { /* use original coords */ }
|
|
116
|
-
const axX = Math.round(ax.rect.x), axY = Math.round(ax.rect.y);
|
|
117
|
-
const { delta: axDelta } = await (0, dom_delta_1.withDomDelta)(page, async () => {
|
|
118
|
-
if (doubleClick)
|
|
119
|
-
await page.mouse.click(axX, axY, { clickCount: 2 });
|
|
120
|
-
else
|
|
121
|
-
await page.mouse.click(axX, axY);
|
|
122
|
-
}, { settleMs: Math.max(150, waitAfter) });
|
|
123
|
-
(0, ax_element_resolver_1.invalidateAXCache)((0, puppeteer_helpers_1.getTargetId)(page.target()));
|
|
124
|
-
const axRef = refIdManager.generateRef(sessionId, tabId, ax.backendDOMNodeId, ax.role, ax.name, undefined, undefined);
|
|
125
|
-
await (0, element_discovery_1.cleanupTags)(page, element_discovery_1.DISCOVERY_TAG).catch(() => { });
|
|
126
|
-
adaptive_screenshot_1.AdaptiveScreenshot.getInstance().reset(tabId);
|
|
127
|
-
const axVerb = doubleClick ? 'Double-clicked' : 'Clicked';
|
|
128
|
-
const axOutcome = (0, outcome_classifier_1.classifyOutcome)(axDelta, ax.role);
|
|
129
|
-
const resultText = (0, outcome_classifier_1.formatOutcomeLine)(axOutcome, axVerb, `${ax.role} "${ax.name}"`, `[${axRef}]`, `[${ax_element_resolver_1.MATCH_LEVEL_LABELS[ax.matchLevel]} via AX tree]`) + (axDelta || '');
|
|
130
|
-
if (verify) {
|
|
131
|
-
try {
|
|
132
|
-
const buf = await page.screenshot({ type: 'webp', quality: defaults_1.DEFAULT_SCREENSHOT_QUALITY, encoding: 'base64' });
|
|
133
|
-
return {
|
|
134
|
-
content: [
|
|
135
|
-
{ type: 'text', text: resultText },
|
|
136
|
-
{ type: 'image', data: buf, mimeType: 'image/webp' },
|
|
137
|
-
],
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
catch { /* screenshot failed */ }
|
|
141
|
-
}
|
|
142
|
-
return { content: [{ type: 'text', text: resultText }] };
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
catch {
|
|
146
|
-
// AX non-fatal — fall through to CSS
|
|
147
|
-
}
|
|
148
|
-
// Budget check before expensive CSS discovery
|
|
149
|
-
if (context && !(0, mcp_1.hasBudget)(context, 15_000)) {
|
|
150
|
-
return {
|
|
151
|
-
content: [{ type: 'text', text: `click_element: deadline approaching — skipped CSS fallback for "${query}"` }],
|
|
152
|
-
isError: true,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
// ─── CSS Fallback ───
|
|
156
|
-
do { // --- polling loop start ---
|
|
157
|
-
// Find elements matching the query
|
|
158
|
-
let rawResults;
|
|
159
|
-
try {
|
|
160
|
-
rawResults = await (0, element_discovery_1.discoverElements)(page, cdpClient, queryLower, {
|
|
161
|
-
maxResults: 30,
|
|
162
|
-
useCenter: true,
|
|
163
|
-
timeout: 10000,
|
|
164
|
-
toolName: 'click_element',
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
// CDP evaluate timed out — retry on next poll iteration if budget remains
|
|
169
|
-
if (maxWait > 0 && Date.now() - startTime < maxWait) {
|
|
170
|
-
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
rawResults = [];
|
|
174
|
-
}
|
|
175
|
-
if (rawResults.length === 0) {
|
|
176
|
-
if (maxWait > 0 && Date.now() - startTime < maxWait) {
|
|
177
|
-
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
const pageUrl = page.url();
|
|
181
|
-
return {
|
|
182
|
-
content: [
|
|
183
|
-
{
|
|
184
|
-
type: 'text',
|
|
185
|
-
text: `No clickable elements found matching "${query}" on ${pageUrl}`,
|
|
186
|
-
},
|
|
187
|
-
],
|
|
188
|
-
isError: true,
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
// Score and sort elements, tracking original discovery index for re-positioning
|
|
192
|
-
const scoredResults = rawResults
|
|
193
|
-
.map((el, i) => ({ ...el, score: (0, element_finder_1.scoreElement)(el, queryLower, queryTokens), _origIdx: i }))
|
|
194
|
-
.sort((a, b) => b.score - a.score);
|
|
195
|
-
if (scoredResults.length > 0 && scoredResults[0].score >= 10) {
|
|
196
|
-
bestMatch = scoredResults[0];
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
if (maxWait > 0 && Date.now() - startTime < maxWait) {
|
|
200
|
-
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
// No polling or timeout reached — use best available even if low score
|
|
204
|
-
if (scoredResults.length > 0) {
|
|
205
|
-
bestMatch = scoredResults[0];
|
|
206
|
-
}
|
|
207
|
-
break;
|
|
208
|
-
}
|
|
209
|
-
} while (Date.now() - startTime < maxWait); // --- polling loop end ---
|
|
210
|
-
if (!bestMatch || bestMatch.score < 10) {
|
|
211
|
-
return {
|
|
212
|
-
content: [
|
|
213
|
-
{
|
|
214
|
-
type: 'text',
|
|
215
|
-
text: `No good match found for "${query}". Best candidate was "${bestMatch?.name || 'unknown'}" with low confidence.`,
|
|
216
|
-
},
|
|
217
|
-
],
|
|
218
|
-
isError: true,
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
// Click the element at its center coordinates
|
|
222
|
-
const clickX = Math.round(bestMatch.rect.x);
|
|
223
|
-
const clickY = Math.round(bestMatch.rect.y);
|
|
224
|
-
// Scroll into view first if needed
|
|
225
|
-
if (bestMatch.backendDOMNodeId) {
|
|
226
|
-
try {
|
|
227
|
-
await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', {
|
|
228
|
-
backendNodeId: bestMatch.backendDOMNodeId,
|
|
229
|
-
});
|
|
230
|
-
// Small delay after scroll
|
|
231
|
-
await new Promise(resolve => setTimeout(resolve, defaults_1.DEFAULT_DOM_SETTLE_DELAY_MS));
|
|
232
|
-
// Re-get position after scroll using the shared getTaggedElementRect helper
|
|
233
|
-
const newRect = await (0, element_discovery_1.getTaggedElementRect)(page, cdpClient, element_discovery_1.DISCOVERY_TAG, bestMatch._origIdx, true);
|
|
234
|
-
if (newRect) {
|
|
235
|
-
bestMatch.rect.x = newRect.x;
|
|
236
|
-
bestMatch.rect.y = newRect.y;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
catch {
|
|
240
|
-
// Continue with original coordinates
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
const finalX = Math.round(bestMatch.rect.x);
|
|
244
|
-
const finalY = Math.round(bestMatch.rect.y);
|
|
245
|
-
// Perform the click with DOM delta capture (settleMs includes waitAfter)
|
|
246
|
-
const { delta } = await (0, dom_delta_1.withDomDelta)(page, async () => {
|
|
247
|
-
if (doubleClick) {
|
|
248
|
-
await page.mouse.click(finalX, finalY, { clickCount: 2 });
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
await page.mouse.click(finalX, finalY);
|
|
252
|
-
}
|
|
253
|
-
}, { settleMs: Math.max(150, waitAfter) });
|
|
254
|
-
// Generate ref for the clicked element
|
|
255
|
-
let refId = '';
|
|
256
|
-
if (bestMatch.backendDOMNodeId) {
|
|
257
|
-
refId = refIdManager.generateRef(sessionId, tabId, bestMatch.backendDOMNodeId, bestMatch.role, bestMatch.name, bestMatch.tagName, bestMatch.textContent);
|
|
258
|
-
}
|
|
259
|
-
// Clean up discovery tags to prevent stale properties
|
|
260
|
-
await (0, element_discovery_1.cleanupTags)(page, element_discovery_1.DISCOVERY_TAG).catch(() => { });
|
|
261
|
-
// Reset adaptive screenshot on click (page state changes)
|
|
262
|
-
adaptive_screenshot_1.AdaptiveScreenshot.getInstance().reset(tabId);
|
|
263
|
-
const clickType = doubleClick ? 'Double-clicked' : 'Clicked';
|
|
264
|
-
const textSample = bestMatch.textContent?.slice(0, 50) || bestMatch.name.slice(0, 50);
|
|
265
|
-
const textPart = textSample ? ` "${textSample}"` : '';
|
|
266
|
-
const refPart = refId ? ` [${refId}]` : '';
|
|
267
|
-
const confidencePart = bestMatch.score < 50 ? ' [via CSS, LOW CONFIDENCE]' : ' [via CSS]';
|
|
268
|
-
const cssOutcome = (0, outcome_classifier_1.classifyOutcome)(delta, bestMatch.role);
|
|
269
|
-
const resultText = (0, outcome_classifier_1.formatOutcomeLine)(cssOutcome, clickType, `${bestMatch.tagName}${textPart}`, refPart, confidencePart) + (delta || '');
|
|
270
|
-
// Optional verification screenshot — WebP via CDP for speed and consistency
|
|
271
|
-
if (verify) {
|
|
272
|
-
try {
|
|
273
|
-
const screenshotResult = await Promise.race([
|
|
274
|
-
(async () => {
|
|
275
|
-
const cdpSession = await page.target().createCDPSession();
|
|
276
|
-
try {
|
|
277
|
-
const { data } = await cdpSession.send('Page.captureScreenshot', {
|
|
278
|
-
format: 'webp',
|
|
279
|
-
quality: defaults_1.DEFAULT_SCREENSHOT_QUALITY,
|
|
280
|
-
optimizeForSpeed: true,
|
|
281
|
-
});
|
|
282
|
-
return data;
|
|
283
|
-
}
|
|
284
|
-
finally {
|
|
285
|
-
await cdpSession.detach().catch(() => { });
|
|
286
|
-
}
|
|
287
|
-
})(),
|
|
288
|
-
new Promise((resolve) => setTimeout(() => resolve(null), defaults_1.DEFAULT_SCREENSHOT_RACE_TIMEOUT_MS)),
|
|
289
|
-
]);
|
|
290
|
-
if (screenshotResult !== null) {
|
|
291
|
-
return {
|
|
292
|
-
content: [
|
|
293
|
-
{ type: 'text', text: resultText },
|
|
294
|
-
{ type: 'image', data: screenshotResult, mimeType: 'image/webp' },
|
|
295
|
-
],
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
// Timeout — fall through to fallback
|
|
299
|
-
throw new Error('Screenshot timed out');
|
|
300
|
-
}
|
|
301
|
-
catch {
|
|
302
|
-
// Fall back to Puppeteer PNG with timeout to prevent hangs on dialog-blocked pages
|
|
303
|
-
let fallbackTimer;
|
|
304
|
-
const screenshot = await Promise.race([
|
|
305
|
-
page.screenshot({
|
|
306
|
-
encoding: 'base64',
|
|
307
|
-
type: 'png',
|
|
308
|
-
fullPage: false,
|
|
309
|
-
clip: {
|
|
310
|
-
x: 0,
|
|
311
|
-
y: 0,
|
|
312
|
-
width: Math.min(page.viewport()?.width || defaults_1.DEFAULT_VIEWPORT.width, defaults_1.DEFAULT_VIEWPORT.width),
|
|
313
|
-
height: Math.min(page.viewport()?.height || defaults_1.DEFAULT_VIEWPORT.height, defaults_1.DEFAULT_VIEWPORT.height),
|
|
314
|
-
},
|
|
315
|
-
}).finally(() => clearTimeout(fallbackTimer)),
|
|
316
|
-
new Promise((_, reject) => {
|
|
317
|
-
fallbackTimer = setTimeout(() => reject(new Error('Fallback screenshot timed out')), defaults_1.DEFAULT_SCREENSHOT_TIMEOUT_MS);
|
|
318
|
-
}),
|
|
319
|
-
]);
|
|
320
|
-
return {
|
|
321
|
-
content: [
|
|
322
|
-
{ type: 'text', text: resultText },
|
|
323
|
-
{ type: 'image', data: screenshot, mimeType: 'image/png' },
|
|
324
|
-
],
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
return {
|
|
329
|
-
content: [{ type: 'text', text: resultText }],
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
catch (error) {
|
|
333
|
-
return {
|
|
334
|
-
content: [
|
|
335
|
-
{
|
|
336
|
-
type: 'text',
|
|
337
|
-
text: `Click element error: ${error instanceof Error ? error.message : String(error)}`,
|
|
338
|
-
},
|
|
339
|
-
],
|
|
340
|
-
isError: true,
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
};
|
|
344
|
-
function registerClickElementTool(server) {
|
|
345
|
-
server.registerTool('click_element', handler, definition);
|
|
346
|
-
}
|
|
347
|
-
//# sourceMappingURL=click-element.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"click-element.js","sourceRoot":"","sources":["../../src/tools/click-element.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAwXH,4DAEC;AAvXD,sCAAiG;AACjG,wDAAuD;AACvD,4DAA0D;AAC1D,iDAAkL;AAClL,kDAAkD;AAClD,sEAAkE;AAClE,4DAAoG;AACpG,kEAAgH;AAChH,sEAA8G;AAC9G,0EAAuF;AACvF,kEAAyD;AAEzD,MAAM,UAAU,GAAsB;IACpC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,iDAAiD;IAC9D,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACpC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qCAAqC;aACnD;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACpD;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,+BAA+B;aAC7C;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,wCAAwC;aACtD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4CAA4C;aAC1D;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mCAAmC;aACjD;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;KAC7B;CACF,CAAC;AAEF,MAAM,OAAO,GAAgB,KAAK,EAChC,SAAiB,EACjB,IAA6B,EAC7B,OAAqB,EACD,EAAE;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,UAAqB,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,MAA6B,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAmC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,SAA+B,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,YAAuB,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAExF,MAAM,cAAc,GAAG,IAAA,mCAAiB,GAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAA,gCAAe,GAAE,CAAC;IAEvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;YAC7D,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;YAC7D,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,YAAY,EAAE,CAAC;gBAClE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,+BAAc,EAAC,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,SAAS,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAA,8BAAa,EAAC,SAAS,CAAC,CAAC;QAE7C,4CAA4C;QAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,SAAS,GAAiD,IAAI,CAAC;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,EAAE,CAAC;QAEhD,8BAA8B;QAC9B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAA,6CAAuB,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;gBACtE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;aAC/B,CAAC,CAAC;YACH,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAExB,8CAA8C;gBAC9C,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,4BAA4B,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;oBACjG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,sCAA2B,CAAC,CAAC,CAAC;oBAC/E,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CACpC,IAAI,EAAE,iBAAiB,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,gBAAgB,EAAE,CAChE,CAAC;oBACF,IAAI,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBAChD,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;wBACnD,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;wBAC7D,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;4BAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;oBAC5F,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;gBAErC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE/D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,wBAAY,EAAC,IAAI,EAAE,KAAK,IAAI,EAAE;oBAC7D,IAAI,WAAW;wBAAE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;;wBAChE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;gBAE3C,IAAA,uCAAiB,EAAC,IAAA,+BAAW,EAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAE9C,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACtH,MAAM,IAAA,+BAAW,EAAC,IAAI,EAAE,iCAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACvD,wCAAkB,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE9C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1D,MAAM,SAAS,GAAG,IAAA,oCAAe,EAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,UAAU,GAAG,IAAA,sCAAiB,EAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,IAAI,wCAAkB,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAEzK,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qCAA0B,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAW,CAAC;wBACvH,OAAO;4BACL,OAAO,EAAE;gCACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,EAAE;gCAC3C,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE;6BAC9D;yBACF,CAAC;oBACJ,CAAC;oBAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBACrC,CAAC;gBAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YACpE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;QAED,8CAA8C;QAC9C,IAAI,OAAO,IAAI,CAAC,IAAA,eAAS,EAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mEAAmE,KAAK,GAAG,EAAE,CAAC;gBAC9G,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,uBAAuB;QACvB,GAAG,CAAC,CAAC,6BAA6B;YAClC,mCAAmC;YACnC,IAAI,UAAyC,CAAC;YAC9C,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,IAAA,oCAAgB,EAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE;oBAC/D,UAAU,EAAE,EAAE;oBACd,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,eAAe;iBAC1B,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,0EAA0E;gBAC1E,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;oBACpD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;oBAChE,SAAS;gBACX,CAAC;gBACD,UAAU,GAAG,EAAE,CAAC;YAClB,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;oBACpD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;oBAChE,SAAS;gBACX,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,yCAAyC,KAAK,QAAQ,OAAO,EAAE;yBACtE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,gFAAgF;YAChF,MAAM,aAAa,GAA4C,UAAU;iBACtE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAA,6BAAY,EAAC,EAAkB,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;iBAC1G,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAErC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;gBAC7D,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM;YACR,CAAC;YAED,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;gBACpD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,uEAAuE;gBACvE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM;YACR,CAAC;QACD,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC,2BAA2B;QAEvE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA4B,KAAK,0BAA0B,SAAS,EAAE,IAAI,IAAI,SAAS,wBAAwB;qBACtH;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,8CAA8C;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE5C,mCAAmC;QACnC,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,4BAA4B,EAAE;oBACvD,aAAa,EAAE,SAAS,CAAC,gBAAgB;iBAC1C,CAAC,CAAC;gBACH,2BAA2B;gBAC3B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,sCAA2B,CAAC,CAAC,CAAC;gBAE/E,4EAA4E;gBAC5E,MAAM,OAAO,GAAG,MAAM,IAAA,wCAAoB,EAAC,IAAI,EAAE,SAAS,EAAE,iCAAa,EAAE,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACrG,IAAI,OAAO,EAAE,CAAC;oBACZ,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;oBAC7B,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;YACvC,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE5C,yEAAyE;QACzE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAY,EAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACpD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;QAE3C,uCAAuC;QACvC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAC/B,KAAK,GAAG,YAAY,CAAC,WAAW,CAC9B,SAAS,EACT,KAAK,EACL,SAAS,CAAC,gBAAgB,EAC1B,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,OAAO,EACjB,SAAS,CAAC,WAAW,CACtB,CAAC;QACJ,CAAC;QAED,sDAAsD;QACtD,MAAM,IAAA,+BAAW,EAAC,IAAI,EAAE,iCAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvD,0DAA0D;QAC1D,wCAAkB,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE9C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,YAAY,CAAC;QAC1F,MAAM,UAAU,GAAG,IAAA,oCAAe,EAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAA,sCAAiB,EAAC,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAExI,4EAA4E;QAC5E,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBAC1C,CAAC,KAAK,IAAI,EAAE;wBACV,MAAM,UAAU,GAAG,MAAO,IAAY,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;wBACnE,IAAI,CAAC;4BACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,wBAAwB,EAAE;gCAC/D,MAAM,EAAE,MAAM;gCACd,OAAO,EAAE,qCAA0B;gCACnC,gBAAgB,EAAE,IAAI;6BACvB,CAAC,CAAC;4BACH,OAAO,IAAc,CAAC;wBACxB,CAAC;gCAAS,CAAC;4BACT,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;wBAC5C,CAAC;oBACH,CAAC,CAAC,EAAE;oBACJ,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,6CAAkC,CAAC,CAAC;iBACpG,CAAC,CAAC;gBAEH,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;oBAC9B,OAAO;wBACL,OAAO,EAAE;4BACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;4BAClC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE;yBAClE;qBACF,CAAC;gBACJ,CAAC;gBACD,qCAAqC;gBACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,mFAAmF;gBACnF,IAAI,aAA6B,CAAC;gBAClC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBACpC,IAAI,CAAC,UAAU,CAAC;wBACd,QAAQ,EAAE,QAAQ;wBAClB,IAAI,EAAE,KAAK;wBACX,QAAQ,EAAE,KAAK;wBACf,IAAI,EAAE;4BACJ,CAAC,EAAE,CAAC;4BACJ,CAAC,EAAE,CAAC;4BACJ,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,2BAAgB,CAAC,KAAK,EAAE,2BAAgB,CAAC,KAAK,CAAC;4BACzF,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,IAAI,2BAAgB,CAAC,MAAM,EAAE,2BAAgB,CAAC,MAAM,CAAC;yBAC9F;qBACF,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;oBAC7C,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;wBAC/B,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,EAAE,wCAA6B,CAAC,CAAC;oBACtH,CAAC,CAAC;iBACH,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;wBAClC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE;qBAC3D;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;SAC9C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACvF;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,SAAgB,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wait and Click Tool - Waits for an element to appear and then clicks it
|
|
3
|
-
*
|
|
4
|
-
* Useful for dynamic content that loads after page interaction.
|
|
5
|
-
*/
|
|
6
|
-
import { MCPServer } from '../mcp-server';
|
|
7
|
-
export declare function registerWaitAndClickTool(server: MCPServer): void;
|
|
8
|
-
//# sourceMappingURL=wait-and-click.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wait-and-click.d.ts","sourceRoot":"","sources":["../../src/tools/wait-and-click.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAyO1C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEhE"}
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Wait and Click Tool - Waits for an element to appear and then clicks it
|
|
4
|
-
*
|
|
5
|
-
* Useful for dynamic content that loads after page interaction.
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.registerWaitAndClickTool = registerWaitAndClickTool;
|
|
9
|
-
const session_manager_1 = require("../session-manager");
|
|
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");
|
|
13
|
-
const element_discovery_1 = require("../utils/element-discovery");
|
|
14
|
-
const element_finder_1 = require("../utils/element-finder");
|
|
15
|
-
const ax_element_resolver_1 = require("../utils/ax-element-resolver");
|
|
16
|
-
const outcome_classifier_1 = require("../utils/ralph/outcome-classifier");
|
|
17
|
-
const puppeteer_helpers_1 = require("../utils/puppeteer-helpers");
|
|
18
|
-
const definition = {
|
|
19
|
-
name: 'wait_and_click',
|
|
20
|
-
description: 'Wait for element to appear, then click it.',
|
|
21
|
-
inputSchema: {
|
|
22
|
-
type: 'object',
|
|
23
|
-
properties: {
|
|
24
|
-
tabId: {
|
|
25
|
-
type: 'string',
|
|
26
|
-
description: 'Tab ID to execute on',
|
|
27
|
-
},
|
|
28
|
-
query: {
|
|
29
|
-
type: 'string',
|
|
30
|
-
description: 'Element to find and click (natural language)',
|
|
31
|
-
},
|
|
32
|
-
timeout: {
|
|
33
|
-
type: 'number',
|
|
34
|
-
description: 'Max wait in ms. Default: 5000, max: 30000',
|
|
35
|
-
},
|
|
36
|
-
poll_interval: {
|
|
37
|
-
type: 'number',
|
|
38
|
-
description: 'Poll interval in ms. Default: 200',
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
required: ['tabId', 'query'],
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
const handler = async (sessionId, args) => {
|
|
45
|
-
const tabId = args.tabId;
|
|
46
|
-
const query = args.query;
|
|
47
|
-
const timeout = Math.min(Math.max(args.timeout || 5000, 100), 30000);
|
|
48
|
-
const pollInterval = Math.min(Math.max(args.poll_interval || 200, 50), 2000);
|
|
49
|
-
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
50
|
-
const refIdManager = (0, ref_id_manager_1.getRefIdManager)();
|
|
51
|
-
if (!tabId) {
|
|
52
|
-
return {
|
|
53
|
-
content: [{ type: 'text', text: 'Error: tabId is required' }],
|
|
54
|
-
isError: true,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
if (!query) {
|
|
58
|
-
return {
|
|
59
|
-
content: [{ type: 'text', text: 'Error: query is required' }],
|
|
60
|
-
isError: true,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
try {
|
|
64
|
-
const page = await sessionManager.getPage(sessionId, tabId, undefined, 'wait_and_click');
|
|
65
|
-
if (!page) {
|
|
66
|
-
return {
|
|
67
|
-
content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
|
|
68
|
-
isError: true,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
const queryLower = (0, element_finder_1.normalizeQuery)(query);
|
|
72
|
-
const queryTokens = (0, element_finder_1.tokenizeQuery)(query);
|
|
73
|
-
const startTime = Date.now();
|
|
74
|
-
let bestMatch = null;
|
|
75
|
-
const cdpClient = sessionManager.getCDPClient();
|
|
76
|
-
// Poll for the element (AX-first, CSS fallback)
|
|
77
|
-
let axMatch = null;
|
|
78
|
-
while (Date.now() - startTime < timeout) {
|
|
79
|
-
// Try AX tree first
|
|
80
|
-
try {
|
|
81
|
-
const axMatches = await (0, ax_element_resolver_1.resolveElementsByAXTree)(page, cdpClient, query, {
|
|
82
|
-
useCenter: true, maxResults: 1,
|
|
83
|
-
});
|
|
84
|
-
if (axMatches.length > 0) {
|
|
85
|
-
axMatch = axMatches[0];
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch { /* AX non-fatal */ }
|
|
90
|
-
// CSS fallback
|
|
91
|
-
try {
|
|
92
|
-
const results = await (0, element_discovery_1.discoverElements)(page, cdpClient, queryLower, {
|
|
93
|
-
maxResults: 30,
|
|
94
|
-
useCenter: true,
|
|
95
|
-
timeout: 10000,
|
|
96
|
-
toolName: 'wait_and_click',
|
|
97
|
-
});
|
|
98
|
-
const scored = results
|
|
99
|
-
.map((el, i) => ({ ...el, score: (0, element_finder_1.scoreElement)(el, queryLower, queryTokens), _origIdx: i }))
|
|
100
|
-
.sort((a, b) => b.score - a.score);
|
|
101
|
-
if (scored.length > 0 && scored[0].score >= 20) {
|
|
102
|
-
bestMatch = scored[0];
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// CDP evaluate timed out — retry on next poll iteration
|
|
108
|
-
}
|
|
109
|
-
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
110
|
-
}
|
|
111
|
-
// ─── AX Match Path ───
|
|
112
|
-
if (axMatch) {
|
|
113
|
-
const waitTime = Date.now() - startTime;
|
|
114
|
-
try {
|
|
115
|
-
await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', { backendNodeId: axMatch.backendDOMNodeId });
|
|
116
|
-
await new Promise(resolve => setTimeout(resolve, defaults_1.DEFAULT_DOM_SETTLE_DELAY_MS));
|
|
117
|
-
const { model } = await cdpClient.send(page, 'DOM.getBoxModel', { backendNodeId: axMatch.backendDOMNodeId });
|
|
118
|
-
if (model?.content && model.content.length >= 8) {
|
|
119
|
-
const bx = model.content[0], by = model.content[1];
|
|
120
|
-
const bw = model.content[2] - bx, bh = model.content[5] - by;
|
|
121
|
-
if (bw > 0 && bh > 0)
|
|
122
|
-
axMatch.rect = { x: bx + bw / 2, y: by + bh / 2, width: bw, height: bh };
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch { /* use original coords */ }
|
|
126
|
-
const axX = Math.round(axMatch.rect.x), axY = Math.round(axMatch.rect.y);
|
|
127
|
-
const { delta: axDelta } = await (0, dom_delta_1.withDomDelta)(page, () => page.mouse.click(axX, axY));
|
|
128
|
-
(0, ax_element_resolver_1.invalidateAXCache)((0, puppeteer_helpers_1.getTargetId)(page.target()));
|
|
129
|
-
await (0, element_discovery_1.cleanupTags)(page, element_discovery_1.DISCOVERY_TAG).catch(() => { });
|
|
130
|
-
const axRef = refIdManager.generateRef(sessionId, tabId, axMatch.backendDOMNodeId, axMatch.role, axMatch.name, undefined, undefined);
|
|
131
|
-
const axOutcome = (0, outcome_classifier_1.classifyOutcome)(axDelta, axMatch.role);
|
|
132
|
-
const axLine = (0, outcome_classifier_1.formatOutcomeLine)(axOutcome, 'Clicked', `${axMatch.role} "${axMatch.name}"`, `[${axRef}]`, `[${ax_element_resolver_1.MATCH_LEVEL_LABELS[axMatch.matchLevel]} via AX tree]`);
|
|
133
|
-
return {
|
|
134
|
-
content: [{
|
|
135
|
-
type: 'text',
|
|
136
|
-
text: `${axLine} (waited ${waitTime}ms)${axDelta || ''}`,
|
|
137
|
-
}],
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
if (!bestMatch) {
|
|
141
|
-
return {
|
|
142
|
-
content: [
|
|
143
|
-
{
|
|
144
|
-
type: 'text',
|
|
145
|
-
text: `Timeout: No element matching "${query}" appeared within ${timeout}ms`,
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
isError: true,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
const waitTime = Date.now() - startTime;
|
|
152
|
-
// Scroll into view if needed
|
|
153
|
-
if (bestMatch.backendDOMNodeId) {
|
|
154
|
-
try {
|
|
155
|
-
await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', {
|
|
156
|
-
backendNodeId: bestMatch.backendDOMNodeId,
|
|
157
|
-
});
|
|
158
|
-
await new Promise(resolve => setTimeout(resolve, defaults_1.DEFAULT_DOM_SETTLE_DELAY_MS));
|
|
159
|
-
// Re-get position after scroll
|
|
160
|
-
const newRect = await (0, element_discovery_1.getTaggedElementRect)(page, cdpClient, element_discovery_1.DISCOVERY_TAG, bestMatch._origIdx, true);
|
|
161
|
-
if (newRect) {
|
|
162
|
-
bestMatch.rect.x = newRect.x;
|
|
163
|
-
bestMatch.rect.y = newRect.y;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
catch {
|
|
167
|
-
// Continue with original coordinates
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
// Click the element with DOM delta capture
|
|
171
|
-
const clickX = Math.round(bestMatch.rect.x);
|
|
172
|
-
const clickY = Math.round(bestMatch.rect.y);
|
|
173
|
-
const { delta } = await (0, dom_delta_1.withDomDelta)(page, () => page.mouse.click(clickX, clickY));
|
|
174
|
-
// Clean up discovery tags
|
|
175
|
-
await (0, element_discovery_1.cleanupTags)(page, element_discovery_1.DISCOVERY_TAG);
|
|
176
|
-
// Generate ref
|
|
177
|
-
let refId = '';
|
|
178
|
-
if (bestMatch.backendDOMNodeId) {
|
|
179
|
-
refId = refIdManager.generateRef(sessionId, tabId, bestMatch.backendDOMNodeId, bestMatch.role, bestMatch.name, bestMatch.tagName, bestMatch.textContent);
|
|
180
|
-
}
|
|
181
|
-
const textSample = bestMatch.textContent?.slice(0, 50) || bestMatch.name.slice(0, 50);
|
|
182
|
-
const textPart = textSample ? ` "${textSample}"` : '';
|
|
183
|
-
const refPart = refId ? ` [${refId}]` : '';
|
|
184
|
-
return {
|
|
185
|
-
content: [
|
|
186
|
-
{
|
|
187
|
-
type: 'text',
|
|
188
|
-
text: `\u2713 Waited ${waitTime}ms, clicked ${bestMatch.tagName}${textPart}${refPart}${delta}`,
|
|
189
|
-
},
|
|
190
|
-
],
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
catch (error) {
|
|
194
|
-
return {
|
|
195
|
-
content: [
|
|
196
|
-
{
|
|
197
|
-
type: 'text',
|
|
198
|
-
text: `Wait and click error: ${error instanceof Error ? error.message : String(error)}`,
|
|
199
|
-
},
|
|
200
|
-
],
|
|
201
|
-
isError: true,
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
function registerWaitAndClickTool(server) {
|
|
206
|
-
server.registerTool('wait_and_click', handler, definition);
|
|
207
|
-
}
|
|
208
|
-
//# sourceMappingURL=wait-and-click.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wait-and-click.js","sourceRoot":"","sources":["../../src/tools/wait-and-click.ts"],"names":[],"mappings":"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"}
|