openchrome-mcp 1.2.13 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/update-check.js +3 -3
- package/dist/cli/update-check.js.map +1 -1
- package/dist/tools/click-element.d.ts.map +1 -1
- package/dist/tools/click-element.js +10 -79
- package/dist/tools/click-element.js.map +1 -1
- package/dist/tools/computer.d.ts.map +1 -1
- package/dist/tools/computer.js +35 -5
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inspect.d.ts +12 -0
- package/dist/tools/inspect.d.ts.map +1 -0
- package/dist/tools/inspect.js +392 -0
- package/dist/tools/inspect.js.map +1 -0
- package/dist/tools/interact.d.ts +9 -0
- package/dist/tools/interact.d.ts.map +1 -0
- package/dist/tools/interact.js +426 -0
- package/dist/tools/interact.js.map +1 -0
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +17 -0
- package/dist/tools/navigate.js.map +1 -1
- package/dist/utils/adaptive-screenshot.d.ts +48 -0
- package/dist/utils/adaptive-screenshot.d.ts.map +1 -0
- package/dist/utils/adaptive-screenshot.js +114 -0
- package/dist/utils/adaptive-screenshot.js.map +1 -0
- package/dist/utils/element-finder.d.ts +49 -0
- package/dist/utils/element-finder.d.ts.map +1 -0
- package/dist/utils/element-finder.js +130 -0
- package/dist/utils/element-finder.js.map +1 -0
- package/dist/utils/visual-summary.d.ts +17 -0
- package/dist/utils/visual-summary.d.ts.map +1 -0
- package/dist/utils/visual-summary.js +198 -0
- package/dist/utils/visual-summary.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Inspect Tool - Query-focused page state extraction
|
|
4
|
+
*
|
|
5
|
+
* Extracts focused page state information based on a natural language query.
|
|
6
|
+
* The query controls which extraction categories run — only relevant data
|
|
7
|
+
* is collected and returned, saving tokens vs. full DOM reads.
|
|
8
|
+
*
|
|
9
|
+
* Use this instead of read_page + screenshot combos.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.registerInspectTool = registerInspectTool;
|
|
13
|
+
const session_manager_1 = require("../session-manager");
|
|
14
|
+
const definition = {
|
|
15
|
+
name: 'inspect',
|
|
16
|
+
description: 'Query-focused page state extraction. Returns only data relevant to your query instead of the full DOM tree. Use this instead of read_page + screenshot combos for targeted questions like "what tabs are active", "form field values", "visible error messages".',
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
tabId: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Tab ID to inspect',
|
|
23
|
+
},
|
|
24
|
+
query: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'What to inspect, e.g. "what tabs are active", "form field values", "visible error messages", "page structure"',
|
|
27
|
+
},
|
|
28
|
+
scope: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
enum: ['interactive', 'all', 'visible'],
|
|
31
|
+
description: 'Scope of elements to inspect (default: "visible")',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
required: ['tabId', 'query'],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Map query keywords to extraction categories.
|
|
39
|
+
* Multiple keywords can map to the same category.
|
|
40
|
+
*/
|
|
41
|
+
const KEYWORD_CATEGORY_MAP = [
|
|
42
|
+
// Focus / active element
|
|
43
|
+
[['focus', 'focused', 'active element', 'selected element', 'current'], ['focus']],
|
|
44
|
+
// Tab / navigation state
|
|
45
|
+
[['tab', 'tabs', 'navigation', 'nav', 'menu', 'selected tab', 'active tab'], ['tabs']],
|
|
46
|
+
// Interactive element counts
|
|
47
|
+
[['button', 'buttons', 'link', 'links', 'interactive', 'clickable', 'elements', 'controls'], ['interactive']],
|
|
48
|
+
// Form fields
|
|
49
|
+
[['form', 'input', 'inputs', 'field', 'fields', 'value', 'values', 'text field', 'checkbox', 'radio', 'select', 'dropdown'], ['form']],
|
|
50
|
+
// Headings / page structure
|
|
51
|
+
[['heading', 'headings', 'structure', 'outline', 'sections', 'hierarchy', 'title', 'h1', 'h2', 'h3'], ['headings']],
|
|
52
|
+
// Errors / warnings / alerts
|
|
53
|
+
[['error', 'errors', 'warning', 'warnings', 'alert', 'alerts', 'message', 'messages', 'notification', 'status', 'validation'], ['errors']],
|
|
54
|
+
// Visible content / panels
|
|
55
|
+
[['content', 'panel', 'panels', 'text', 'visible', 'dialog', 'modal', 'main', 'article', 'body'], ['panels']],
|
|
56
|
+
// Broad queries that need multiple categories
|
|
57
|
+
[['state', 'page state', 'overview', 'summary', 'everything', 'all', 'what is on'], ['focus', 'tabs', 'interactive', 'form', 'headings', 'errors', 'panels']],
|
|
58
|
+
];
|
|
59
|
+
/**
|
|
60
|
+
* Determine which categories to extract based on query keywords.
|
|
61
|
+
* Returns all categories if no keywords match (backward compatible).
|
|
62
|
+
*/
|
|
63
|
+
function resolveCategories(query) {
|
|
64
|
+
const queryLower = query.toLowerCase();
|
|
65
|
+
const matched = new Set();
|
|
66
|
+
for (const [keywords, categories] of KEYWORD_CATEGORY_MAP) {
|
|
67
|
+
for (const kw of keywords) {
|
|
68
|
+
if (queryLower.includes(kw)) {
|
|
69
|
+
for (const cat of categories) {
|
|
70
|
+
matched.add(cat);
|
|
71
|
+
}
|
|
72
|
+
break; // One keyword match per group is enough
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// If no keywords matched, return all categories (backward compatible)
|
|
77
|
+
if (matched.size === 0) {
|
|
78
|
+
return new Set(['focus', 'tabs', 'interactive', 'form', 'headings', 'errors', 'panels']);
|
|
79
|
+
}
|
|
80
|
+
return matched;
|
|
81
|
+
}
|
|
82
|
+
const handler = async (sessionId, args) => {
|
|
83
|
+
const tabId = args.tabId;
|
|
84
|
+
const query = args.query;
|
|
85
|
+
const scope = args.scope || 'visible';
|
|
86
|
+
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
87
|
+
if (!tabId) {
|
|
88
|
+
return {
|
|
89
|
+
content: [{ type: 'text', text: 'Error: tabId is required' }],
|
|
90
|
+
isError: true,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (!query) {
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: 'text', text: 'Error: query is required' }],
|
|
96
|
+
isError: true,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Resolve which categories to extract based on query
|
|
100
|
+
const categories = resolveCategories(query);
|
|
101
|
+
try {
|
|
102
|
+
const page = await sessionManager.getPage(sessionId, tabId, undefined, 'inspect');
|
|
103
|
+
if (!page) {
|
|
104
|
+
return {
|
|
105
|
+
content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
|
|
106
|
+
isError: true,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// Pass category flags into the page evaluate to skip unnecessary DOM work
|
|
110
|
+
const categoryFlags = {
|
|
111
|
+
focus: categories.has('focus'),
|
|
112
|
+
tabs: categories.has('tabs'),
|
|
113
|
+
interactive: categories.has('interactive'),
|
|
114
|
+
form: categories.has('form'),
|
|
115
|
+
headings: categories.has('headings'),
|
|
116
|
+
errors: categories.has('errors'),
|
|
117
|
+
panels: categories.has('panels'),
|
|
118
|
+
};
|
|
119
|
+
const inspectResult = await page.evaluate((scopeArg, cats) => {
|
|
120
|
+
const includeAll = scopeArg === 'all';
|
|
121
|
+
const interactiveOnly = scopeArg === 'interactive';
|
|
122
|
+
function isVisible(el) {
|
|
123
|
+
const rect = el.getBoundingClientRect();
|
|
124
|
+
if (rect.width === 0 || rect.height === 0)
|
|
125
|
+
return false;
|
|
126
|
+
const style = window.getComputedStyle(el);
|
|
127
|
+
return style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';
|
|
128
|
+
}
|
|
129
|
+
// ---- Active / selected / focused elements ----
|
|
130
|
+
let focusedInfo = null;
|
|
131
|
+
if (cats.focus) {
|
|
132
|
+
const active = document.activeElement;
|
|
133
|
+
if (active && active !== document.body && active !== document.documentElement) {
|
|
134
|
+
const inputEl = active;
|
|
135
|
+
const role = active.getAttribute('role') ||
|
|
136
|
+
(active.tagName === 'BUTTON'
|
|
137
|
+
? 'button'
|
|
138
|
+
: active.tagName === 'INPUT'
|
|
139
|
+
? inputEl.type || 'textbox'
|
|
140
|
+
: active.tagName.toLowerCase());
|
|
141
|
+
const name = active.getAttribute('aria-label') ||
|
|
142
|
+
active.getAttribute('title') ||
|
|
143
|
+
active.textContent?.trim().slice(0, 60) ||
|
|
144
|
+
'';
|
|
145
|
+
const idAttr = active.id ? `#${active.id}` : '';
|
|
146
|
+
focusedInfo = `${role}${idAttr}${name ? ` "${name}"` : ''}`;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const tabs = [];
|
|
150
|
+
if (cats.tabs) {
|
|
151
|
+
let tabIndex = 0;
|
|
152
|
+
for (const el of document.querySelectorAll('[role="tab"]')) {
|
|
153
|
+
if (!isVisible(el))
|
|
154
|
+
continue;
|
|
155
|
+
const label = el.getAttribute('aria-label') || el.textContent?.trim().slice(0, 60) || '';
|
|
156
|
+
const selected = el.getAttribute('aria-selected') === 'true' ||
|
|
157
|
+
el.classList.contains('active') ||
|
|
158
|
+
el.classList.contains('selected');
|
|
159
|
+
tabs.push({ label, selected, index: tabIndex++ });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// ---- Interactive elements summary ----
|
|
163
|
+
const interactiveCounts = {};
|
|
164
|
+
if (cats.interactive) {
|
|
165
|
+
const interactiveSelectors = [
|
|
166
|
+
'button',
|
|
167
|
+
'[role="button"]',
|
|
168
|
+
'a[href]',
|
|
169
|
+
'input',
|
|
170
|
+
'textarea',
|
|
171
|
+
'select',
|
|
172
|
+
'[role="combobox"]',
|
|
173
|
+
'[role="listbox"]',
|
|
174
|
+
'[role="checkbox"]',
|
|
175
|
+
'[role="radio"]',
|
|
176
|
+
'[role="switch"]',
|
|
177
|
+
'[role="slider"]',
|
|
178
|
+
'[role="tab"]',
|
|
179
|
+
'[role="menuitem"]',
|
|
180
|
+
];
|
|
181
|
+
for (const sel of interactiveSelectors) {
|
|
182
|
+
try {
|
|
183
|
+
let count = 0;
|
|
184
|
+
for (const el of document.querySelectorAll(sel)) {
|
|
185
|
+
if (includeAll || isVisible(el))
|
|
186
|
+
count++;
|
|
187
|
+
}
|
|
188
|
+
if (count > 0) {
|
|
189
|
+
const label = sel
|
|
190
|
+
.replace('[role="', '')
|
|
191
|
+
.replace('"]', '')
|
|
192
|
+
.replace('[href]', '')
|
|
193
|
+
.replace('a', 'link');
|
|
194
|
+
interactiveCounts[label] = (interactiveCounts[label] || 0) + count;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// skip bad selectors
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const formFields = [];
|
|
203
|
+
if (cats.form && !interactiveOnly) {
|
|
204
|
+
for (const el of document.querySelectorAll('input, textarea, select')) {
|
|
205
|
+
if (!includeAll && !isVisible(el))
|
|
206
|
+
continue;
|
|
207
|
+
const inputEl = el;
|
|
208
|
+
const type = inputEl.type || el.tagName.toLowerCase();
|
|
209
|
+
if (type === 'hidden' || type === 'password')
|
|
210
|
+
continue;
|
|
211
|
+
const name = inputEl.placeholder ||
|
|
212
|
+
el.getAttribute('aria-label') ||
|
|
213
|
+
el.getAttribute('name') ||
|
|
214
|
+
el.id ||
|
|
215
|
+
'';
|
|
216
|
+
let value = inputEl.value || '';
|
|
217
|
+
if (el.tagName === 'SELECT') {
|
|
218
|
+
const selectEl = el;
|
|
219
|
+
value = selectEl.options[selectEl.selectedIndex]?.text || selectEl.value || '';
|
|
220
|
+
}
|
|
221
|
+
formFields.push({ type, name: name.slice(0, 40), value: value.slice(0, 60), id: el.id });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// ---- Heading hierarchy ----
|
|
225
|
+
const headings = [];
|
|
226
|
+
if (cats.headings) {
|
|
227
|
+
for (const el of document.querySelectorAll('h1, h2, h3, h4, [role="heading"]')) {
|
|
228
|
+
if (!includeAll && !isVisible(el))
|
|
229
|
+
continue;
|
|
230
|
+
const level = parseInt(el.tagName.replace('H', '') || '2', 10);
|
|
231
|
+
const text = el.textContent?.trim().slice(0, 80) || '';
|
|
232
|
+
if (text)
|
|
233
|
+
headings.push({ level, text });
|
|
234
|
+
if (headings.length >= 10)
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const errors = [];
|
|
239
|
+
if (cats.errors) {
|
|
240
|
+
for (const el of document.querySelectorAll('[role="alert"], [role="alertdialog"], [role="status"], [aria-live="assertive"], [aria-live="polite"]')) {
|
|
241
|
+
if (!isVisible(el))
|
|
242
|
+
continue;
|
|
243
|
+
const text = el.textContent?.trim().slice(0, 100) || '';
|
|
244
|
+
if (text) {
|
|
245
|
+
errors.push({ role: el.getAttribute('role') || 'live-region', text });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (errors.length < 5) {
|
|
249
|
+
for (const el of document.querySelectorAll('.error, .alert, .warning, [class*="error"], [class*="alert"], [class*="warning"]')) {
|
|
250
|
+
if (!isVisible(el))
|
|
251
|
+
continue;
|
|
252
|
+
const text = el.textContent?.trim().slice(0, 100) || '';
|
|
253
|
+
if (text && !errors.some(e => e.text === text)) {
|
|
254
|
+
errors.push({ role: 'class-match', text });
|
|
255
|
+
if (errors.length >= 5)
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const visiblePanels = [];
|
|
262
|
+
if (cats.panels && !interactiveOnly) {
|
|
263
|
+
const containerSelectors = [
|
|
264
|
+
'[role="tabpanel"]',
|
|
265
|
+
'[role="dialog"]',
|
|
266
|
+
'[role="main"]',
|
|
267
|
+
'main',
|
|
268
|
+
'article',
|
|
269
|
+
'section',
|
|
270
|
+
'[role="region"]',
|
|
271
|
+
];
|
|
272
|
+
for (const sel of containerSelectors) {
|
|
273
|
+
if (visiblePanels.length >= 5)
|
|
274
|
+
break;
|
|
275
|
+
try {
|
|
276
|
+
for (const el of document.querySelectorAll(sel)) {
|
|
277
|
+
if (!isVisible(el) || visiblePanels.length >= 5)
|
|
278
|
+
continue;
|
|
279
|
+
const text = el.textContent?.trim().slice(0, 120) || '';
|
|
280
|
+
if (text.length > 20) {
|
|
281
|
+
visiblePanels.push({
|
|
282
|
+
tag: el.tagName.toLowerCase(),
|
|
283
|
+
role: el.getAttribute('role'),
|
|
284
|
+
text,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// skip bad selectors
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
focusedInfo,
|
|
296
|
+
tabs,
|
|
297
|
+
interactiveCounts,
|
|
298
|
+
formFields,
|
|
299
|
+
headings,
|
|
300
|
+
errors,
|
|
301
|
+
visiblePanels,
|
|
302
|
+
url: window.location.href,
|
|
303
|
+
title: document.title,
|
|
304
|
+
};
|
|
305
|
+
}, scope, categoryFlags);
|
|
306
|
+
// Format the output — only include sections for requested categories
|
|
307
|
+
const lines = [`[Inspect: "${query}"]`];
|
|
308
|
+
// Tab state
|
|
309
|
+
if (categories.has('tabs') && inspectResult.tabs.length > 0) {
|
|
310
|
+
const activeTab = inspectResult.tabs.find(t => t.selected);
|
|
311
|
+
const otherTabs = inspectResult.tabs.filter(t => !t.selected);
|
|
312
|
+
if (activeTab) {
|
|
313
|
+
const othersStr = otherTabs.length > 0
|
|
314
|
+
? `. Other tabs: ${otherTabs.map(t => t.label).join(', ')}`
|
|
315
|
+
: '';
|
|
316
|
+
lines.push(`[Tabs] Active: "${activeTab.label}"${othersStr}`);
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
lines.push(`[Tabs] ${inspectResult.tabs.length} tabs: ${inspectResult.tabs.map(t => t.label).join(', ')}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Interactive elements summary
|
|
323
|
+
if (categories.has('interactive')) {
|
|
324
|
+
const interactiveEntries = Object.entries(inspectResult.interactiveCounts);
|
|
325
|
+
if (interactiveEntries.length > 0) {
|
|
326
|
+
const summary = interactiveEntries.map(([k, v]) => `${v} ${k}s`).join(', ');
|
|
327
|
+
lines.push(`[Interactive Elements] ${summary}`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Focused element
|
|
331
|
+
if (categories.has('focus') && inspectResult.focusedInfo) {
|
|
332
|
+
lines.push(`[Focused] ${inspectResult.focusedInfo}`);
|
|
333
|
+
}
|
|
334
|
+
// Headings
|
|
335
|
+
if (categories.has('headings') && inspectResult.headings.length > 0) {
|
|
336
|
+
const headingStr = inspectResult.headings
|
|
337
|
+
.map(h => `h${h.level}: "${h.text}"`)
|
|
338
|
+
.join(' > ');
|
|
339
|
+
lines.push(`[Headings] ${headingStr}`);
|
|
340
|
+
}
|
|
341
|
+
// Form fields
|
|
342
|
+
if (categories.has('form') && inspectResult.formFields.length > 0) {
|
|
343
|
+
const fieldStrs = inspectResult.formFields
|
|
344
|
+
.slice(0, 8)
|
|
345
|
+
.map(f => {
|
|
346
|
+
const idPart = f.id ? `#${f.id}` : '';
|
|
347
|
+
const namePart = f.name ? `"${f.name}"` : '';
|
|
348
|
+
const valuePart = f.value ? ` = "${f.value}"` : '';
|
|
349
|
+
return `${f.type}${idPart}${namePart ? ` ${namePart}` : ''}${valuePart}`;
|
|
350
|
+
})
|
|
351
|
+
.join(', ');
|
|
352
|
+
lines.push(`[Form Fields] ${fieldStrs}`);
|
|
353
|
+
if (inspectResult.formFields.length > 8) {
|
|
354
|
+
lines.push(` ... and ${inspectResult.formFields.length - 8} more fields`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Errors
|
|
358
|
+
if (categories.has('errors') && inspectResult.errors.length > 0) {
|
|
359
|
+
const errorStr = inspectResult.errors
|
|
360
|
+
.map(e => `"${e.text}"`)
|
|
361
|
+
.join('; ');
|
|
362
|
+
lines.push(`[Errors] ${inspectResult.errors.length} message(s): ${errorStr}`);
|
|
363
|
+
}
|
|
364
|
+
// Visible panels/content
|
|
365
|
+
if (categories.has('panels') && inspectResult.visiblePanels.length > 0) {
|
|
366
|
+
const panelStr = inspectResult.visiblePanels
|
|
367
|
+
.map((p, i) => `Panel ${i + 1}: "${p.text}"`)
|
|
368
|
+
.join(' | ');
|
|
369
|
+
lines.push(`[Content] ${panelStr}`);
|
|
370
|
+
}
|
|
371
|
+
// Footer with page context (always included)
|
|
372
|
+
lines.push(`[Page] ${inspectResult.url} | "${inspectResult.title}"`);
|
|
373
|
+
return {
|
|
374
|
+
content: [{ type: 'text', text: lines.join('\n') }],
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
return {
|
|
379
|
+
content: [
|
|
380
|
+
{
|
|
381
|
+
type: 'text',
|
|
382
|
+
text: `Inspect error: ${error instanceof Error ? error.message : String(error)}`,
|
|
383
|
+
},
|
|
384
|
+
],
|
|
385
|
+
isError: true,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
function registerInspectTool(server) {
|
|
390
|
+
server.registerTool('inspect', handler, definition);
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/tools/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interact Tool - Composite tool that finds an element, performs an action,
|
|
3
|
+
* waits for stability, and returns a comprehensive state summary.
|
|
4
|
+
*
|
|
5
|
+
* Reduces multi-step find→click→screenshot sequences to a single call.
|
|
6
|
+
*/
|
|
7
|
+
import { MCPServer } from '../mcp-server';
|
|
8
|
+
export declare function registerInteractTool(server: MCPServer): void;
|
|
9
|
+
//# sourceMappingURL=interact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interact.d.ts","sourceRoot":"","sources":["../../src/tools/interact.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA4d1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE5D"}
|