mcp-accessibility-scanner 1.1.2 → 2.0.1
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 → README.md} +49 -0
- package/lib/browserContextFactory.js +83 -99
- package/lib/browserContextFactory.js.map +1 -1
- package/lib/browserServerBackend.js +78 -0
- package/lib/browserServerBackend.js.map +1 -0
- package/lib/config.js +89 -19
- package/lib/config.js.map +1 -1
- package/lib/context.js +109 -174
- package/lib/context.js.map +1 -1
- package/lib/extension/cdpRelay.js +359 -0
- package/lib/extension/cdpRelay.js.map +1 -0
- package/lib/extension/extensionContextFactory.js +57 -0
- package/lib/extension/extensionContextFactory.js.map +1 -0
- package/lib/extension/protocol.js +19 -0
- package/lib/extension/protocol.js.map +1 -0
- package/lib/index.js +7 -3
- package/lib/index.js.map +1 -1
- package/lib/{transport.js → mcp/http.js} +65 -63
- package/lib/mcp/http.js.map +1 -0
- package/lib/mcp/inProcessTransport.js +73 -0
- package/lib/mcp/inProcessTransport.js.map +1 -0
- package/lib/mcp/manualPromise.js.map +1 -0
- package/lib/mcp/mdb.js +199 -0
- package/lib/mcp/mdb.js.map +1 -0
- package/lib/mcp/proxyBackend.js +105 -0
- package/lib/mcp/proxyBackend.js.map +1 -0
- package/lib/mcp/server.js +124 -0
- package/lib/mcp/server.js.map +1 -0
- package/lib/mcp/tool.js +33 -0
- package/lib/mcp/tool.js.map +1 -0
- package/lib/program.js +83 -26
- package/lib/program.js.map +1 -1
- package/lib/response.js +166 -0
- package/lib/response.js.map +1 -0
- package/lib/sessionLog.js +122 -0
- package/lib/sessionLog.js.map +1 -0
- package/lib/tab.js +173 -25
- package/lib/tab.js.map +1 -1
- package/lib/tools/common.js +12 -25
- package/lib/tools/common.js.map +1 -1
- package/lib/tools/console.js +4 -15
- package/lib/tools/console.js.map +1 -1
- package/lib/tools/dialogs.js +14 -19
- package/lib/tools/dialogs.js.map +1 -1
- package/lib/tools/evaluate.js +54 -0
- package/lib/tools/evaluate.js.map +1 -0
- package/lib/tools/files.js +12 -19
- package/lib/tools/files.js.map +1 -1
- package/lib/tools/form.js +58 -0
- package/lib/tools/form.js.map +1 -0
- package/lib/tools/install.js +7 -10
- package/lib/tools/install.js.map +1 -1
- package/lib/tools/keyboard.js +49 -17
- package/lib/tools/keyboard.js.map +1 -1
- package/lib/tools/mouse.js +100 -0
- package/lib/tools/mouse.js.map +1 -0
- package/lib/tools/navigate.js +13 -52
- package/lib/tools/navigate.js.map +1 -1
- package/lib/tools/network.js +5 -15
- package/lib/tools/network.js.map +1 -1
- package/lib/tools/pdf.js +8 -17
- package/lib/tools/pdf.js.map +1 -1
- package/lib/tools/screenshot.js +36 -34
- package/lib/tools/screenshot.js.map +1 -1
- package/lib/tools/snapshot.js +103 -154
- package/lib/tools/snapshot.js.map +1 -1
- package/lib/tools/tabs.js +66 -81
- package/lib/tools/tabs.js.map +1 -1
- package/lib/tools/tool.js +15 -0
- package/lib/tools/tool.js.map +1 -1
- package/lib/tools/utils.js +7 -13
- package/lib/tools/utils.js.map +1 -1
- package/lib/tools/verify.js +138 -0
- package/lib/tools/verify.js.map +1 -0
- package/lib/tools/wait.js +11 -15
- package/lib/tools/wait.js.map +1 -1
- package/lib/tools.js +19 -23
- package/lib/tools.js.map +1 -1
- package/lib/{javascript.js → utils/codegen.js} +2 -2
- package/lib/utils/codegen.js.map +1 -0
- package/lib/{fileUtils.js → utils/fileUtils.js} +6 -2
- package/lib/utils/fileUtils.js.map +1 -0
- package/lib/utils/guid.js +23 -0
- package/lib/utils/guid.js.map +1 -0
- package/lib/utils/log.js +22 -0
- package/lib/utils/log.js.map +1 -0
- package/lib/{package.js → utils/package.js} +4 -4
- package/lib/utils/package.js.map +1 -0
- package/lib/vscode/host.js +129 -0
- package/lib/vscode/host.js.map +1 -0
- package/lib/vscode/main.js +63 -0
- package/lib/vscode/main.js.map +1 -0
- package/package.json +20 -20
- package/lib/browserServer.js +0 -152
- package/lib/browserServer.js.map +0 -1
- package/lib/connection.js +0 -83
- package/lib/connection.js.map +0 -1
- package/lib/fileUtils.js.map +0 -1
- package/lib/httpServer.js +0 -202
- package/lib/httpServer.js.map +0 -1
- package/lib/javascript.js.map +0 -1
- package/lib/manualPromise.js.map +0 -1
- package/lib/package.js.map +0 -1
- package/lib/pageSnapshot.js +0 -44
- package/lib/pageSnapshot.js.map +0 -1
- package/lib/server.js +0 -49
- package/lib/server.js.map +0 -1
- package/lib/tools/vision.js +0 -190
- package/lib/tools/vision.js.map +0 -1
- package/lib/transport.js.map +0 -1
- /package/lib/{manualPromise.js → mcp/manualPromise.js} +0 -0
package/lib/tools/snapshot.js
CHANGED
|
@@ -14,10 +14,62 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import { z } from 'zod';
|
|
17
|
-
import { defineTool } from './tool.js';
|
|
18
|
-
import * as javascript from '../
|
|
17
|
+
import { defineTabTool, defineTool } from './tool.js';
|
|
18
|
+
import * as javascript from '../utils/codegen.js';
|
|
19
19
|
import { generateLocator } from './utils.js';
|
|
20
|
-
import AxeBuilder from
|
|
20
|
+
import AxeBuilder from "@axe-core/playwright";
|
|
21
|
+
const tagValues = [
|
|
22
|
+
'wcag2a', 'wcag2aa', 'wcag2aaa', 'wcag21a', 'wcag21aa', 'wcag21aaa',
|
|
23
|
+
'wcag22a', 'wcag22aa', 'wcag22aaa', 'section508', 'cat.aria', 'cat.color',
|
|
24
|
+
'cat.forms', 'cat.keyboard', 'cat.language', 'cat.name-role-value',
|
|
25
|
+
'cat.parsing', 'cat.semantics', 'cat.sensory-and-visual-cues',
|
|
26
|
+
'cat.structure', 'cat.tables', 'cat.text-alternatives', 'cat.time-and-media',
|
|
27
|
+
];
|
|
28
|
+
const scanPageSchema = z.object({
|
|
29
|
+
violationsTag: z
|
|
30
|
+
.array(z.enum(tagValues))
|
|
31
|
+
.min(1)
|
|
32
|
+
.default([...tagValues])
|
|
33
|
+
.describe('Array of tags to filter violations by. If not specified, all violations are returned.')
|
|
34
|
+
});
|
|
35
|
+
const dedupeViolationNodes = (nodes) => {
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
return nodes.filter((node) => {
|
|
38
|
+
const key = JSON.stringify({ target: node.target ?? [], html: node.html ?? '' });
|
|
39
|
+
if (seen.has(key))
|
|
40
|
+
return false;
|
|
41
|
+
seen.add(key);
|
|
42
|
+
return true;
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const scanPage = defineTool({
|
|
46
|
+
capability: 'core',
|
|
47
|
+
schema: {
|
|
48
|
+
name: 'scan_page',
|
|
49
|
+
title: 'Scan page for accessibility violations',
|
|
50
|
+
description: 'Scan the current page for accessibility violations using Axe',
|
|
51
|
+
inputSchema: scanPageSchema,
|
|
52
|
+
type: 'destructive',
|
|
53
|
+
},
|
|
54
|
+
handle: async (context, params, response) => {
|
|
55
|
+
const tab = context.currentTabOrDie();
|
|
56
|
+
const axe = new AxeBuilder({ page: tab.page }).withTags(params.violationsTag);
|
|
57
|
+
const results = await axe.analyze();
|
|
58
|
+
response.addResult([
|
|
59
|
+
`URL: ${results.url}`,
|
|
60
|
+
'',
|
|
61
|
+
`Violations: ${results.violations.length}, Incomplete: ${results.incomplete.length}, Passes: ${results.passes.length}, Inapplicable: ${results.inapplicable.length}`,
|
|
62
|
+
].join('\n'));
|
|
63
|
+
results.violations.forEach((violation) => {
|
|
64
|
+
const uniqueNodes = dedupeViolationNodes(violation.nodes);
|
|
65
|
+
response.addResult([
|
|
66
|
+
'',
|
|
67
|
+
`Tags : ${violation.tags}`,
|
|
68
|
+
`Violations: ${JSON.stringify(uniqueNodes, null, 2)}`,
|
|
69
|
+
].join('\n'));
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
});
|
|
21
73
|
const snapshot = defineTool({
|
|
22
74
|
capability: 'core',
|
|
23
75
|
schema: {
|
|
@@ -27,35 +79,20 @@ const snapshot = defineTool({
|
|
|
27
79
|
inputSchema: z.object({}),
|
|
28
80
|
type: 'readOnly',
|
|
29
81
|
},
|
|
30
|
-
handle: async (context) => {
|
|
82
|
+
handle: async (context, params, response) => {
|
|
31
83
|
await context.ensureTab();
|
|
32
|
-
|
|
33
|
-
code: [`// <internal code to capture accessibility snapshot>`],
|
|
34
|
-
captureSnapshot: true,
|
|
35
|
-
waitForNetwork: false,
|
|
36
|
-
};
|
|
84
|
+
response.setIncludeSnapshot();
|
|
37
85
|
},
|
|
38
86
|
});
|
|
39
|
-
const elementSchema = z.object({
|
|
87
|
+
export const elementSchema = z.object({
|
|
40
88
|
element: z.string().describe('Human-readable element description used to obtain permission to interact with the element'),
|
|
41
89
|
ref: z.string().describe('Exact target element reference from the page snapshot'),
|
|
42
90
|
});
|
|
43
|
-
const tagValues = [
|
|
44
|
-
'wcag2a', 'wcag2aa', 'wcag2aaa', 'wcag21a', 'wcag21aa', 'wcag21aaa',
|
|
45
|
-
'wcag22a', 'wcag22aa', 'wcag22aaa', 'section508', 'cat.aria', 'cat.color',
|
|
46
|
-
'cat.forms', 'cat.keyboard', 'cat.language', 'cat.name-role-value',
|
|
47
|
-
'cat.parsing', 'cat.semantics', 'cat.sensory-and-visual-cues',
|
|
48
|
-
'cat.structure', 'cat.tables', 'cat.text-alternatives', 'cat.time-and-media',
|
|
49
|
-
];
|
|
50
|
-
const scanPageSchema = z.object({
|
|
51
|
-
violationsTag: z
|
|
52
|
-
.array(z.enum(tagValues))
|
|
53
|
-
.min(1).describe('Array of tags to filter violations by. If not specified, all violations are returned.'),
|
|
54
|
-
});
|
|
55
91
|
const clickSchema = elementSchema.extend({
|
|
56
92
|
doubleClick: z.boolean().optional().describe('Whether to perform a double click instead of a single click'),
|
|
93
|
+
button: z.enum(['left', 'right', 'middle']).optional().describe('Button to click, defaults to left'),
|
|
57
94
|
});
|
|
58
|
-
const click =
|
|
95
|
+
const click = defineTabTool({
|
|
59
96
|
capability: 'core',
|
|
60
97
|
schema: {
|
|
61
98
|
name: 'browser_click',
|
|
@@ -64,27 +101,24 @@ const click = defineTool({
|
|
|
64
101
|
inputSchema: clickSchema,
|
|
65
102
|
type: 'destructive',
|
|
66
103
|
},
|
|
67
|
-
handle: async (
|
|
68
|
-
|
|
69
|
-
const locator = tab.
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
captureSnapshot: true,
|
|
83
|
-
waitForNetwork: true,
|
|
84
|
-
};
|
|
104
|
+
handle: async (tab, params, response) => {
|
|
105
|
+
response.setIncludeSnapshot();
|
|
106
|
+
const locator = await tab.refLocator(params);
|
|
107
|
+
const button = params.button;
|
|
108
|
+
const buttonAttr = button ? `{ button: '${button}' }` : '';
|
|
109
|
+
if (params.doubleClick)
|
|
110
|
+
response.addCode(`await page.${await generateLocator(locator)}.dblclick(${buttonAttr});`);
|
|
111
|
+
else
|
|
112
|
+
response.addCode(`await page.${await generateLocator(locator)}.click(${buttonAttr});`);
|
|
113
|
+
await tab.waitForCompletion(async () => {
|
|
114
|
+
if (params.doubleClick)
|
|
115
|
+
await locator.dblclick({ button });
|
|
116
|
+
else
|
|
117
|
+
await locator.click({ button });
|
|
118
|
+
});
|
|
85
119
|
},
|
|
86
120
|
});
|
|
87
|
-
const drag =
|
|
121
|
+
const drag = defineTabTool({
|
|
88
122
|
capability: 'core',
|
|
89
123
|
schema: {
|
|
90
124
|
name: 'browser_drag',
|
|
@@ -98,23 +132,19 @@ const drag = defineTool({
|
|
|
98
132
|
}),
|
|
99
133
|
type: 'destructive',
|
|
100
134
|
},
|
|
101
|
-
handle: async (
|
|
102
|
-
|
|
103
|
-
const startLocator =
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
action: () => startLocator.dragTo(endLocator),
|
|
112
|
-
captureSnapshot: true,
|
|
113
|
-
waitForNetwork: true,
|
|
114
|
-
};
|
|
135
|
+
handle: async (tab, params, response) => {
|
|
136
|
+
response.setIncludeSnapshot();
|
|
137
|
+
const [startLocator, endLocator] = await tab.refLocators([
|
|
138
|
+
{ ref: params.startRef, element: params.startElement },
|
|
139
|
+
{ ref: params.endRef, element: params.endElement },
|
|
140
|
+
]);
|
|
141
|
+
await tab.waitForCompletion(async () => {
|
|
142
|
+
await startLocator.dragTo(endLocator);
|
|
143
|
+
});
|
|
144
|
+
response.addCode(`await page.${await generateLocator(startLocator)}.dragTo(page.${await generateLocator(endLocator)});`);
|
|
115
145
|
},
|
|
116
146
|
});
|
|
117
|
-
const hover =
|
|
147
|
+
const hover = defineTabTool({
|
|
118
148
|
capability: 'core',
|
|
119
149
|
schema: {
|
|
120
150
|
name: 'browser_hover',
|
|
@@ -123,67 +153,19 @@ const hover = defineTool({
|
|
|
123
153
|
inputSchema: elementSchema,
|
|
124
154
|
type: 'readOnly',
|
|
125
155
|
},
|
|
126
|
-
handle: async (
|
|
127
|
-
|
|
128
|
-
const locator =
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return {
|
|
134
|
-
code,
|
|
135
|
-
action: () => locator.hover(),
|
|
136
|
-
captureSnapshot: true,
|
|
137
|
-
waitForNetwork: true,
|
|
138
|
-
};
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
const typeSchema = elementSchema.extend({
|
|
142
|
-
text: z.string().describe('Text to type into the element'),
|
|
143
|
-
submit: z.boolean().optional().describe('Whether to submit entered text (press Enter after)'),
|
|
144
|
-
slowly: z.boolean().optional().describe('Whether to type one character at a time. Useful for triggering key handlers in the page. By default entire text is filled in at once.'),
|
|
145
|
-
});
|
|
146
|
-
const type = defineTool({
|
|
147
|
-
capability: 'core',
|
|
148
|
-
schema: {
|
|
149
|
-
name: 'browser_type',
|
|
150
|
-
title: 'Type text',
|
|
151
|
-
description: 'Type text into editable element',
|
|
152
|
-
inputSchema: typeSchema,
|
|
153
|
-
type: 'destructive',
|
|
154
|
-
},
|
|
155
|
-
handle: async (context, params) => {
|
|
156
|
-
const snapshot = context.currentTabOrDie().snapshotOrDie();
|
|
157
|
-
const locator = snapshot.refLocator(params);
|
|
158
|
-
const code = [];
|
|
159
|
-
const steps = [];
|
|
160
|
-
if (params.slowly) {
|
|
161
|
-
code.push(`// Press "${params.text}" sequentially into "${params.element}"`);
|
|
162
|
-
code.push(`await page.${await generateLocator(locator)}.pressSequentially(${javascript.quote(params.text)});`);
|
|
163
|
-
steps.push(() => locator.pressSequentially(params.text));
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
code.push(`// Fill "${params.text}" into "${params.element}"`);
|
|
167
|
-
code.push(`await page.${await generateLocator(locator)}.fill(${javascript.quote(params.text)});`);
|
|
168
|
-
steps.push(() => locator.fill(params.text));
|
|
169
|
-
}
|
|
170
|
-
if (params.submit) {
|
|
171
|
-
code.push(`// Submit text`);
|
|
172
|
-
code.push(`await page.${await generateLocator(locator)}.press('Enter');`);
|
|
173
|
-
steps.push(() => locator.press('Enter'));
|
|
174
|
-
}
|
|
175
|
-
return {
|
|
176
|
-
code,
|
|
177
|
-
action: () => steps.reduce((acc, step) => acc.then(step), Promise.resolve()),
|
|
178
|
-
captureSnapshot: true,
|
|
179
|
-
waitForNetwork: true,
|
|
180
|
-
};
|
|
156
|
+
handle: async (tab, params, response) => {
|
|
157
|
+
response.setIncludeSnapshot();
|
|
158
|
+
const locator = await tab.refLocator(params);
|
|
159
|
+
response.addCode(`await page.${await generateLocator(locator)}.hover();`);
|
|
160
|
+
await tab.waitForCompletion(async () => {
|
|
161
|
+
await locator.hover();
|
|
162
|
+
});
|
|
181
163
|
},
|
|
182
164
|
});
|
|
183
165
|
const selectOptionSchema = elementSchema.extend({
|
|
184
166
|
values: z.array(z.string()).describe('Array of values to select in the dropdown. This can be a single value or multiple values.'),
|
|
185
167
|
});
|
|
186
|
-
const selectOption =
|
|
168
|
+
const selectOption = defineTabTool({
|
|
187
169
|
capability: 'core',
|
|
188
170
|
schema: {
|
|
189
171
|
name: 'browser_select_option',
|
|
@@ -192,54 +174,21 @@ const selectOption = defineTool({
|
|
|
192
174
|
inputSchema: selectOptionSchema,
|
|
193
175
|
type: 'destructive',
|
|
194
176
|
},
|
|
195
|
-
handle: async (
|
|
196
|
-
|
|
197
|
-
const locator =
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
return {
|
|
203
|
-
code,
|
|
204
|
-
action: () => locator.selectOption(params.values).then(() => {
|
|
205
|
-
}),
|
|
206
|
-
captureSnapshot: true,
|
|
207
|
-
waitForNetwork: true,
|
|
208
|
-
};
|
|
209
|
-
},
|
|
210
|
-
});
|
|
211
|
-
const scanPage = defineTool({
|
|
212
|
-
capability: 'core',
|
|
213
|
-
schema: {
|
|
214
|
-
name: 'scan_page',
|
|
215
|
-
title: 'Scan page for accessibility violations',
|
|
216
|
-
description: 'Scan the current page for accessibility violations using Axe',
|
|
217
|
-
inputSchema: scanPageSchema,
|
|
218
|
-
type: 'destructive',
|
|
219
|
-
},
|
|
220
|
-
handle: async (context, params) => {
|
|
221
|
-
const tab = context.currentTabOrDie();
|
|
222
|
-
const axe = new AxeBuilder({ page: tab.page }).withTags(params.violationsTag);
|
|
223
|
-
return {
|
|
224
|
-
code: [`// Scan page for accessibility violations with tags: ${params.violationsTag.join(', ')}`],
|
|
225
|
-
action: async () => {
|
|
226
|
-
const results = await axe.analyze();
|
|
227
|
-
return {
|
|
228
|
-
content: [{ type: 'text', text: JSON.stringify(results, null, 2) }],
|
|
229
|
-
};
|
|
230
|
-
},
|
|
231
|
-
captureSnapshot: true,
|
|
232
|
-
waitForNetwork: true,
|
|
233
|
-
};
|
|
177
|
+
handle: async (tab, params, response) => {
|
|
178
|
+
response.setIncludeSnapshot();
|
|
179
|
+
const locator = await tab.refLocator(params);
|
|
180
|
+
response.addCode(`await page.${await generateLocator(locator)}.selectOption(${javascript.formatObject(params.values)});`);
|
|
181
|
+
await tab.waitForCompletion(async () => {
|
|
182
|
+
await locator.selectOption(params.values);
|
|
183
|
+
});
|
|
234
184
|
},
|
|
235
185
|
});
|
|
236
186
|
export default [
|
|
237
187
|
snapshot,
|
|
238
188
|
click,
|
|
239
|
-
scanPage,
|
|
240
189
|
drag,
|
|
241
190
|
hover,
|
|
242
|
-
type,
|
|
243
191
|
selectOption,
|
|
192
|
+
scanPage
|
|
244
193
|
];
|
|
245
194
|
//# sourceMappingURL=snapshot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/tools/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/tools/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,aAAa,EAAE,UAAU,EAAC,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAC3C,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAG9C,MAAM,SAAS,GAAG;IACd,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW;IACnE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW;IACzE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB;IAClE,aAAa,EAAE,eAAe,EAAE,6BAA6B;IAC7D,eAAe,EAAE,YAAY,EAAE,uBAAuB,EAAE,oBAAoB;CACtE,CAAC;AAGX,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,aAAa,EAAE,CAAC;SACX,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;SACvB,QAAQ,CAAC,uFAAuF,CAAC;CACzG,CAAC,CAAC;AAMH,MAAM,oBAAoB,GAAG,CAAC,KAAgB,EAAa,EAAE;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAC,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACb,OAAO,KAAK,CAAC;QAEjB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACJ,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EAAE,8DAA8D;QAC3E,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,aAAa;KACtB;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE5E,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;QAEpC,QAAQ,CAAC,SAAS,CAAC;YACf,QAAQ,OAAO,CAAC,GAAG,EAAE;YACrB,EAAE;YACF,eAAe,OAAO,CAAC,UAAU,CAAC,MAAM,iBAAiB,OAAO,CAAC,UAAU,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,CAAC,MAAM,mBAAmB,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE;SACvK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAGd,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACrC,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAE1D,QAAQ,CAAC,SAAS,CAAC;gBACf,EAAE;gBACF,UAAU,SAAS,CAAC,IAAI,EAAE;gBAC1B,eAAe,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACJ,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,oFAAoF;QACjG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,EAAE,UAAU;KACnB;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACxC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAClC,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2FAA2F,CAAC;IACzH,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;CACpF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;IAC3G,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CACvG,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,aAAa,CAAC;IACxB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACJ,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,6BAA6B;QAC1C,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,aAAa;KACtB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACpC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3D,IAAI,MAAM,CAAC,WAAW;YAClB,QAAQ,CAAC,OAAO,CAAC,cAAc,MAAM,eAAe,CAAC,OAAO,CAAC,aAAa,UAAU,IAAI,CAAC,CAAC;;YAE1F,QAAQ,CAAC,OAAO,CAAC,cAAc,MAAM,eAAe,CAAC,OAAO,CAAC,UAAU,UAAU,IAAI,CAAC,CAAC;QAG3F,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACnC,IAAI,MAAM,CAAC,WAAW;gBAClB,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;;gBAEjC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,aAAa,CAAC;IACvB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACJ,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,4CAA4C;QACzD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YAClB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sGAAsG,CAAC;YACzI,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YACtF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sGAAsG,CAAC;YACvI,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;SACvF,CAAC;QACF,IAAI,EAAE,aAAa;KACtB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACpC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAE9B,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC;YACrD,EAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAC;YACpD,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAC;SACnD,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,OAAO,CAAC,cAAc,MAAM,eAAe,CAAC,YAAY,CAAC,gBAAgB,MAAM,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7H,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,aAAa,CAAC;IACxB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACJ,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,4BAA4B;QACzC,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,UAAU;KACnB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACpC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7C,QAAQ,CAAC,OAAO,CAAC,cAAc,MAAM,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE1E,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,2FAA2F,CAAC;CACpI,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,aAAa,CAAC;IAC/B,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACJ,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,gCAAgC;QAC7C,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,aAAa;KACtB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACpC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7C,QAAQ,CAAC,OAAO,CAAC,cAAc,MAAM,eAAe,CAAC,OAAO,CAAC,iBAAiB,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE1H,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe;IACX,QAAQ;IACR,KAAK;IACL,IAAI;IACJ,KAAK;IACL,YAAY;IACZ,QAAQ;CACX,CAAC"}
|
package/lib/tools/tabs.js
CHANGED
|
@@ -15,105 +15,90 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { z } from 'zod';
|
|
17
17
|
import { defineTool } from './tool.js';
|
|
18
|
-
const
|
|
19
|
-
|
|
18
|
+
const SECOND = 1000;
|
|
19
|
+
const MINUTE = 60 * SECOND;
|
|
20
|
+
const browserTabs = defineTool({
|
|
21
|
+
capability: 'core-tabs',
|
|
20
22
|
schema: {
|
|
21
|
-
name: '
|
|
22
|
-
title: '
|
|
23
|
-
description: 'List browser
|
|
24
|
-
inputSchema: z.object({}),
|
|
25
|
-
type: 'readOnly',
|
|
26
|
-
},
|
|
27
|
-
handle: async (context) => {
|
|
28
|
-
await context.ensureTab();
|
|
29
|
-
return {
|
|
30
|
-
code: [`// <internal code to list tabs>`],
|
|
31
|
-
captureSnapshot: false,
|
|
32
|
-
waitForNetwork: false,
|
|
33
|
-
resultOverride: {
|
|
34
|
-
content: [{
|
|
35
|
-
type: 'text',
|
|
36
|
-
text: await context.listTabsMarkdown(),
|
|
37
|
-
}],
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
const selectTab = captureSnapshot => defineTool({
|
|
43
|
-
capability: 'tabs',
|
|
44
|
-
schema: {
|
|
45
|
-
name: 'browser_tab_select',
|
|
46
|
-
title: 'Select a tab',
|
|
47
|
-
description: 'Select a tab by index',
|
|
23
|
+
name: 'browser_tabs',
|
|
24
|
+
title: 'Manage tabs',
|
|
25
|
+
description: 'List, create, close, or select a browser tab.',
|
|
48
26
|
inputSchema: z.object({
|
|
49
|
-
|
|
27
|
+
action: z.enum(['list', 'new', 'close', 'select']).describe('Operation to perform'),
|
|
28
|
+
index: z.number().optional().describe('Tab index, used for close/select. If omitted for close, current tab is closed.'),
|
|
50
29
|
}),
|
|
51
|
-
type: '
|
|
30
|
+
type: 'destructive',
|
|
52
31
|
},
|
|
53
|
-
handle: async (context, params) => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
32
|
+
handle: async (context, params, response) => {
|
|
33
|
+
switch (params.action) {
|
|
34
|
+
case 'list': {
|
|
35
|
+
await context.ensureTab();
|
|
36
|
+
response.setIncludeTabs();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
case 'new': {
|
|
40
|
+
await context.newTab();
|
|
41
|
+
response.setIncludeTabs();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
case 'close': {
|
|
45
|
+
await context.closeTab(params.index);
|
|
46
|
+
response.setIncludeSnapshot();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
case 'select': {
|
|
50
|
+
if (params.index === undefined)
|
|
51
|
+
throw new Error('Tab index is required');
|
|
52
|
+
await context.selectTab(params.index);
|
|
53
|
+
response.setIncludeSnapshot();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
63
57
|
},
|
|
64
58
|
});
|
|
65
|
-
const
|
|
66
|
-
capability: 'tabs',
|
|
59
|
+
const navigationTimeout = defineTool({
|
|
60
|
+
capability: 'core-tabs',
|
|
67
61
|
schema: {
|
|
68
|
-
name: '
|
|
69
|
-
title: '
|
|
70
|
-
description: '
|
|
62
|
+
name: 'browser_navigation_timeout',
|
|
63
|
+
title: 'Navigation timeout',
|
|
64
|
+
description: 'Sets the timeout for navigation and page load actions. Only affects the current tab and does not persist across browser context recreation.',
|
|
71
65
|
inputSchema: z.object({
|
|
72
|
-
|
|
66
|
+
timeout: z.number().min(SECOND * 30).max(MINUTE * 20).describe('Timeout in milliseconds for navigation (0-300000ms)'),
|
|
73
67
|
}),
|
|
74
|
-
type: '
|
|
68
|
+
type: 'destructive',
|
|
75
69
|
},
|
|
76
|
-
handle: async (context, params) => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
code,
|
|
85
|
-
captureSnapshot,
|
|
86
|
-
waitForNetwork: false
|
|
87
|
-
};
|
|
70
|
+
handle: async (context, params, response) => {
|
|
71
|
+
const tabs = context.tabs();
|
|
72
|
+
for (const tab of tabs) {
|
|
73
|
+
tab.page.setDefaultNavigationTimeout(params.timeout);
|
|
74
|
+
}
|
|
75
|
+
response.addResult(`Navigation timeout set to ${params.timeout}ms for all tabs.`);
|
|
76
|
+
response.setIncludeTabs();
|
|
88
77
|
},
|
|
89
78
|
});
|
|
90
|
-
const
|
|
91
|
-
capability: 'tabs',
|
|
79
|
+
const defaultTimeout = defineTool({
|
|
80
|
+
capability: 'core-tabs',
|
|
92
81
|
schema: {
|
|
93
|
-
name: '
|
|
94
|
-
title: '
|
|
95
|
-
description: '
|
|
82
|
+
name: 'browser_default_timeout',
|
|
83
|
+
title: 'Default timeout',
|
|
84
|
+
description: 'Sets the default timeout for all Playwright operations (clicks, fills, etc). Only affects existing tabs and does not persist across browser context recreation.',
|
|
96
85
|
inputSchema: z.object({
|
|
97
|
-
|
|
86
|
+
timeout: z.number().min(SECOND * 30).max(MINUTE * 20).describe('Timeout in milliseconds for default operations (0-300000ms)'),
|
|
98
87
|
}),
|
|
99
88
|
type: 'destructive',
|
|
100
89
|
},
|
|
101
|
-
handle: async (context, params) => {
|
|
102
|
-
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
captureSnapshot,
|
|
109
|
-
waitForNetwork: false
|
|
110
|
-
};
|
|
90
|
+
handle: async (context, params, response) => {
|
|
91
|
+
const tabs = context.tabs();
|
|
92
|
+
for (const tab of tabs) {
|
|
93
|
+
tab.page.setDefaultTimeout(params.timeout);
|
|
94
|
+
}
|
|
95
|
+
response.addResult(`Default timeout set to ${params.timeout}ms for all tabs.`);
|
|
96
|
+
response.setIncludeTabs();
|
|
111
97
|
},
|
|
112
98
|
});
|
|
113
|
-
export default
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
closeTab(captureSnapshot),
|
|
99
|
+
export default [
|
|
100
|
+
browserTabs,
|
|
101
|
+
navigationTimeout,
|
|
102
|
+
defaultTimeout
|
|
118
103
|
];
|
|
119
104
|
//# sourceMappingURL=tabs.js.map
|
package/lib/tools/tabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/tools/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/tools/tabs.ts"],"names":[],"mappings":"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"}
|
package/lib/tools/tool.js
CHANGED
|
@@ -16,4 +16,19 @@
|
|
|
16
16
|
export function defineTool(tool) {
|
|
17
17
|
return tool;
|
|
18
18
|
}
|
|
19
|
+
export function defineTabTool(tool) {
|
|
20
|
+
return {
|
|
21
|
+
...tool,
|
|
22
|
+
handle: async (context, params, response) => {
|
|
23
|
+
const tab = context.currentTabOrDie();
|
|
24
|
+
const modalStates = tab.modalStates().map(state => state.type);
|
|
25
|
+
if (tool.clearsModalState && !modalStates.includes(tool.clearsModalState))
|
|
26
|
+
response.addError(`Error: The tool "${tool.schema.name}" can only be used when there is related modal state present.\n` + tab.modalStatesMarkdown().join('\n'));
|
|
27
|
+
else if (!tool.clearsModalState && modalStates.length)
|
|
28
|
+
response.addError(`Error: Tool "${tool.schema.name}" does not handle the modal state.\n` + tab.modalStatesMarkdown().join('\n'));
|
|
29
|
+
else
|
|
30
|
+
return tool.handle(tab, params, response);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
19
34
|
//# sourceMappingURL=tool.js.map
|
package/lib/tools/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA8BH,MAAM,UAAU,UAAU,CAAyB,IAAiB;IAClE,OAAO,IAAI,CAAC;AACd,CAAC;AASD,MAAM,UAAU,aAAa,CAAyB,IAAoB;IACxE,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;YAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBACvE,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,IAAI,iEAAiE,GAAG,GAAG,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;iBAC7J,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,WAAW,CAAC,MAAM;gBACnD,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,IAAI,sCAAsC,GAAG,GAAG,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;gBAEjI,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC;AACJ,CAAC"}
|