@sudu-cli/fronted-preview-mcp 1.0.0-beta.3 → 1.0.0-beta.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/dist/cdp/connectionManager.d.ts +57 -0
- package/dist/cdp/connectionManager.js +153 -0
- package/dist/cdp/connectionManager.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +19 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -0
- package/dist/detectors/frameworkDetector.js +17 -13
- package/dist/detectors/frameworkDetector.js.map +1 -1
- package/dist/handlers/autoFixLoop.d.ts +31 -0
- package/dist/handlers/autoFixLoop.js +120 -4
- package/dist/handlers/autoFixLoop.js.map +1 -1
- package/dist/handlers/checkPageErrors.js +11 -50
- package/dist/handlers/checkPageErrors.js.map +1 -1
- package/dist/handlers/typescriptDiagnostics.js +4 -25
- package/dist/handlers/typescriptDiagnostics.js.map +1 -1
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/serverManager.d.ts +22 -4
- package/dist/serverManager.js +215 -140
- package/dist/serverManager.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.js +21 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +7 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
- package/templates/init/instructions.md +1 -11
- package/templates/init/opencode.json +1 -1
- package/dist/handlers/pickElement.d.ts +0 -10
- package/dist/handlers/pickElement.js +0 -413
- package/dist/handlers/pickElement.js.map +0 -1
- package/dist/handlers/takeScreenshot.d.ts +0 -17
- package/dist/handlers/takeScreenshot.js +0 -83
- package/dist/handlers/takeScreenshot.js.map +0 -1
|
@@ -1,413 +0,0 @@
|
|
|
1
|
-
import { detectFramework } from '../detectors/frameworkDetector.js';
|
|
2
|
-
import { startServer } from '../serverManager.js';
|
|
3
|
-
import CDP from 'chrome-remote-interface';
|
|
4
|
-
async function handlePickElement(args) {
|
|
5
|
-
const projectDir = args.projectDir || process.cwd();
|
|
6
|
-
const cdpPort = args.cdpPort || 9222;
|
|
7
|
-
const waitForLoadMs = args.waitForLoadMs || 3000;
|
|
8
|
-
let client = null;
|
|
9
|
-
try {
|
|
10
|
-
// Step 1: Detect framework and start/get dev server
|
|
11
|
-
const info = await detectFramework(projectDir);
|
|
12
|
-
if (!info.devScript) {
|
|
13
|
-
return {
|
|
14
|
-
content: [
|
|
15
|
-
{
|
|
16
|
-
type: 'text',
|
|
17
|
-
text: JSON.stringify({
|
|
18
|
-
error: 'No dev script found',
|
|
19
|
-
availableScripts: Object.keys(info.npmScripts),
|
|
20
|
-
projectDir,
|
|
21
|
-
}, null, 2),
|
|
22
|
-
},
|
|
23
|
-
],
|
|
24
|
-
isError: true,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
// Step 2: Start dev server (or reuse existing)
|
|
28
|
-
const port = args.customPort || info.port;
|
|
29
|
-
const command = `npm run ${info.devScript}`;
|
|
30
|
-
const status = await startServer(projectDir, command, port);
|
|
31
|
-
const pageUrl = status.url;
|
|
32
|
-
// Step 3: Connect to Chrome via CDP
|
|
33
|
-
const cdpOptions = { port: cdpPort };
|
|
34
|
-
try {
|
|
35
|
-
client = await CDP(cdpOptions);
|
|
36
|
-
}
|
|
37
|
-
catch (cdpErr) {
|
|
38
|
-
return {
|
|
39
|
-
content: [
|
|
40
|
-
{
|
|
41
|
-
type: 'text',
|
|
42
|
-
text: JSON.stringify({
|
|
43
|
-
error: `Failed to connect to Chrome DevTools Protocol on port ${cdpPort}. Ensure Chrome is running with --remote-debugging-port=${cdpPort}`,
|
|
44
|
-
details: cdpErr instanceof Error ? cdpErr.message : String(cdpErr),
|
|
45
|
-
pageUrl,
|
|
46
|
-
suggestion: 'Start Chrome with: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug',
|
|
47
|
-
}, null, 2),
|
|
48
|
-
},
|
|
49
|
-
],
|
|
50
|
-
isError: true,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
if (!client) {
|
|
54
|
-
return {
|
|
55
|
-
content: [
|
|
56
|
-
{
|
|
57
|
-
type: 'text',
|
|
58
|
-
text: JSON.stringify({
|
|
59
|
-
error: 'Failed to create CDP client',
|
|
60
|
-
pageUrl,
|
|
61
|
-
}, null, 2),
|
|
62
|
-
},
|
|
63
|
-
],
|
|
64
|
-
isError: true,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
// Enable required domains
|
|
68
|
-
const { Page, DOM, Overlay, Runtime, CSS } = client;
|
|
69
|
-
await Promise.all([
|
|
70
|
-
Page.enable(),
|
|
71
|
-
DOM.enable(),
|
|
72
|
-
Overlay.enable(),
|
|
73
|
-
Runtime.enable(),
|
|
74
|
-
CSS.enable(),
|
|
75
|
-
]);
|
|
76
|
-
// Step 4: Navigate to the page
|
|
77
|
-
await Page.navigate({ url: pageUrl });
|
|
78
|
-
// Wait for page load
|
|
79
|
-
await new Promise((resolve) => {
|
|
80
|
-
const timeout = setTimeout(resolve, waitForLoadMs);
|
|
81
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
|
-
const handler = (params) => {
|
|
83
|
-
clearTimeout(timeout);
|
|
84
|
-
resolve();
|
|
85
|
-
};
|
|
86
|
-
client.on('Page.loadEventFired', handler);
|
|
87
|
-
});
|
|
88
|
-
// Give a bit more time for hydration
|
|
89
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
90
|
-
let element = null;
|
|
91
|
-
if (args.selector) {
|
|
92
|
-
// Direct selector mode: find element by selector
|
|
93
|
-
element = await pickBySelector(client, args.selector);
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
// Inspection mode: let user pick element via Overlay
|
|
97
|
-
element = await pickByInspection(client);
|
|
98
|
-
}
|
|
99
|
-
const report = {
|
|
100
|
-
pageUrl,
|
|
101
|
-
framework: info.framework,
|
|
102
|
-
port: status.port,
|
|
103
|
-
element,
|
|
104
|
-
timestamp: new Date().toISOString(),
|
|
105
|
-
};
|
|
106
|
-
return {
|
|
107
|
-
content: [
|
|
108
|
-
{
|
|
109
|
-
type: 'text',
|
|
110
|
-
text: JSON.stringify(report, null, 2),
|
|
111
|
-
},
|
|
112
|
-
],
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
catch (err) {
|
|
116
|
-
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
117
|
-
return {
|
|
118
|
-
content: [{ type: 'text', text: JSON.stringify({ error: errorMessage }, null, 2) }],
|
|
119
|
-
isError: true,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
finally {
|
|
123
|
-
if (client) {
|
|
124
|
-
try {
|
|
125
|
-
await client.close();
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
// Ignore cleanup errors
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// Pick element by CSS selector
|
|
134
|
-
async function pickBySelector(client, selector) {
|
|
135
|
-
const { DOM, Runtime, CSS } = client;
|
|
136
|
-
// Find node by selector
|
|
137
|
-
const document = await DOM.getDocument({ depth: -1, pierce: true });
|
|
138
|
-
const nodeId = await DOM.querySelector({
|
|
139
|
-
nodeId: document.root.nodeId,
|
|
140
|
-
selector,
|
|
141
|
-
});
|
|
142
|
-
if (!nodeId || nodeId.nodeId === 0) {
|
|
143
|
-
return null;
|
|
144
|
-
}
|
|
145
|
-
return await extractElementInfo(client, nodeId.nodeId);
|
|
146
|
-
}
|
|
147
|
-
// Pick element via Overlay inspection mode
|
|
148
|
-
async function pickByInspection(client) {
|
|
149
|
-
const { Overlay, DOM } = client;
|
|
150
|
-
return new Promise((resolve) => {
|
|
151
|
-
// Enable inspection mode with highlight
|
|
152
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
153
|
-
Overlay.setInspectMode({
|
|
154
|
-
mode: 'search',
|
|
155
|
-
highlightConfig: {
|
|
156
|
-
showInfo: true,
|
|
157
|
-
showStyles: true,
|
|
158
|
-
showRulers: true,
|
|
159
|
-
showExtensionLines: true,
|
|
160
|
-
contentColor: { r: 66, g: 133, b: 244, a: 0.66 },
|
|
161
|
-
paddingColor: { r: 255, g: 193, b: 7, a: 0.66 },
|
|
162
|
-
borderColor: { r: 66, g: 133, b: 244, a: 0.66 },
|
|
163
|
-
marginColor: { r: 255, g: 193, b: 7, a: 0.66 },
|
|
164
|
-
eventTargetColor: { r: 255, g: 193, b: 7, a: 0.66 },
|
|
165
|
-
shapeColor: { r: 66, g: 133, b: 244, a: 0.66 },
|
|
166
|
-
shapeMarginColor: { r: 255, g: 193, b: 7, a: 0.66 },
|
|
167
|
-
},
|
|
168
|
-
});
|
|
169
|
-
// Listen for element selection
|
|
170
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
171
|
-
const handler = async (params) => {
|
|
172
|
-
// Disable inspection mode
|
|
173
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
174
|
-
Overlay.setInspectMode({ mode: 'none' });
|
|
175
|
-
// Remove listener
|
|
176
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
177
|
-
client.off('Overlay.inspectNodeRequested', handler);
|
|
178
|
-
// Resolve node and extract info
|
|
179
|
-
const node = await DOM.resolveNode({ backendNodeId: params.backendNodeId });
|
|
180
|
-
if (node.object && node.object.objectId) {
|
|
181
|
-
const element = await extractElementInfoByObjectId(client, node.object.objectId);
|
|
182
|
-
resolve(element);
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
resolve(null);
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
189
|
-
client.on('Overlay.inspectNodeRequested', handler);
|
|
190
|
-
// Timeout after 60 seconds
|
|
191
|
-
setTimeout(() => {
|
|
192
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
193
|
-
Overlay.setInspectMode({ mode: 'none' });
|
|
194
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
195
|
-
client.off('Overlay.inspectNodeRequested', handler);
|
|
196
|
-
resolve(null);
|
|
197
|
-
}, 60000);
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
// Extract element info from nodeId
|
|
201
|
-
async function extractElementInfo(client, nodeId) {
|
|
202
|
-
const { DOM, CSS, Runtime } = client;
|
|
203
|
-
// Get node details
|
|
204
|
-
const node = await DOM.describeNode({ nodeId, depth: 0 });
|
|
205
|
-
const boxModel = await DOM.getBoxModel({ nodeId }).catch(() => null);
|
|
206
|
-
const computedStyles = await CSS.getComputedStyleForNode({ nodeId }).catch(() => []);
|
|
207
|
-
const outerHTML = await DOM.getOuterHTML({ nodeId }).catch(() => ({ outerHTML: '' }));
|
|
208
|
-
// Get unique selector
|
|
209
|
-
const selector = await getUniqueSelector(client, nodeId);
|
|
210
|
-
// Get XPath
|
|
211
|
-
const xpath = await getXPath(client, nodeId);
|
|
212
|
-
// Get attributes
|
|
213
|
-
const attributes = {};
|
|
214
|
-
if (node.node.attributes) {
|
|
215
|
-
for (let i = 0; i < node.node.attributes.length; i += 2) {
|
|
216
|
-
attributes[node.node.attributes[i]] = node.node.attributes[i + 1];
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
// Try to detect React/Vue component
|
|
220
|
-
const componentInfo = await detectComponent(client, nodeId);
|
|
221
|
-
// Parse computed styles
|
|
222
|
-
const styles = {};
|
|
223
|
-
if (Array.isArray(computedStyles)) {
|
|
224
|
-
for (const style of computedStyles) {
|
|
225
|
-
if (style.name && style.value) {
|
|
226
|
-
styles[style.name] = style.value;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
return {
|
|
231
|
-
selector,
|
|
232
|
-
xpath,
|
|
233
|
-
tagName: node.node.localName || 'unknown',
|
|
234
|
-
id: attributes.id,
|
|
235
|
-
className: attributes.class,
|
|
236
|
-
attributes,
|
|
237
|
-
computedStyles: styles,
|
|
238
|
-
boundingBox: boxModel ? {
|
|
239
|
-
x: boxModel.model.content[0],
|
|
240
|
-
y: boxModel.model.content[1],
|
|
241
|
-
width: boxModel.model.width,
|
|
242
|
-
height: boxModel.model.height,
|
|
243
|
-
} : null,
|
|
244
|
-
outerHTML: outerHTML.outerHTML || '',
|
|
245
|
-
innerText: node.node.nodeValue || '',
|
|
246
|
-
...componentInfo,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
// Extract element info from objectId (for inspection mode)
|
|
250
|
-
async function extractElementInfoByObjectId(client, objectId) {
|
|
251
|
-
const { DOM, CSS, Runtime } = client;
|
|
252
|
-
// Get nodeId from objectId
|
|
253
|
-
const node = await DOM.requestNode({ objectId });
|
|
254
|
-
const nodeId = node.nodeId;
|
|
255
|
-
return await extractElementInfo(client, nodeId);
|
|
256
|
-
}
|
|
257
|
-
// Generate unique CSS selector for element
|
|
258
|
-
async function getUniqueSelector(client, nodeId) {
|
|
259
|
-
const { DOM } = client;
|
|
260
|
-
try {
|
|
261
|
-
// Try to get CSS selector path
|
|
262
|
-
const path = await DOM.getNodeStackTraces({ nodeId }).catch(() => null);
|
|
263
|
-
// Fallback: build selector manually
|
|
264
|
-
return await buildSelector(client, nodeId);
|
|
265
|
-
}
|
|
266
|
-
catch {
|
|
267
|
-
return await buildSelector(client, nodeId);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
// Build CSS selector by walking up the tree
|
|
271
|
-
async function buildSelector(client, nodeId) {
|
|
272
|
-
const { DOM } = client;
|
|
273
|
-
const parts = [];
|
|
274
|
-
let currentId = nodeId;
|
|
275
|
-
let depth = 0;
|
|
276
|
-
const maxDepth = 15;
|
|
277
|
-
while (currentId && depth < maxDepth) {
|
|
278
|
-
const node = await DOM.describeNode({ nodeId: currentId, depth: 0 });
|
|
279
|
-
const attrs = node.node.attributes || [];
|
|
280
|
-
let part = node.node.localName || 'unknown';
|
|
281
|
-
// Add ID if present
|
|
282
|
-
for (let i = 0; i < attrs.length; i += 2) {
|
|
283
|
-
if (attrs[i] === 'id') {
|
|
284
|
-
part += `#${attrs[i + 1]}`;
|
|
285
|
-
parts.unshift(part);
|
|
286
|
-
return parts.join(' > ');
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
// Add classes if present
|
|
290
|
-
for (let i = 0; i < attrs.length; i += 2) {
|
|
291
|
-
if (attrs[i] === 'class') {
|
|
292
|
-
const classes = attrs[i + 1].split(' ').filter(c => c && !c.startsWith('__') && !c.includes(':')).slice(0, 3);
|
|
293
|
-
if (classes.length > 0) {
|
|
294
|
-
part += `.${classes.join('.')}`;
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
// Add nth-child if needed
|
|
300
|
-
const parent = await DOM.describeNode({ nodeId: currentId, depth: 1 });
|
|
301
|
-
if (parent.node.parentId) {
|
|
302
|
-
const siblings = await DOM.querySelectorAll({
|
|
303
|
-
nodeId: parent.node.parentId,
|
|
304
|
-
selector: part.split('.')[0],
|
|
305
|
-
}).catch(() => ({ nodeIds: [] }));
|
|
306
|
-
if (siblings.nodeIds && siblings.nodeIds.length > 1) {
|
|
307
|
-
const index = siblings.nodeIds.indexOf(currentId);
|
|
308
|
-
if (index >= 0) {
|
|
309
|
-
part += `:nth-child(${index + 1})`;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
parts.unshift(part);
|
|
314
|
-
currentId = node.node.parentId || 0;
|
|
315
|
-
depth++;
|
|
316
|
-
}
|
|
317
|
-
return parts.join(' > ');
|
|
318
|
-
}
|
|
319
|
-
// Get XPath for element
|
|
320
|
-
async function getXPath(client, nodeId) {
|
|
321
|
-
const { DOM } = client;
|
|
322
|
-
const parts = [];
|
|
323
|
-
let currentId = nodeId;
|
|
324
|
-
let depth = 0;
|
|
325
|
-
const maxDepth = 15;
|
|
326
|
-
while (currentId && depth < maxDepth) {
|
|
327
|
-
const node = await DOM.describeNode({ nodeId: currentId, depth: 0 });
|
|
328
|
-
const tagName = node.node.localName || 'unknown';
|
|
329
|
-
// Check siblings for position
|
|
330
|
-
let position = 1;
|
|
331
|
-
if (node.node.parentId) {
|
|
332
|
-
const parent = await DOM.describeNode({ nodeId: node.node.parentId, depth: 1 });
|
|
333
|
-
// This is simplified - in reality would need to query siblings
|
|
334
|
-
}
|
|
335
|
-
parts.unshift(`${tagName}[${position}]`);
|
|
336
|
-
currentId = node.node.parentId || 0;
|
|
337
|
-
depth++;
|
|
338
|
-
}
|
|
339
|
-
return '/' + parts.join('/');
|
|
340
|
-
}
|
|
341
|
-
// Detect React/Vue component info
|
|
342
|
-
async function detectComponent(client, nodeId) {
|
|
343
|
-
const { Runtime, DOM } = client;
|
|
344
|
-
try {
|
|
345
|
-
// Get the fiber/instance from React DevTools or Vue DevTools
|
|
346
|
-
// This is a best-effort attempt using common patterns
|
|
347
|
-
const node = await DOM.resolveNode({ nodeId });
|
|
348
|
-
if (node.object && node.object.objectId) {
|
|
349
|
-
// Try to get React fiber
|
|
350
|
-
const fiberResult = await Runtime.callFunctionOn({
|
|
351
|
-
objectId: node.object.objectId,
|
|
352
|
-
functionDeclaration: `function() {
|
|
353
|
-
// React 18+
|
|
354
|
-
let fiber = this._reactRootContainer?._internalRoot?.current;
|
|
355
|
-
if (!fiber) {
|
|
356
|
-
// React 17 and earlier
|
|
357
|
-
for (const key of Object.keys(this)) {
|
|
358
|
-
if (key.startsWith('__reactFiber') || key.startsWith('__reactInternalInstance')) {
|
|
359
|
-
fiber = this[key];
|
|
360
|
-
break;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
return fiber ? {
|
|
365
|
-
type: fiber.type?.name || fiber.type?.displayName || 'Unknown',
|
|
366
|
-
props: fiber.memoizedProps
|
|
367
|
-
} : null;
|
|
368
|
-
}`,
|
|
369
|
-
returnByValue: true,
|
|
370
|
-
}).catch(() => ({ result: { value: null } }));
|
|
371
|
-
if (fiberResult.result?.value?.type) {
|
|
372
|
-
return {
|
|
373
|
-
componentName: fiberResult.result.value.type,
|
|
374
|
-
componentProps: fiberResult.result.value.props,
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
// Try Vue component
|
|
378
|
-
const vueResult = await Runtime.callFunctionOn({
|
|
379
|
-
objectId: node.object.objectId,
|
|
380
|
-
functionDeclaration: `function() {
|
|
381
|
-
// Vue 3
|
|
382
|
-
if (this.__vueParentComponent) {
|
|
383
|
-
return {
|
|
384
|
-
type: this.__vueParentComponent.type?.name || this.__vueParentComponent.type?.displayName || 'Unknown',
|
|
385
|
-
props: this.__vueParentComponent.props
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
// Vue 2
|
|
389
|
-
if (this.__vue__) {
|
|
390
|
-
return {
|
|
391
|
-
type: this.__vue__.$options?.name || this.__vue__.$options?._componentTag || 'Unknown',
|
|
392
|
-
props: this.__vue__.$props
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
return null;
|
|
396
|
-
}`,
|
|
397
|
-
returnByValue: true,
|
|
398
|
-
}).catch(() => ({ result: { value: null } }));
|
|
399
|
-
if (vueResult.result?.value?.type) {
|
|
400
|
-
return {
|
|
401
|
-
componentName: vueResult.result.value.type,
|
|
402
|
-
componentProps: vueResult.result.value.props,
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
catch {
|
|
408
|
-
// Ignore component detection errors
|
|
409
|
-
}
|
|
410
|
-
return {};
|
|
411
|
-
}
|
|
412
|
-
export { handlePickElement };
|
|
413
|
-
//# sourceMappingURL=pickElement.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pickElement.js","sourceRoot":"","sources":["../../src/handlers/pickElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Client } from 'chrome-remote-interface';
|
|
2
|
-
import { ToolContext } from '../types.js';
|
|
3
|
-
export interface ScreenshotOptions {
|
|
4
|
-
format?: 'png' | 'jpeg' | 'webp';
|
|
5
|
-
quality?: number;
|
|
6
|
-
fullPage?: boolean;
|
|
7
|
-
selector?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface ScreenshotResult {
|
|
10
|
-
success: boolean;
|
|
11
|
-
message?: string;
|
|
12
|
-
dataUrl?: string;
|
|
13
|
-
filePath?: string;
|
|
14
|
-
error?: string;
|
|
15
|
-
}
|
|
16
|
-
export declare function takeScreenshot(client: Client, options?: ScreenshotOptions): Promise<ScreenshotResult>;
|
|
17
|
-
export declare function handleTakeScreenshot(context: ToolContext, options?: ScreenshotOptions): Promise<ScreenshotResult>;
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
export async function takeScreenshot(client, options = {}) {
|
|
2
|
-
const { Page } = client;
|
|
3
|
-
const { format = 'png', quality = 80, fullPage = false, selector } = options;
|
|
4
|
-
try {
|
|
5
|
-
// If selector is provided, scroll to element first
|
|
6
|
-
if (selector) {
|
|
7
|
-
await scrollToElement(client, selector);
|
|
8
|
-
}
|
|
9
|
-
// Capture screenshot
|
|
10
|
-
const screenshotParams = {
|
|
11
|
-
format,
|
|
12
|
-
quality: quality > 100 ? 100 : quality < 0 ? 0 : quality
|
|
13
|
-
};
|
|
14
|
-
// If fullPage is requested, we need to capture the entire page
|
|
15
|
-
if (fullPage) {
|
|
16
|
-
screenshotParams.captureBeyondViewport = true;
|
|
17
|
-
}
|
|
18
|
-
const result = await Page.captureScreenshot(screenshotParams);
|
|
19
|
-
// Return data URL or save to file
|
|
20
|
-
if (result.data) {
|
|
21
|
-
return {
|
|
22
|
-
success: true,
|
|
23
|
-
dataUrl: `data:image/${format};base64,${result.data}`
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
return {
|
|
28
|
-
success: false,
|
|
29
|
-
error: 'No screenshot data returned'
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
return {
|
|
35
|
-
success: false,
|
|
36
|
-
error: error instanceof Error ? error.message : 'Unknown error taking screenshot'
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// Helper function to scroll to element
|
|
41
|
-
async function scrollToElement(client, selector) {
|
|
42
|
-
const { DOM, Page } = client;
|
|
43
|
-
try {
|
|
44
|
-
// Find element by selector
|
|
45
|
-
const result = await DOM.querySelector({
|
|
46
|
-
selector: selector
|
|
47
|
-
});
|
|
48
|
-
if (!result.nodeId) {
|
|
49
|
-
throw new Error(`Element not found with selector: ${selector}`);
|
|
50
|
-
}
|
|
51
|
-
// Scroll element into view
|
|
52
|
-
await DOM.scrollIntoView({
|
|
53
|
-
nodeId: result.nodeId,
|
|
54
|
-
block: 'center',
|
|
55
|
-
inline: 'center'
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
// If DOM operations fail, try JavaScript approach
|
|
60
|
-
await Page.evaluate({
|
|
61
|
-
expression: `
|
|
62
|
-
(function() {
|
|
63
|
-
const element = document.querySelector('${selector.replace(/'/g, "\\'")}');
|
|
64
|
-
if (element) {
|
|
65
|
-
element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
|
|
66
|
-
}
|
|
67
|
-
})();
|
|
68
|
-
`
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// MCP tool handler
|
|
73
|
-
export async function handleTakeScreenshot(context, options) {
|
|
74
|
-
const { chromeClient } = context;
|
|
75
|
-
if (!chromeClient) {
|
|
76
|
-
return {
|
|
77
|
-
success: false,
|
|
78
|
-
error: 'Chrome client not connected. Please connect to Chrome first.'
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
return await takeScreenshot(chromeClient, options);
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=takeScreenshot.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"takeScreenshot.js","sourceRoot":"","sources":["../../src/handlers/takeScreenshot.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACxB,MAAM,EACJ,MAAM,GAAG,KAAK,EACd,OAAO,GAAG,EAAE,EACZ,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACT,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC;QACH,mDAAmD;QACnD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,qBAAqB;QACrB,MAAM,gBAAgB,GAAQ;YAC5B,MAAM;YACN,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;SACzD,CAAC;QAEF,+DAA+D;QAC/D,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAChD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QAE9D,kCAAkC;QAClC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,cAAc,MAAM,WAAW,MAAM,CAAC,IAAI,EAAE;aACtD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,6BAA6B;aACrC,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;SAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,QAAgB;IAC7D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAE7B,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAO,GAAW,CAAC,aAAa,CAAC;YAC9C,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,2BAA2B;QAC3B,MAAO,GAAW,CAAC,cAAc,CAAC;YAChC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kDAAkD;QAClD,MAAO,IAAY,CAAC,QAAQ,CAAC;YAC3B,UAAU,EAAE;;oDAEkC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;;;;OAK1E;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,mBAAmB;AACnB,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAoB,EACpB,OAA2B;IAE3B,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEjC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,8DAA8D;SACtE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC"}
|