@ai2qa/local-agent 0.1.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/README.md +254 -0
- package/bin/ai2qa-agent +12 -0
- package/dist/browser/connection.d.ts +80 -0
- package/dist/browser/connection.d.ts.map +1 -0
- package/dist/browser/connection.js +165 -0
- package/dist/browser/connection.js.map +1 -0
- package/dist/config.d.ts +58 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +231 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +189 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +56 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +387 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/click.d.ts +12 -0
- package/dist/tools/click.d.ts.map +1 -0
- package/dist/tools/click.js +61 -0
- package/dist/tools/click.js.map +1 -0
- package/dist/tools/evaluate.d.ts +9 -0
- package/dist/tools/evaluate.d.ts.map +1 -0
- package/dist/tools/evaluate.js +77 -0
- package/dist/tools/evaluate.js.map +1 -0
- package/dist/tools/fill.d.ts +9 -0
- package/dist/tools/fill.d.ts.map +1 -0
- package/dist/tools/fill.js +48 -0
- package/dist/tools/fill.js.map +1 -0
- package/dist/tools/hover.d.ts +9 -0
- package/dist/tools/hover.d.ts.map +1 -0
- package/dist/tools/hover.js +44 -0
- package/dist/tools/hover.js.map +1 -0
- package/dist/tools/index.d.ts +18 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +51 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/knowledge.d.ts +56 -0
- package/dist/tools/knowledge.d.ts.map +1 -0
- package/dist/tools/knowledge.js +98 -0
- package/dist/tools/knowledge.js.map +1 -0
- package/dist/tools/navigate.d.ts +9 -0
- package/dist/tools/navigate.d.ts.map +1 -0
- package/dist/tools/navigate.js +48 -0
- package/dist/tools/navigate.js.map +1 -0
- package/dist/tools/press-key.d.ts +9 -0
- package/dist/tools/press-key.d.ts.map +1 -0
- package/dist/tools/press-key.js +38 -0
- package/dist/tools/press-key.js.map +1 -0
- package/dist/tools/report.d.ts +29 -0
- package/dist/tools/report.d.ts.map +1 -0
- package/dist/tools/report.js +92 -0
- package/dist/tools/report.js.map +1 -0
- package/dist/tools/screenshot.d.ts +9 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +54 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/snapshot.d.ts +13 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/snapshot.js +134 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/types.d.ts +329 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +102 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/wait.d.ts +9 -0
- package/dist/tools/wait.d.ts.map +1 -0
- package/dist/tools/wait.js +64 -0
- package/dist/tools/wait.js.map +1 -0
- package/dist/transports/index.d.ts +8 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +14 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/transports/stdio.d.ts +8 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +12 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/transports/websocket.d.ts +87 -0
- package/dist/transports/websocket.d.ts.map +1 -0
- package/dist/transports/websocket.js +200 -0
- package/dist/transports/websocket.js.map +1 -0
- package/package.json +53 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Model Context Protocol server that exposes browser automation tools.
|
|
6
|
+
* Supports stdio transport for local AI tools (Claude Code, Cursor, etc.)
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.Ai2qaMcpServer = void 0;
|
|
10
|
+
exports.createMcpServer = createMcpServer;
|
|
11
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
12
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
13
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
14
|
+
const connection_js_1 = require("./browser/connection.js");
|
|
15
|
+
const websocket_js_1 = require("./transports/websocket.js");
|
|
16
|
+
const types_js_2 = require("./tools/types.js");
|
|
17
|
+
const navigate_js_1 = require("./tools/navigate.js");
|
|
18
|
+
const click_js_1 = require("./tools/click.js");
|
|
19
|
+
const fill_js_1 = require("./tools/fill.js");
|
|
20
|
+
const hover_js_1 = require("./tools/hover.js");
|
|
21
|
+
const press_key_js_1 = require("./tools/press-key.js");
|
|
22
|
+
const screenshot_js_1 = require("./tools/screenshot.js");
|
|
23
|
+
const snapshot_js_1 = require("./tools/snapshot.js");
|
|
24
|
+
const wait_js_1 = require("./tools/wait.js");
|
|
25
|
+
const evaluate_js_1 = require("./tools/evaluate.js");
|
|
26
|
+
const report_js_1 = require("./tools/report.js");
|
|
27
|
+
const knowledge_js_1 = require("./tools/knowledge.js");
|
|
28
|
+
/** MCP tool definitions */
|
|
29
|
+
const TOOLS = [
|
|
30
|
+
{
|
|
31
|
+
name: types_js_2.TOOL_NAMES.NAVIGATE,
|
|
32
|
+
description: 'Navigate to a URL or perform navigation actions (reload, back, forward)',
|
|
33
|
+
inputSchema: {
|
|
34
|
+
type: 'object',
|
|
35
|
+
properties: {
|
|
36
|
+
url: { type: 'string', description: 'URL to navigate to' },
|
|
37
|
+
type: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
enum: ['goto', 'reload', 'back', 'forward'],
|
|
40
|
+
description: 'Navigation type (default: goto)',
|
|
41
|
+
},
|
|
42
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds (default: 30000)' },
|
|
43
|
+
},
|
|
44
|
+
required: ['url'],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: types_js_2.TOOL_NAMES.CLICK,
|
|
49
|
+
description: 'Click on an element by CSS selector or ref ID',
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: {
|
|
53
|
+
selector: { type: 'string', description: 'CSS selector of element to click' },
|
|
54
|
+
ref: { type: 'string', description: 'Reference ID from snapshot (e.g., ref_0)' },
|
|
55
|
+
button: { type: 'string', enum: ['left', 'right', 'middle'], description: 'Mouse button' },
|
|
56
|
+
clickCount: { type: 'number', description: 'Number of clicks (default: 1)' },
|
|
57
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds' },
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: types_js_2.TOOL_NAMES.FILL,
|
|
63
|
+
description: 'Fill an input element with text',
|
|
64
|
+
inputSchema: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties: {
|
|
67
|
+
selector: { type: 'string', description: 'CSS selector of input element' },
|
|
68
|
+
ref: { type: 'string', description: 'Reference ID from snapshot' },
|
|
69
|
+
value: { type: 'string', description: 'Text value to fill' },
|
|
70
|
+
clear: { type: 'boolean', description: 'Clear existing content first (default: true)' },
|
|
71
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds' },
|
|
72
|
+
},
|
|
73
|
+
required: ['value'],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: types_js_2.TOOL_NAMES.HOVER,
|
|
78
|
+
description: 'Hover over an element',
|
|
79
|
+
inputSchema: {
|
|
80
|
+
type: 'object',
|
|
81
|
+
properties: {
|
|
82
|
+
selector: { type: 'string', description: 'CSS selector of element' },
|
|
83
|
+
ref: { type: 'string', description: 'Reference ID from snapshot' },
|
|
84
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds' },
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: types_js_2.TOOL_NAMES.PRESS_KEY,
|
|
90
|
+
description: 'Press a keyboard key or key combination',
|
|
91
|
+
inputSchema: {
|
|
92
|
+
type: 'object',
|
|
93
|
+
properties: {
|
|
94
|
+
key: { type: 'string', description: 'Key to press (e.g., Enter, Tab, Escape)' },
|
|
95
|
+
modifiers: {
|
|
96
|
+
type: 'array',
|
|
97
|
+
items: { type: 'string', enum: ['Alt', 'Control', 'Meta', 'Shift'] },
|
|
98
|
+
description: 'Modifier keys to hold',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
required: ['key'],
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: types_js_2.TOOL_NAMES.SCREENSHOT,
|
|
106
|
+
description: 'Take a screenshot of the page or element',
|
|
107
|
+
inputSchema: {
|
|
108
|
+
type: 'object',
|
|
109
|
+
properties: {
|
|
110
|
+
fullPage: { type: 'boolean', description: 'Capture full scrollable page' },
|
|
111
|
+
selector: { type: 'string', description: 'CSS selector of element to screenshot' },
|
|
112
|
+
format: { type: 'string', enum: ['png', 'jpeg'], description: 'Image format' },
|
|
113
|
+
quality: { type: 'number', description: 'JPEG quality (0-100)' },
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: types_js_2.TOOL_NAMES.SNAPSHOT,
|
|
119
|
+
description: 'Get a snapshot of the page DOM/accessibility tree for AI analysis',
|
|
120
|
+
inputSchema: {
|
|
121
|
+
type: 'object',
|
|
122
|
+
properties: {
|
|
123
|
+
verbose: { type: 'boolean', description: 'Include interactive element refs' },
|
|
124
|
+
mode: {
|
|
125
|
+
type: 'string',
|
|
126
|
+
enum: ['accessibility', 'html', 'text'],
|
|
127
|
+
description: 'Snapshot mode (default: accessibility)',
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: types_js_2.TOOL_NAMES.WAIT,
|
|
134
|
+
description: 'Wait for element, text, or duration',
|
|
135
|
+
inputSchema: {
|
|
136
|
+
type: 'object',
|
|
137
|
+
properties: {
|
|
138
|
+
selector: { type: 'string', description: 'Wait for element selector' },
|
|
139
|
+
text: { type: 'string', description: 'Wait for text to appear' },
|
|
140
|
+
ms: { type: 'number', description: 'Wait for milliseconds' },
|
|
141
|
+
state: {
|
|
142
|
+
type: 'string',
|
|
143
|
+
enum: ['attached', 'detached', 'visible', 'hidden'],
|
|
144
|
+
description: 'Element state to wait for',
|
|
145
|
+
},
|
|
146
|
+
timeout: { type: 'number', description: 'Maximum wait time' },
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: types_js_2.TOOL_NAMES.EVALUATE,
|
|
152
|
+
description: 'Execute JavaScript in page context',
|
|
153
|
+
inputSchema: {
|
|
154
|
+
type: 'object',
|
|
155
|
+
properties: {
|
|
156
|
+
script: { type: 'string', description: 'JavaScript code to execute' },
|
|
157
|
+
args: { type: 'array', description: 'Arguments to pass to the script' },
|
|
158
|
+
},
|
|
159
|
+
required: ['script'],
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: types_js_2.TOOL_NAMES.REPORT_RESULTS,
|
|
164
|
+
description: 'Report test execution results back to AI2QA for learning',
|
|
165
|
+
inputSchema: {
|
|
166
|
+
type: 'object',
|
|
167
|
+
properties: {
|
|
168
|
+
domain: { type: 'string', description: 'Target domain (e.g., app.example.com)' },
|
|
169
|
+
results: {
|
|
170
|
+
type: 'array',
|
|
171
|
+
description: 'Results from using existing patterns',
|
|
172
|
+
items: {
|
|
173
|
+
type: 'object',
|
|
174
|
+
properties: {
|
|
175
|
+
patternKey: { type: 'string', description: 'Pattern key that was used' },
|
|
176
|
+
selectorUsed: { type: 'string', description: 'Actual selector used' },
|
|
177
|
+
success: { type: 'boolean', description: 'Whether the pattern worked' },
|
|
178
|
+
durationMs: { type: 'number', description: 'Execution time in ms' },
|
|
179
|
+
errorMessage: { type: 'string', description: 'Error message if failed' },
|
|
180
|
+
},
|
|
181
|
+
required: ['patternKey', 'success'],
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
newPatterns: {
|
|
185
|
+
type: 'array',
|
|
186
|
+
description: 'Newly discovered patterns to contribute',
|
|
187
|
+
items: {
|
|
188
|
+
type: 'object',
|
|
189
|
+
properties: {
|
|
190
|
+
key: { type: 'string', description: 'Pattern key (e.g., login_button)' },
|
|
191
|
+
selector: { type: 'string', description: 'CSS/XPath selector' },
|
|
192
|
+
selectorType: {
|
|
193
|
+
type: 'string',
|
|
194
|
+
enum: ['CSS', 'XPATH', 'TEXT', 'ARIA', 'DATA_TESTID'],
|
|
195
|
+
description: 'Type of selector',
|
|
196
|
+
},
|
|
197
|
+
patternType: {
|
|
198
|
+
type: 'string',
|
|
199
|
+
enum: ['SELECTOR', 'TIMING', 'AUTH', 'QUIRK'],
|
|
200
|
+
description: 'Type of pattern',
|
|
201
|
+
},
|
|
202
|
+
value: { type: 'string', description: 'Value for non-selector patterns' },
|
|
203
|
+
description: { type: 'string', description: 'Human-readable description' },
|
|
204
|
+
},
|
|
205
|
+
required: ['key'],
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
required: ['domain'],
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: types_js_2.TOOL_NAMES.GET_KNOWLEDGE,
|
|
214
|
+
description: 'Fetch relevant QA patterns for a domain before testing',
|
|
215
|
+
inputSchema: {
|
|
216
|
+
type: 'object',
|
|
217
|
+
properties: {
|
|
218
|
+
domain: { type: 'string', description: 'Target domain (e.g., app.example.com)' },
|
|
219
|
+
flowName: { type: 'string', description: 'Optional: specific flow (login, checkout)' },
|
|
220
|
+
includeSelectors: { type: 'boolean', description: 'Include selector patterns (default: true)' },
|
|
221
|
+
includeQuirks: { type: 'boolean', description: 'Include site quirks (default: true)' },
|
|
222
|
+
},
|
|
223
|
+
required: ['domain'],
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
];
|
|
227
|
+
/**
|
|
228
|
+
* AI2QA MCP Server
|
|
229
|
+
*/
|
|
230
|
+
class Ai2qaMcpServer {
|
|
231
|
+
server;
|
|
232
|
+
browserConnection;
|
|
233
|
+
page = null;
|
|
234
|
+
constructor(config) {
|
|
235
|
+
this.browserConnection = new connection_js_1.BrowserConnection(config?.browser);
|
|
236
|
+
// Configure knowledge API if provided
|
|
237
|
+
if (config?.knowledgeApi) {
|
|
238
|
+
(0, report_js_1.configureKnowledgeApi)(config.knowledgeApi);
|
|
239
|
+
}
|
|
240
|
+
this.server = new index_js_1.Server({
|
|
241
|
+
name: 'ai2qa-local-agent',
|
|
242
|
+
version: '0.1.0',
|
|
243
|
+
}, {
|
|
244
|
+
capabilities: {
|
|
245
|
+
tools: {},
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
this.setupHandlers();
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Configure the knowledge API for reporting results.
|
|
252
|
+
*/
|
|
253
|
+
configureKnowledgeApi(config) {
|
|
254
|
+
(0, report_js_1.configureKnowledgeApi)(config);
|
|
255
|
+
}
|
|
256
|
+
setupHandlers() {
|
|
257
|
+
// List available tools
|
|
258
|
+
this.server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
|
|
259
|
+
tools: TOOLS,
|
|
260
|
+
}));
|
|
261
|
+
// Handle tool calls
|
|
262
|
+
this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
263
|
+
const { name, arguments: args } = request.params;
|
|
264
|
+
// Ensure browser is connected
|
|
265
|
+
if (!this.page) {
|
|
266
|
+
const result = await this.browserConnection.connect();
|
|
267
|
+
if (!result.success) {
|
|
268
|
+
return {
|
|
269
|
+
content: [
|
|
270
|
+
{
|
|
271
|
+
type: 'text',
|
|
272
|
+
text: JSON.stringify({
|
|
273
|
+
success: false,
|
|
274
|
+
error: `Failed to connect to browser: ${result.error.message}`,
|
|
275
|
+
}),
|
|
276
|
+
},
|
|
277
|
+
],
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
this.page = result.value;
|
|
281
|
+
}
|
|
282
|
+
// Execute the tool
|
|
283
|
+
const toolResult = await this.executeTool(name, args ?? {});
|
|
284
|
+
// Format response based on tool type
|
|
285
|
+
if (name === types_js_2.TOOL_NAMES.SCREENSHOT && toolResult.success && 'data' in toolResult) {
|
|
286
|
+
return {
|
|
287
|
+
content: [
|
|
288
|
+
{
|
|
289
|
+
type: 'image',
|
|
290
|
+
data: toolResult.data,
|
|
291
|
+
mimeType: toolResult.mimeType ?? 'image/png',
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
content: [
|
|
298
|
+
{
|
|
299
|
+
type: 'text',
|
|
300
|
+
text: JSON.stringify(toolResult, null, 2),
|
|
301
|
+
},
|
|
302
|
+
],
|
|
303
|
+
};
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
307
|
+
async executeTool(name, args) {
|
|
308
|
+
if (!this.page) {
|
|
309
|
+
return { success: false, error: 'No browser page available' };
|
|
310
|
+
}
|
|
311
|
+
switch (name) {
|
|
312
|
+
case types_js_2.TOOL_NAMES.NAVIGATE:
|
|
313
|
+
return (0, navigate_js_1.navigate)(this.page, args);
|
|
314
|
+
case types_js_2.TOOL_NAMES.CLICK:
|
|
315
|
+
return (0, click_js_1.click)(this.page, args);
|
|
316
|
+
case types_js_2.TOOL_NAMES.FILL:
|
|
317
|
+
return (0, fill_js_1.fill)(this.page, args);
|
|
318
|
+
case types_js_2.TOOL_NAMES.HOVER:
|
|
319
|
+
return (0, hover_js_1.hover)(this.page, args);
|
|
320
|
+
case types_js_2.TOOL_NAMES.PRESS_KEY:
|
|
321
|
+
return (0, press_key_js_1.pressKey)(this.page, args);
|
|
322
|
+
case types_js_2.TOOL_NAMES.SCREENSHOT:
|
|
323
|
+
return (0, screenshot_js_1.screenshot)(this.page, args);
|
|
324
|
+
case types_js_2.TOOL_NAMES.SNAPSHOT:
|
|
325
|
+
return (0, snapshot_js_1.snapshot)(this.page, args);
|
|
326
|
+
case types_js_2.TOOL_NAMES.WAIT:
|
|
327
|
+
return (0, wait_js_1.wait)(this.page, args);
|
|
328
|
+
case types_js_2.TOOL_NAMES.EVALUATE:
|
|
329
|
+
return (0, evaluate_js_1.evaluate)(this.page, args);
|
|
330
|
+
case types_js_2.TOOL_NAMES.REPORT_RESULTS:
|
|
331
|
+
// Report results doesn't need the browser page
|
|
332
|
+
return (0, report_js_1.reportResults)(args);
|
|
333
|
+
case types_js_2.TOOL_NAMES.GET_KNOWLEDGE:
|
|
334
|
+
// Get knowledge doesn't need the browser page
|
|
335
|
+
return (0, knowledge_js_1.getKnowledge)(args);
|
|
336
|
+
default:
|
|
337
|
+
return { success: false, error: `Unknown tool: ${name}` };
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Start the MCP server with stdio transport (default for local AI tools).
|
|
342
|
+
*/
|
|
343
|
+
async start() {
|
|
344
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
345
|
+
await this.server.connect(transport);
|
|
346
|
+
console.error('[Ai2qaMcpServer] Server started with stdio transport');
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Start the MCP server with WebSocket transport (for AI2QA cloud).
|
|
350
|
+
*/
|
|
351
|
+
async startWithWebSocket(config) {
|
|
352
|
+
const transport = new websocket_js_1.WebSocketTransport(config);
|
|
353
|
+
await transport.start();
|
|
354
|
+
await this.server.connect(transport);
|
|
355
|
+
console.error('[Ai2qaMcpServer] Server started with WebSocket transport');
|
|
356
|
+
console.error(`[Ai2qaMcpServer] Connected to: ${config.url}`);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Start with a custom transport.
|
|
360
|
+
*/
|
|
361
|
+
async startWithTransport(transport) {
|
|
362
|
+
await this.server.connect(transport);
|
|
363
|
+
console.error('[Ai2qaMcpServer] Server started with custom transport');
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Stop the server and clean up resources.
|
|
367
|
+
*/
|
|
368
|
+
async stop() {
|
|
369
|
+
await this.browserConnection.disconnect();
|
|
370
|
+
await this.server.close();
|
|
371
|
+
console.error('[Ai2qaMcpServer] Server stopped');
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Get the underlying MCP server instance.
|
|
375
|
+
*/
|
|
376
|
+
getServer() {
|
|
377
|
+
return this.server;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
exports.Ai2qaMcpServer = Ai2qaMcpServer;
|
|
381
|
+
/**
|
|
382
|
+
* Factory function for creating the MCP server.
|
|
383
|
+
*/
|
|
384
|
+
function createMcpServer(config) {
|
|
385
|
+
return new Ai2qaMcpServer(config);
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Click Tool
|
|
3
|
+
*
|
|
4
|
+
* Clicks on elements by selector or ref ID.
|
|
5
|
+
*/
|
|
6
|
+
import type { Page } from 'playwright';
|
|
7
|
+
import { ClickResult } from './types.js';
|
|
8
|
+
export declare function setRef(refId: string, selector: string): void;
|
|
9
|
+
export declare function getRef(refId: string): string | undefined;
|
|
10
|
+
export declare function clearRefs(): void;
|
|
11
|
+
export declare function click(page: Page, params: unknown): Promise<ClickResult>;
|
|
12
|
+
//# sourceMappingURL=click.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../src/tools/click.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAqB,WAAW,EAAE,MAAM,YAAY,CAAC;AAK5D,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAuC7E"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Click Tool
|
|
4
|
+
*
|
|
5
|
+
* Clicks on elements by selector or ref ID.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.setRef = setRef;
|
|
9
|
+
exports.getRef = getRef;
|
|
10
|
+
exports.clearRefs = clearRefs;
|
|
11
|
+
exports.click = click;
|
|
12
|
+
const types_js_1 = require("./types.js");
|
|
13
|
+
/** Map of ref IDs to selectors (populated by snapshot tool) */
|
|
14
|
+
const refMap = new Map();
|
|
15
|
+
function setRef(refId, selector) {
|
|
16
|
+
refMap.set(refId, selector);
|
|
17
|
+
}
|
|
18
|
+
function getRef(refId) {
|
|
19
|
+
return refMap.get(refId);
|
|
20
|
+
}
|
|
21
|
+
function clearRefs() {
|
|
22
|
+
refMap.clear();
|
|
23
|
+
}
|
|
24
|
+
async function click(page, params) {
|
|
25
|
+
const parseResult = types_js_1.ClickParamsSchema.safeParse(params);
|
|
26
|
+
if (!parseResult.success) {
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
error: `Invalid parameters: ${parseResult.error.message}`,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const { selector, ref, button, clickCount, timeout } = parseResult.data;
|
|
33
|
+
// Resolve selector from ref if provided
|
|
34
|
+
const resolvedSelector = ref ? getRef(ref) : selector;
|
|
35
|
+
if (!resolvedSelector) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
error: ref ? `Unknown ref: ${ref}` : 'No selector provided',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
await page.click(resolvedSelector, {
|
|
43
|
+
button,
|
|
44
|
+
clickCount,
|
|
45
|
+
timeout,
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
success: true,
|
|
49
|
+
selector: resolvedSelector,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
error: `Click failed on "${resolvedSelector}": ${message}`,
|
|
57
|
+
selector: resolvedSelector,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click.js","sourceRoot":"","sources":["../../src/tools/click.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAQH,wBAEC;AAED,wBAEC;AAED,8BAEC;AAED,sBAuCC;AAxDD,yCAA4D;AAE5D,+DAA+D;AAC/D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEzC,SAAgB,MAAM,CAAC,KAAa,EAAE,QAAgB;IAClD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,MAAM,CAAC,KAAa;IAChC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,SAAS;IACrB,MAAM,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAEM,KAAK,UAAU,KAAK,CAAC,IAAU,EAAE,MAAe;IACnD,MAAM,WAAW,GAAG,4BAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,uBAAuB,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE;SAC5D,CAAC;IACN,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC;IAExE,wCAAwC;IACxC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC,sBAAsB;SAC9D,CAAC;IACN,CAAC;IAED,IAAI,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;YAC/B,MAAM;YACN,UAAU;YACV,OAAO;SACV,CAAC,CAAC;QAEH,OAAO;YACH,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,gBAAgB;SAC7B,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,oBAAoB,gBAAgB,MAAM,OAAO,EAAE;YAC1D,QAAQ,EAAE,gBAAgB;SAC7B,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluate Tool
|
|
3
|
+
*
|
|
4
|
+
* Executes JavaScript in the page context.
|
|
5
|
+
*/
|
|
6
|
+
import type { Page } from 'playwright';
|
|
7
|
+
import { EvaluateResult } from './types.js';
|
|
8
|
+
export declare function evaluate(page: Page, params: unknown): Promise<EvaluateResult>;
|
|
9
|
+
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAwB,cAAc,EAAE,MAAM,YAAY,CAAC;AAElE,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAuCnF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Evaluate Tool
|
|
4
|
+
*
|
|
5
|
+
* Executes JavaScript in the page context.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.evaluate = evaluate;
|
|
9
|
+
const types_js_1 = require("./types.js");
|
|
10
|
+
async function evaluate(page, params) {
|
|
11
|
+
const parseResult = types_js_1.EvaluateParamsSchema.safeParse(params);
|
|
12
|
+
if (!parseResult.success) {
|
|
13
|
+
return {
|
|
14
|
+
success: false,
|
|
15
|
+
error: `Invalid parameters: ${parseResult.error.message}`,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const { script, args } = parseResult.data;
|
|
19
|
+
try {
|
|
20
|
+
// Wrap the script in a function if it's not already
|
|
21
|
+
const wrappedScript = script.trim().startsWith('(')
|
|
22
|
+
? script
|
|
23
|
+
: `(${script})`;
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
const result = await page.evaluate(
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
(evalArgs) => {
|
|
28
|
+
// eslint-disable-next-line no-eval
|
|
29
|
+
const fn = eval(evalArgs.code);
|
|
30
|
+
return typeof fn === 'function' ? fn(...evalArgs.params) : fn;
|
|
31
|
+
}, { code: wrappedScript, params: args ?? [] });
|
|
32
|
+
return {
|
|
33
|
+
success: true,
|
|
34
|
+
result: serializeResult(result),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
error: `Evaluate failed: ${message}`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Serialize evaluation result to JSON-safe format.
|
|
47
|
+
*/
|
|
48
|
+
function serializeResult(value) {
|
|
49
|
+
if (value === null || value === undefined) {
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === 'function') {
|
|
53
|
+
return '[Function]';
|
|
54
|
+
}
|
|
55
|
+
if (typeof value === 'symbol') {
|
|
56
|
+
return value.toString();
|
|
57
|
+
}
|
|
58
|
+
if (value instanceof Error) {
|
|
59
|
+
return {
|
|
60
|
+
name: value.name,
|
|
61
|
+
message: value.message,
|
|
62
|
+
stack: value.stack,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
return value.map(serializeResult);
|
|
67
|
+
}
|
|
68
|
+
if (typeof value === 'object') {
|
|
69
|
+
const result = {};
|
|
70
|
+
for (const [key, val] of Object.entries(value)) {
|
|
71
|
+
result[key] = serializeResult(val);
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAKH,4BAuCC;AAzCD,yCAAkE;AAE3D,KAAK,UAAU,QAAQ,CAAC,IAAU,EAAE,MAAe;IACtD,MAAM,WAAW,GAAG,+BAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,uBAAuB,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE;SAC5D,CAAC;IACN,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC;IAE1C,IAAI,CAAC;QACD,oDAAoD;QACpD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAC/C,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC;QAEpB,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ;QAC9B,8DAA8D;QAC9D,CAAC,QAAyC,EAAE,EAAE;YAC1C,mCAAmC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO,OAAO,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,CAAC,EACD,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,CAC9C,CAAC;QAEF,OAAO;YACH,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;SAClC,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,oBAAoB,OAAO,EAAE;SACvC,CAAC;IACN,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO;YACH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;SACrB,CAAC;IACN,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fill Tool
|
|
3
|
+
*
|
|
4
|
+
* Fills input elements with text values.
|
|
5
|
+
*/
|
|
6
|
+
import type { Page } from 'playwright';
|
|
7
|
+
import { FillResult } from './types.js';
|
|
8
|
+
export declare function fill(page: Page, params: unknown): Promise<FillResult>;
|
|
9
|
+
//# sourceMappingURL=fill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../src/tools/fill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAG1D,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAyC3E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fill Tool
|
|
4
|
+
*
|
|
5
|
+
* Fills input elements with text values.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.fill = fill;
|
|
9
|
+
const types_js_1 = require("./types.js");
|
|
10
|
+
const click_js_1 = require("./click.js");
|
|
11
|
+
async function fill(page, params) {
|
|
12
|
+
const parseResult = types_js_1.FillParamsSchema.safeParse(params);
|
|
13
|
+
if (!parseResult.success) {
|
|
14
|
+
return {
|
|
15
|
+
success: false,
|
|
16
|
+
error: `Invalid parameters: ${parseResult.error.message}`,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const { selector, ref, value, clear, timeout } = parseResult.data;
|
|
20
|
+
// Resolve selector from ref if provided
|
|
21
|
+
const resolvedSelector = ref ? (0, click_js_1.getRef)(ref) : selector;
|
|
22
|
+
if (!resolvedSelector) {
|
|
23
|
+
return {
|
|
24
|
+
success: false,
|
|
25
|
+
error: ref ? `Unknown ref: ${ref}` : 'No selector provided',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const element = page.locator(resolvedSelector);
|
|
30
|
+
if (clear) {
|
|
31
|
+
await element.clear({ timeout });
|
|
32
|
+
}
|
|
33
|
+
await element.fill(value, { timeout });
|
|
34
|
+
return {
|
|
35
|
+
success: true,
|
|
36
|
+
selector: resolvedSelector,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
41
|
+
return {
|
|
42
|
+
success: false,
|
|
43
|
+
error: `Fill failed on "${resolvedSelector}": ${message}`,
|
|
44
|
+
selector: resolvedSelector,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=fill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill.js","sourceRoot":"","sources":["../../src/tools/fill.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAMH,oBAyCC;AA5CD,yCAA0D;AAC1D,yCAAoC;AAE7B,KAAK,UAAU,IAAI,CAAC,IAAU,EAAE,MAAe;IAClD,MAAM,WAAW,GAAG,2BAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,uBAAuB,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE;SAC5D,CAAC;IACN,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC;IAElE,wCAAwC;IACxC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC,sBAAsB;SAC9D,CAAC;IACN,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAE/C,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvC,OAAO;YACH,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,gBAAgB;SAC7B,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,gBAAgB,MAAM,OAAO,EAAE;YACzD,QAAQ,EAAE,gBAAgB;SAC7B,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hover Tool
|
|
3
|
+
*
|
|
4
|
+
* Hovers over elements to trigger hover states, tooltips, etc.
|
|
5
|
+
*/
|
|
6
|
+
import type { Page } from 'playwright';
|
|
7
|
+
import { HoverResult } from './types.js';
|
|
8
|
+
export declare function hover(page: Page, params: unknown): Promise<HoverResult>;
|
|
9
|
+
//# sourceMappingURL=hover.d.ts.map
|