openchrome-mcp 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/chrome/launcher.d.ts.map +1 -1
  2. package/dist/chrome/launcher.js +1 -3
  3. package/dist/chrome/launcher.js.map +1 -1
  4. package/dist/cli/index.js +10 -6
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/hints/rules/composite-suggestions.d.ts.map +1 -1
  7. package/dist/hints/rules/composite-suggestions.js +28 -1
  8. package/dist/hints/rules/composite-suggestions.js.map +1 -1
  9. package/dist/mcp-server.d.ts.map +1 -1
  10. package/dist/mcp-server.js +4 -2
  11. package/dist/mcp-server.js.map +1 -1
  12. package/dist/orchestration/workflow-engine.js +1 -1
  13. package/dist/orchestration/workflow-engine.js.map +1 -1
  14. package/dist/router/tool-routing-registry.js +5 -6
  15. package/dist/router/tool-routing-registry.js.map +1 -1
  16. package/dist/tools/batch-execute.d.ts.map +1 -1
  17. package/dist/tools/batch-execute.js +6 -9
  18. package/dist/tools/batch-execute.js.map +1 -1
  19. package/dist/tools/batch-paginate.d.ts.map +1 -1
  20. package/dist/tools/batch-paginate.js +11 -12
  21. package/dist/tools/batch-paginate.js.map +1 -1
  22. package/dist/tools/click-element.js +5 -5
  23. package/dist/tools/click-element.js.map +1 -1
  24. package/dist/tools/computer.js +3 -3
  25. package/dist/tools/computer.js.map +1 -1
  26. package/dist/tools/console-capture.js +3 -3
  27. package/dist/tools/console-capture.js.map +1 -1
  28. package/dist/tools/cookies.js +9 -9
  29. package/dist/tools/cookies.js.map +1 -1
  30. package/dist/tools/drag-drop.d.ts.map +1 -1
  31. package/dist/tools/drag-drop.js +9 -10
  32. package/dist/tools/drag-drop.js.map +1 -1
  33. package/dist/tools/emulate-device.js +5 -5
  34. package/dist/tools/emulate-device.js.map +1 -1
  35. package/dist/tools/file-upload.d.ts.map +1 -1
  36. package/dist/tools/file-upload.js +1 -2
  37. package/dist/tools/file-upload.js.map +1 -1
  38. package/dist/tools/fill-form.js +4 -4
  39. package/dist/tools/fill-form.js.map +1 -1
  40. package/dist/tools/find.d.ts.map +1 -1
  41. package/dist/tools/find.js +2 -2
  42. package/dist/tools/find.js.map +1 -1
  43. package/dist/tools/form-input.js +3 -3
  44. package/dist/tools/form-input.js.map +1 -1
  45. package/dist/tools/geolocation.js +3 -3
  46. package/dist/tools/geolocation.js.map +1 -1
  47. package/dist/tools/http-auth.js +5 -5
  48. package/dist/tools/http-auth.js.map +1 -1
  49. package/dist/tools/index.d.ts.map +1 -1
  50. package/dist/tools/index.js +5 -10
  51. package/dist/tools/index.js.map +1 -1
  52. package/dist/tools/inspect.d.ts.map +1 -1
  53. package/dist/tools/inspect.js +3 -3
  54. package/dist/tools/inspect.js.map +1 -1
  55. package/dist/tools/interact.d.ts.map +1 -1
  56. package/dist/tools/interact.js +5 -5
  57. package/dist/tools/interact.js.map +1 -1
  58. package/dist/tools/javascript.d.ts.map +1 -1
  59. package/dist/tools/javascript.js +4 -4
  60. package/dist/tools/javascript.js.map +1 -1
  61. package/dist/tools/lightweight-scroll.d.ts.map +1 -1
  62. package/dist/tools/lightweight-scroll.js +6 -9
  63. package/dist/tools/lightweight-scroll.js.map +1 -1
  64. package/dist/tools/memory.d.ts +7 -4
  65. package/dist/tools/memory.d.ts.map +1 -1
  66. package/dist/tools/memory.js +84 -66
  67. package/dist/tools/memory.js.map +1 -1
  68. package/dist/tools/navigate.d.ts.map +1 -1
  69. package/dist/tools/navigate.js +4 -4
  70. package/dist/tools/navigate.js.map +1 -1
  71. package/dist/tools/network.d.ts.map +1 -1
  72. package/dist/tools/network.js +6 -6
  73. package/dist/tools/network.js.map +1 -1
  74. package/dist/tools/orchestration.d.ts.map +1 -1
  75. package/dist/tools/orchestration.js +19 -32
  76. package/dist/tools/orchestration.js.map +1 -1
  77. package/dist/tools/page-content.d.ts.map +1 -1
  78. package/dist/tools/page-content.js +3 -5
  79. package/dist/tools/page-content.js.map +1 -1
  80. package/dist/tools/page-pdf.d.ts.map +1 -1
  81. package/dist/tools/page-pdf.js +14 -16
  82. package/dist/tools/page-pdf.js.map +1 -1
  83. package/dist/tools/page-reload.js +2 -2
  84. package/dist/tools/page-reload.js.map +1 -1
  85. package/dist/tools/performance-metrics.d.ts.map +1 -1
  86. package/dist/tools/performance-metrics.js +3 -8
  87. package/dist/tools/performance-metrics.js.map +1 -1
  88. package/dist/tools/profile-status.d.ts.map +1 -1
  89. package/dist/tools/profile-status.js +1 -5
  90. package/dist/tools/profile-status.js.map +1 -1
  91. package/dist/tools/query-dom.d.ts +8 -0
  92. package/dist/tools/query-dom.d.ts.map +1 -0
  93. package/dist/tools/query-dom.js +421 -0
  94. package/dist/tools/query-dom.js.map +1 -0
  95. package/dist/tools/read-page.d.ts.map +1 -1
  96. package/dist/tools/read-page.js +61 -34
  97. package/dist/tools/read-page.js.map +1 -1
  98. package/dist/tools/request-intercept.js +6 -6
  99. package/dist/tools/request-intercept.js.map +1 -1
  100. package/dist/tools/shutdown.d.ts.map +1 -1
  101. package/dist/tools/shutdown.js +2 -5
  102. package/dist/tools/shutdown.js.map +1 -1
  103. package/dist/tools/storage.js +4 -4
  104. package/dist/tools/storage.js.map +1 -1
  105. package/dist/tools/tabs-close.d.ts.map +1 -1
  106. package/dist/tools/tabs-close.js +1 -1
  107. package/dist/tools/tabs-close.js.map +1 -1
  108. package/dist/tools/tabs-context.d.ts.map +1 -1
  109. package/dist/tools/tabs-context.js +3 -3
  110. package/dist/tools/tabs-context.js.map +1 -1
  111. package/dist/tools/tabs-create.js +3 -3
  112. package/dist/tools/tabs-create.js.map +1 -1
  113. package/dist/tools/user-agent.js +3 -3
  114. package/dist/tools/user-agent.js.map +1 -1
  115. package/dist/tools/wait-and-click.js +4 -4
  116. package/dist/tools/wait-and-click.js.map +1 -1
  117. package/dist/tools/wait-for.js +5 -5
  118. package/dist/tools/wait-for.js.map +1 -1
  119. package/dist/tools/worker.d.ts +8 -0
  120. package/dist/tools/worker.d.ts.map +1 -0
  121. package/dist/tools/worker.js +160 -0
  122. package/dist/tools/worker.js.map +1 -0
  123. package/package.json +1 -1
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ /**
3
+ * Query DOM Tool - Unified CSS selector and XPath queries
4
+ *
5
+ * Replaces: selector_query, xpath_query
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.registerQueryDomTool = registerQueryDomTool;
9
+ const session_manager_1 = require("../session-manager");
10
+ // ---------------------------------------------------------------------------
11
+ // Definition
12
+ // ---------------------------------------------------------------------------
13
+ const definition = {
14
+ name: 'query_dom',
15
+ description: 'Query DOM elements via CSS selectors or XPath. Returns tag, attributes, text, and position.',
16
+ inputSchema: {
17
+ type: 'object',
18
+ properties: {
19
+ tabId: {
20
+ type: 'string',
21
+ description: 'Tab ID to query',
22
+ },
23
+ method: {
24
+ type: 'string',
25
+ enum: ['css', 'xpath'],
26
+ description: 'Query method: css or xpath',
27
+ },
28
+ selector: {
29
+ type: 'string',
30
+ description: '(css) CSS selector, e.g. "#search", ".button"',
31
+ },
32
+ xpath: {
33
+ type: 'string',
34
+ description: '(xpath) XPath expression',
35
+ },
36
+ multiple: {
37
+ type: 'boolean',
38
+ description: 'Return all matches. Default: false',
39
+ },
40
+ limit: {
41
+ type: 'number',
42
+ description: '(xpath, multiple) Max results to return',
43
+ },
44
+ },
45
+ required: ['tabId', 'method'],
46
+ },
47
+ };
48
+ // ---------------------------------------------------------------------------
49
+ // CSS handler
50
+ // ---------------------------------------------------------------------------
51
+ async function handleCSS(sessionId, args) {
52
+ const tabId = args.tabId;
53
+ const selector = args.selector;
54
+ const multiple = args.multiple ?? false;
55
+ if (!selector) {
56
+ return {
57
+ content: [{ type: 'text', text: 'Error: selector is required for css method' }],
58
+ isError: true,
59
+ };
60
+ }
61
+ const sessionManager = (0, session_manager_1.getSessionManager)();
62
+ const page = await sessionManager.getPage(sessionId, tabId, undefined, 'query_dom');
63
+ if (!page) {
64
+ return {
65
+ content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
66
+ isError: true,
67
+ };
68
+ }
69
+ if (multiple) {
70
+ const elements = await page.$$(selector);
71
+ if (elements.length === 0) {
72
+ return {
73
+ content: [
74
+ {
75
+ type: 'text',
76
+ text: JSON.stringify({
77
+ action: 'query_dom',
78
+ method: 'css',
79
+ selector,
80
+ multiple: true,
81
+ elements: [],
82
+ count: 0,
83
+ message: `No elements found matching "${selector}"`,
84
+ }),
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ const MAX_SELECTOR_RESULTS = 50;
90
+ const totalCount = elements.length;
91
+ const limitedElements = elements.slice(0, MAX_SELECTOR_RESULTS);
92
+ const elementInfos = [];
93
+ for (let i = 0; i < limitedElements.length; i++) {
94
+ const element = limitedElements[i];
95
+ const info = await page.evaluate((el, index) => {
96
+ const rect = el.getBoundingClientRect();
97
+ const style = window.getComputedStyle(el);
98
+ const isVisible = style.display !== 'none' &&
99
+ style.visibility !== 'hidden' &&
100
+ style.opacity !== '0' &&
101
+ rect.width > 0 &&
102
+ rect.height > 0;
103
+ const attributes = {};
104
+ for (const attr of el.attributes) {
105
+ attributes[attr.name] = attr.value;
106
+ }
107
+ return {
108
+ ref: `ref_${index}`,
109
+ tagName: el.tagName.toLowerCase(),
110
+ id: el.id || null,
111
+ className: el.className,
112
+ attributes,
113
+ textContent: (el.textContent || '').trim().slice(0, 100),
114
+ isVisible,
115
+ boundingBox: rect.width > 0 && rect.height > 0
116
+ ? {
117
+ x: Math.round(rect.x),
118
+ y: Math.round(rect.y),
119
+ width: Math.round(rect.width),
120
+ height: Math.round(rect.height),
121
+ }
122
+ : null,
123
+ };
124
+ }, element, i);
125
+ elementInfos.push(info);
126
+ }
127
+ const result = {
128
+ action: 'query_dom',
129
+ method: 'css',
130
+ selector,
131
+ multiple: true,
132
+ elements: elementInfos,
133
+ count: elementInfos.length,
134
+ };
135
+ if (totalCount > MAX_SELECTOR_RESULTS) {
136
+ result.totalCount = totalCount;
137
+ result.note = `Results limited to first ${MAX_SELECTOR_RESULTS} of ${totalCount} matching elements`;
138
+ }
139
+ return {
140
+ content: [{ type: 'text', text: JSON.stringify(result) }],
141
+ };
142
+ }
143
+ else {
144
+ const element = await page.$(selector);
145
+ if (!element) {
146
+ return {
147
+ content: [
148
+ {
149
+ type: 'text',
150
+ text: JSON.stringify({
151
+ action: 'query_dom',
152
+ method: 'css',
153
+ selector,
154
+ multiple: false,
155
+ element: null,
156
+ message: `No element found matching "${selector}"`,
157
+ }),
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ const info = await page.evaluate((el) => {
163
+ const rect = el.getBoundingClientRect();
164
+ const style = window.getComputedStyle(el);
165
+ const isVisible = style.display !== 'none' &&
166
+ style.visibility !== 'hidden' &&
167
+ style.opacity !== '0' &&
168
+ rect.width > 0 &&
169
+ rect.height > 0;
170
+ const attributes = {};
171
+ for (const attr of el.attributes) {
172
+ attributes[attr.name] = attr.value;
173
+ }
174
+ return {
175
+ ref: 'ref_0',
176
+ tagName: el.tagName.toLowerCase(),
177
+ id: el.id || null,
178
+ className: el.className,
179
+ attributes,
180
+ textContent: (el.textContent || '').trim().slice(0, 100),
181
+ isVisible,
182
+ boundingBox: rect.width > 0 && rect.height > 0
183
+ ? {
184
+ x: Math.round(rect.x),
185
+ y: Math.round(rect.y),
186
+ width: Math.round(rect.width),
187
+ height: Math.round(rect.height),
188
+ }
189
+ : null,
190
+ };
191
+ }, element);
192
+ return {
193
+ content: [
194
+ {
195
+ type: 'text',
196
+ text: JSON.stringify({
197
+ action: 'query_dom',
198
+ method: 'css',
199
+ selector,
200
+ multiple: false,
201
+ element: info,
202
+ }),
203
+ },
204
+ ],
205
+ };
206
+ }
207
+ }
208
+ // ---------------------------------------------------------------------------
209
+ // XPath handler
210
+ // ---------------------------------------------------------------------------
211
+ async function handleXPath(sessionId, args) {
212
+ const tabId = args.tabId;
213
+ const xpath = args.xpath;
214
+ const multiple = args.multiple ?? false;
215
+ const limit = args.limit ?? 50;
216
+ if (!xpath) {
217
+ return {
218
+ content: [{ type: 'text', text: 'Error: xpath is required for xpath method' }],
219
+ isError: true,
220
+ };
221
+ }
222
+ const sessionManager = (0, session_manager_1.getSessionManager)();
223
+ const page = await sessionManager.getPage(sessionId, tabId, undefined, 'query_dom');
224
+ if (!page) {
225
+ return {
226
+ content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
227
+ isError: true,
228
+ };
229
+ }
230
+ if (multiple) {
231
+ const result = await page.evaluate((xpathExpr, maxResults) => {
232
+ function extractElementInfo(element, xpathStr) {
233
+ const tagName = element.tagName.toLowerCase();
234
+ const id = element.id || undefined;
235
+ const classNameAttr = element.getAttribute('class');
236
+ const className = classNameAttr || undefined;
237
+ const text = element.textContent?.trim().slice(0, 200) || undefined;
238
+ const attributes = {};
239
+ for (let i = 0; i < element.attributes.length; i++) {
240
+ const attr = element.attributes[i];
241
+ if (attr.name !== 'id' && attr.name !== 'class') {
242
+ attributes[attr.name] = attr.value.slice(0, 100);
243
+ }
244
+ }
245
+ const rect = element.getBoundingClientRect();
246
+ return {
247
+ tagName,
248
+ id,
249
+ className,
250
+ text,
251
+ attributes,
252
+ rect: {
253
+ x: Math.round(rect.x),
254
+ y: Math.round(rect.y),
255
+ width: Math.round(rect.width),
256
+ height: Math.round(rect.height),
257
+ },
258
+ xpath: xpathStr,
259
+ };
260
+ }
261
+ const xpathResult = document.evaluate(xpathExpr, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
262
+ const elements = [];
263
+ const count = Math.min(xpathResult.snapshotLength, maxResults);
264
+ for (let i = 0; i < count; i++) {
265
+ const node = xpathResult.snapshotItem(i);
266
+ if (node instanceof Element) {
267
+ const simpleXpath = `(${xpathExpr})[${i + 1}]`;
268
+ elements.push(extractElementInfo(node, simpleXpath));
269
+ }
270
+ }
271
+ return {
272
+ elements,
273
+ totalCount: xpathResult.snapshotLength,
274
+ };
275
+ }, xpath, limit);
276
+ return {
277
+ content: [
278
+ {
279
+ type: 'text',
280
+ text: JSON.stringify({
281
+ action: 'query_dom',
282
+ method: 'xpath',
283
+ xpath,
284
+ multiple: true,
285
+ results: result.elements,
286
+ count: result.elements.length,
287
+ totalCount: result.totalCount,
288
+ message: result.elements.length > 0
289
+ ? `Found ${result.totalCount} element(s), returned ${result.elements.length}`
290
+ : 'No elements found',
291
+ }),
292
+ },
293
+ ],
294
+ };
295
+ }
296
+ else {
297
+ const element = await page.evaluate((xpathExpr) => {
298
+ function extractElementInfo(el, xpathStr) {
299
+ const tagName = el.tagName.toLowerCase();
300
+ const id = el.id || undefined;
301
+ const classNameAttr = el.getAttribute('class');
302
+ const className = classNameAttr || undefined;
303
+ const text = el.textContent?.trim().slice(0, 200) || undefined;
304
+ const attributes = {};
305
+ for (let i = 0; i < el.attributes.length; i++) {
306
+ const attr = el.attributes[i];
307
+ if (attr.name !== 'id' && attr.name !== 'class') {
308
+ attributes[attr.name] = attr.value.slice(0, 100);
309
+ }
310
+ }
311
+ const rect = el.getBoundingClientRect();
312
+ return {
313
+ tagName,
314
+ id,
315
+ className,
316
+ text,
317
+ attributes,
318
+ rect: {
319
+ x: Math.round(rect.x),
320
+ y: Math.round(rect.y),
321
+ width: Math.round(rect.width),
322
+ height: Math.round(rect.height),
323
+ },
324
+ xpath: xpathStr,
325
+ };
326
+ }
327
+ const xpathResult = document.evaluate(xpathExpr, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
328
+ const node = xpathResult.singleNodeValue;
329
+ if (!node || !(node instanceof Element)) {
330
+ return null;
331
+ }
332
+ return extractElementInfo(node, xpathExpr);
333
+ }, xpath);
334
+ if (!element) {
335
+ return {
336
+ content: [
337
+ {
338
+ type: 'text',
339
+ text: JSON.stringify({
340
+ action: 'query_dom',
341
+ method: 'xpath',
342
+ xpath,
343
+ multiple: false,
344
+ result: null,
345
+ message: 'No element found matching XPath',
346
+ }),
347
+ },
348
+ ],
349
+ };
350
+ }
351
+ return {
352
+ content: [
353
+ {
354
+ type: 'text',
355
+ text: JSON.stringify({
356
+ action: 'query_dom',
357
+ method: 'xpath',
358
+ xpath,
359
+ multiple: false,
360
+ result: element,
361
+ message: `Found element: <${element.tagName}${element.id ? ` id="${element.id}"` : ''}>`,
362
+ }),
363
+ },
364
+ ],
365
+ };
366
+ }
367
+ }
368
+ // ---------------------------------------------------------------------------
369
+ // Router
370
+ // ---------------------------------------------------------------------------
371
+ const handler = async (sessionId, args) => {
372
+ const tabId = args.tabId;
373
+ const method = args.method;
374
+ if (!tabId) {
375
+ return {
376
+ content: [{ type: 'text', text: 'Error: tabId is required' }],
377
+ isError: true,
378
+ };
379
+ }
380
+ try {
381
+ switch (method) {
382
+ case 'css':
383
+ return await handleCSS(sessionId, args);
384
+ case 'xpath':
385
+ return await handleXPath(sessionId, args);
386
+ default:
387
+ return {
388
+ content: [
389
+ {
390
+ type: 'text',
391
+ text: `Error: Unknown method "${method}". Use "css" or "xpath".`,
392
+ },
393
+ ],
394
+ isError: true,
395
+ };
396
+ }
397
+ }
398
+ catch (error) {
399
+ const errorMessage = error instanceof Error ? error.message : String(error);
400
+ // Check for XPath syntax errors
401
+ if (method === 'xpath' && (errorMessage.includes('XPath') || errorMessage.includes('syntax'))) {
402
+ return {
403
+ content: [{ type: 'text', text: `XPath syntax error: ${errorMessage}` }],
404
+ isError: true,
405
+ };
406
+ }
407
+ return {
408
+ content: [
409
+ {
410
+ type: 'text',
411
+ text: `DOM query error: ${errorMessage}`,
412
+ },
413
+ ],
414
+ isError: true,
415
+ };
416
+ }
417
+ };
418
+ function registerQueryDomTool(server) {
419
+ server.registerTool('query_dom', handler, definition);
420
+ }
421
+ //# sourceMappingURL=query-dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-dom.js","sourceRoot":"","sources":["../../src/tools/query-dom.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAogBH,oDAEC;AAlgBD,wDAAuD;AA2BvD,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,UAAU,GAAsB;IACpC,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,6FAA6F;IAC/F,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iBAAiB;aAC/B;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;gBACtB,WAAW,EAAE,4BAA4B;aAC1C;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+CAA+C;aAC7D;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0BAA0B;aACxC;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,oCAAoC;aAClD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;aACvD;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;KAC9B;CACF,CAAC;AAEF,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,KAAK,UAAU,SAAS,CACtB,SAAiB,EACjB,IAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;IACzC,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAoB,IAAI,KAAK,CAAC;IAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4CAA4C,EAAE,CAAC;YAC/E,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,IAAA,mCAAiB,GAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACpF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,YAAY,EAAE,CAAC;YAClE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,WAAW;4BACnB,MAAM,EAAE,KAAK;4BACb,QAAQ;4BACR,QAAQ,EAAE,IAAI;4BACd,QAAQ,EAAE,EAAE;4BACZ,KAAK,EAAE,CAAC;4BACR,OAAO,EAAE,+BAA+B,QAAQ,GAAG;yBACpD,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,oBAAoB,GAAG,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;QACnC,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAChE,MAAM,YAAY,GAAqB,EAAE,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAC9B,CAAC,EAAW,EAAE,KAAa,EAAkB,EAAE;gBAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC1C,MAAM,SAAS,GACb,KAAK,CAAC,OAAO,KAAK,MAAM;oBACxB,KAAK,CAAC,UAAU,KAAK,QAAQ;oBAC7B,KAAK,CAAC,OAAO,KAAK,GAAG;oBACrB,IAAI,CAAC,KAAK,GAAG,CAAC;oBACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBAElB,MAAM,UAAU,GAA2B,EAAE,CAAC;gBAC9C,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;oBACjC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;gBACrC,CAAC;gBAED,OAAO;oBACL,GAAG,EAAE,OAAO,KAAK,EAAE;oBACnB,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;oBACjC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI;oBACjB,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,UAAU;oBACV,WAAW,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACxD,SAAS;oBACT,WAAW,EACT,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;wBAC/B,CAAC,CAAC;4BACE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;4BACrB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;4BACrB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;4BAC7B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;yBAChC;wBACH,CAAC,CAAC,IAAI;iBACX,CAAC;YACJ,CAAC,EACD,OAAO,EACP,CAAC,CACF,CAAC;YACF,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAA4B;YACtC,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,KAAK;YACb,QAAQ;YACR,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,YAAY,CAAC,MAAM;SAC3B,CAAC;QACF,IAAI,UAAU,GAAG,oBAAoB,EAAE,CAAC;YACtC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YAC/B,MAAM,CAAC,IAAI,GAAG,4BAA4B,oBAAoB,OAAO,UAAU,oBAAoB,CAAC;QACtG,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;SAC1D,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,WAAW;4BACnB,MAAM,EAAE,KAAK;4BACb,QAAQ;4BACR,QAAQ,EAAE,KAAK;4BACf,OAAO,EAAE,IAAI;4BACb,OAAO,EAAE,8BAA8B,QAAQ,GAAG;yBACnD,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAW,EAAkB,EAAE;YAC/D,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,SAAS,GACb,KAAK,CAAC,OAAO,KAAK,MAAM;gBACxB,KAAK,CAAC,UAAU,KAAK,QAAQ;gBAC7B,KAAK,CAAC,OAAO,KAAK,GAAG;gBACrB,IAAI,CAAC,KAAK,GAAG,CAAC;gBACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAElB,MAAM,UAAU,GAA2B,EAAE,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;gBACjC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACrC,CAAC;YAED,OAAO;gBACL,GAAG,EAAE,OAAO;gBACZ,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;gBACjC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI;gBACjB,SAAS,EAAE,EAAE,CAAC,SAAS;gBACvB,UAAU;gBACV,WAAW,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACxD,SAAS;gBACT,WAAW,EACT,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAC/B,CAAC,CAAC;wBACE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACrB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACrB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;wBAC7B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;qBAChC;oBACH,CAAC,CAAC,IAAI;aACX,CAAC;QACJ,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,KAAK;wBACb,QAAQ;wBACR,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,IAAI;qBACd,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,KAAK,UAAU,WAAW,CACxB,SAAiB,EACjB,IAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAgC,IAAI,KAAK,CAAC;IACjE,MAAM,KAAK,GAAI,IAAI,CAAC,KAA4B,IAAI,EAAE,CAAC;IAEvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC;YAC9E,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,IAAA,mCAAiB,GAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACpF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,YAAY,EAAE,CAAC;YAClE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,CAAC,SAAiB,EAAE,UAAkB,EAAE,EAAE;YACxC,SAAS,kBAAkB,CAAC,OAAgB,EAAE,QAAgB;gBAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,SAAS,CAAC;gBACnC,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACpD,MAAM,SAAS,GAAG,aAAa,IAAI,SAAS,CAAC;gBAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;gBAEpE,MAAM,UAAU,GAA2B,EAAE,CAAC;gBAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBACnC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBAChD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;gBAED,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;gBAE7C,OAAO;oBACL,OAAO;oBACP,EAAE;oBACF,SAAS;oBACT,IAAI;oBACJ,UAAU;oBACV,IAAI,EAAE;wBACJ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACrB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACrB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;wBAC7B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;qBAChC;oBACD,KAAK,EAAE,QAAQ;iBAChB,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CACnC,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,WAAW,CAAC,0BAA0B,EACtC,IAAI,CACL,CAAC;YAEF,MAAM,QAAQ,GAA4C,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YAE/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBACzC,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;oBAC5B,MAAM,WAAW,GAAG,IAAI,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;oBAC/C,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YAED,OAAO;gBACL,QAAQ;gBACR,UAAU,EAAE,WAAW,CAAC,cAAc;aACvC,CAAC;QACJ,CAAC,EACD,KAAK,EACL,KAAK,CACN,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,OAAO;wBACf,KAAK;wBACL,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE,MAAM,CAAC,QAAQ;wBACxB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;wBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;wBAC7B,OAAO,EACL,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;4BACxB,CAAC,CAAC,SAAS,MAAM,CAAC,UAAU,yBAAyB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;4BAC7E,CAAC,CAAC,mBAAmB;qBAC1B,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAiB,EAAE,EAAE;YACxD,SAAS,kBAAkB,CAAC,EAAW,EAAE,QAAgB;gBACvD,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACzC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,SAAS,CAAC;gBAC9B,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,SAAS,GAAG,aAAa,IAAI,SAAS,CAAC;gBAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;gBAE/D,MAAM,UAAU,GAA2B,EAAE,CAAC;gBAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBAChD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;gBAED,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;gBAExC,OAAO;oBACL,OAAO;oBACP,EAAE;oBACF,SAAS;oBACT,IAAI;oBACJ,UAAU;oBACV,IAAI,EAAE;wBACJ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACrB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACrB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;wBAC7B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;qBAChC;oBACD,KAAK,EAAE,QAAQ;iBAChB,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CACnC,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,WAAW,CAAC,uBAAuB,EACnC,IAAI,CACL,CAAC;YAEF,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,CAAC;YACzC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,YAAY,OAAO,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,WAAW;4BACnB,MAAM,EAAE,OAAO;4BACf,KAAK;4BACL,QAAQ,EAAE,KAAK;4BACf,MAAM,EAAE,IAAI;4BACZ,OAAO,EAAE,iCAAiC;yBAC3C,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,OAAO;wBACf,KAAK;wBACL,QAAQ,EAAE,KAAK;wBACf,MAAM,EAAE,OAAO;wBACf,OAAO,EAAE,mBAAmB,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;qBACzF,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,OAAO,GAAgB,KAAK,EAChC,SAAiB,EACjB,IAA6B,EACT,EAAE;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAgB,CAAC;IAErC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;YAC7D,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,OAAO,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC1C,KAAK,OAAO;gBACV,OAAO,MAAM,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5C;gBACE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,0BAA0B,MAAM,0BAA0B;yBACjE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5E,gCAAgC;QAChC,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC9F,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,YAAY,EAAE,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oBAAoB,YAAY,EAAE;iBACzC;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,SAAgB,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"read-page.d.ts","sourceRoot":"","sources":["../../src/tools/read-page.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA4e1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE5D"}
1
+ {"version":3,"file":"read-page.d.ts","sourceRoot":"","sources":["../../src/tools/read-page.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAugB1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE5D"}
@@ -25,7 +25,7 @@ function formatPaginationSection(pagination) {
25
25
  }
26
26
  const definition = {
27
27
  name: 'read_page',
28
- description: 'Get page content. Default mode "ax" returns accessibility tree with ref_N identifiers. Mode "dom" returns compact DOM (~5-10x fewer tokens). Mode "css" returns CSS diagnostic info (variables, computed styles, framework detection) use this BEFORE javascript_tool for style inspection or visual debugging.',
28
+ description: 'Get page content as compact DOM (default), accessibility tree (ax), or CSS diagnostics (css). Use css mode BEFORE javascript_tool for style inspection.',
29
29
  inputSchema: {
30
30
  type: 'object',
31
31
  properties: {
@@ -35,29 +35,29 @@ const definition = {
35
35
  },
36
36
  depth: {
37
37
  type: 'number',
38
- description: 'Maximum depth of the tree to traverse (default: 8 for "all", 5 for "interactive")',
38
+ description: 'Max tree depth. Default: 8 (all), 5 (interactive)',
39
39
  },
40
40
  filter: {
41
41
  type: 'string',
42
42
  enum: ['interactive', 'all'],
43
- description: 'Filter elements: "interactive" for buttons/links/inputs only',
43
+ description: 'Filter: "interactive" for buttons/links/inputs only',
44
44
  },
45
45
  ref_id: {
46
46
  type: 'string',
47
- description: 'Reference ID of a parent element to read from',
47
+ description: 'Parent element ref for subtree scoping',
48
48
  },
49
49
  selector: {
50
50
  type: 'string',
51
- description: '(css mode only) CSS selector to inspect specific elements. If omitted, inspects all elements with visual properties.',
51
+ description: 'CSS selector to inspect (css mode only)',
52
52
  },
53
53
  mode: {
54
54
  type: 'string',
55
55
  enum: ['ax', 'dom', 'css'],
56
- description: 'Output mode: "ax" for accessibility tree (default), "dom" for compact DOM, "css" for CSS diagnostics (variables, computed styles, framework detection)',
56
+ description: 'Output mode: dom (default), ax, or css',
57
57
  },
58
58
  includePagination: {
59
59
  type: 'boolean',
60
- description: 'Whether to detect and include pagination info in the output (default: true)',
60
+ description: 'Include pagination info. Default: true',
61
61
  },
62
62
  },
63
63
  required: ['tabId'],
@@ -87,7 +87,7 @@ const handler = async (sessionId, args) => {
87
87
  }
88
88
  const cdpClient = sessionManager.getCDPClient();
89
89
  // Mode dispatch
90
- const mode = args.mode || 'ax';
90
+ const mode = args.mode || 'dom';
91
91
  if (mode !== 'ax' && mode !== 'dom' && mode !== 'css') {
92
92
  return {
93
93
  content: [{ type: 'text', text: `Error: Invalid mode "${mode}". Must be "ax", "dom", or "css".` }],
@@ -250,22 +250,27 @@ const handler = async (sessionId, args) => {
250
250
  };
251
251
  }
252
252
  if (mode === 'dom') {
253
- const refId = args.ref_id;
254
- const depth = args.depth;
255
- const result = await (0, dom_1.serializeDOM)(page, cdpClient, {
256
- maxDepth: depth ?? -1,
257
- filter: filter,
258
- interactiveOnly: filter === 'interactive',
259
- });
260
- let outputText = result.content;
261
- if (refId) {
262
- outputText = '[Note: ref_id is ignored in DOM mode. Use mode "ax" for subtree scoping.]\n\n' + outputText;
253
+ try {
254
+ const refId = args.ref_id;
255
+ const depth = args.depth;
256
+ const result = await (0, dom_1.serializeDOM)(page, cdpClient, {
257
+ maxDepth: depth ?? -1,
258
+ filter: filter,
259
+ interactiveOnly: filter === 'interactive',
260
+ });
261
+ let outputText = result.content;
262
+ if (refId) {
263
+ outputText = '[Note: ref_id is ignored in DOM mode. Use mode "ax" for subtree scoping.]\n\n' + outputText;
264
+ }
265
+ const includePaginationDom = args.includePagination !== false;
266
+ const domPaginationSection = includePaginationDom ? formatPaginationSection(await (0, pagination_detector_1.detectPagination)(page, tabId)) : '';
267
+ return {
268
+ content: [{ type: 'text', text: outputText + domPaginationSection }],
269
+ };
270
+ }
271
+ catch {
272
+ // DOM serialization failed — fall through to AX mode as fallback
263
273
  }
264
- const includePaginationDom = args.includePagination !== false;
265
- const domPaginationSection = includePaginationDom ? formatPaginationSection(await (0, pagination_detector_1.detectPagination)(page, tabId)) : '';
266
- return {
267
- content: [{ type: 'text', text: outputText + domPaginationSection }],
268
- };
269
274
  }
270
275
  // Resolve ref_id to backendDOMNodeId if provided (AX mode subtree scoping)
271
276
  const refIdParam = args.ref_id;
@@ -402,17 +407,39 @@ const handler = async (sessionId, args) => {
402
407
  const includePaginationAx = args.includePagination !== false;
403
408
  const axPaginationSection = includePaginationAx ? formatPaginationSection(await (0, pagination_detector_1.detectPagination)(page, tabId)) : '';
404
409
  if (charCount > MAX_OUTPUT) {
405
- return {
406
- content: [
407
- {
408
- type: 'text',
409
- text: pageStatsLine +
410
- output +
411
- '\n\n[Output truncated. Try mode: "dom" for ~5-10x fewer tokens, or use smaller depth / ref_id to focus on specific element.]' +
412
- axPaginationSection,
413
- },
414
- ],
415
- };
410
+ // Auto-fallback: DOM mode produces complete output at ~5-10x fewer tokens
411
+ try {
412
+ const domResult = await (0, dom_1.serializeDOM)(page, cdpClient, {
413
+ maxDepth: -1,
414
+ filter: filter,
415
+ interactiveOnly: filter === 'interactive',
416
+ });
417
+ const fallbackNote = '\n\n[AX tree exceeded output limit (' + charCount + ' chars). ' +
418
+ 'Auto-switched to DOM mode for complete output. ' +
419
+ 'Use mode: "ax" with ref_id to scope specific subtrees for AX format.]';
420
+ return {
421
+ content: [
422
+ {
423
+ type: 'text',
424
+ text: domResult.content + fallbackNote + axPaginationSection,
425
+ },
426
+ ],
427
+ };
428
+ }
429
+ catch {
430
+ // If DOM serialization fails, fall back to truncated AX (original behavior)
431
+ return {
432
+ content: [
433
+ {
434
+ type: 'text',
435
+ text: pageStatsLine +
436
+ output +
437
+ '\n\n[Output truncated. Try mode: "dom" for ~5-10x fewer tokens, or use smaller depth / ref_id to focus on specific element.]' +
438
+ axPaginationSection,
439
+ },
440
+ ],
441
+ };
442
+ }
416
443
  }
417
444
  return {
418
445
  content: [{ type: 'text', text: pageStatsLine + output + axPaginationSection }],