openchrome-mcp 1.9.0 → 1.9.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 (117) hide show
  1. package/README.md +55 -1
  2. package/dist/cdp/client.d.ts +6 -0
  3. package/dist/cdp/client.d.ts.map +1 -1
  4. package/dist/cdp/client.js +13 -0
  5. package/dist/cdp/client.js.map +1 -1
  6. package/dist/chrome/headed-fallback.d.ts +3 -0
  7. package/dist/chrome/headed-fallback.d.ts.map +1 -1
  8. package/dist/chrome/headed-fallback.js +4 -0
  9. package/dist/chrome/headed-fallback.js.map +1 -1
  10. package/dist/cli/index.js +0 -0
  11. package/dist/config/global.d.ts +1 -0
  12. package/dist/config/global.d.ts.map +1 -1
  13. package/dist/config/global.js.map +1 -1
  14. package/dist/config/tool-tiers.d.ts.map +1 -1
  15. package/dist/config/tool-tiers.js +3 -0
  16. package/dist/config/tool-tiers.js.map +1 -1
  17. package/dist/connect/clipboard.d.ts +6 -0
  18. package/dist/connect/clipboard.d.ts.map +1 -0
  19. package/dist/connect/clipboard.js +54 -0
  20. package/dist/connect/clipboard.js.map +1 -0
  21. package/dist/connect/config-generator.d.ts +9 -0
  22. package/dist/connect/config-generator.d.ts.map +1 -0
  23. package/dist/connect/config-generator.js +43 -0
  24. package/dist/connect/config-generator.js.map +1 -0
  25. package/dist/connect/hosts.d.ts +9 -0
  26. package/dist/connect/hosts.d.ts.map +1 -0
  27. package/dist/connect/hosts.js +81 -0
  28. package/dist/connect/hosts.js.map +1 -0
  29. package/dist/connect/index.d.ts +8 -0
  30. package/dist/connect/index.d.ts.map +1 -0
  31. package/dist/connect/index.js +15 -0
  32. package/dist/connect/index.js.map +1 -0
  33. package/dist/connect/open-url.d.ts +6 -0
  34. package/dist/connect/open-url.d.ts.map +1 -0
  35. package/dist/connect/open-url.js +42 -0
  36. package/dist/connect/open-url.js.map +1 -0
  37. package/dist/connect/types.d.ts +48 -0
  38. package/dist/connect/types.d.ts.map +1 -0
  39. package/dist/connect/types.js +7 -0
  40. package/dist/connect/types.js.map +1 -0
  41. package/dist/dashboard/index.d.ts +3 -0
  42. package/dist/dashboard/index.d.ts.map +1 -1
  43. package/dist/dashboard/index.js +47 -0
  44. package/dist/dashboard/index.js.map +1 -1
  45. package/dist/dashboard/types.d.ts +1 -1
  46. package/dist/dashboard/types.d.ts.map +1 -1
  47. package/dist/dashboard/views/connect-view.d.ts +25 -0
  48. package/dist/dashboard/views/connect-view.d.ts.map +1 -0
  49. package/dist/dashboard/views/connect-view.js +135 -0
  50. package/dist/dashboard/views/connect-view.js.map +1 -0
  51. package/dist/dashboard/views/main-view.d.ts.map +1 -1
  52. package/dist/dashboard/views/main-view.js +1 -0
  53. package/dist/dashboard/views/main-view.js.map +1 -1
  54. package/dist/desktop/chrome-detector.d.ts +58 -0
  55. package/dist/desktop/chrome-detector.d.ts.map +1 -0
  56. package/dist/desktop/chrome-detector.js +211 -0
  57. package/dist/desktop/chrome-detector.js.map +1 -0
  58. package/dist/desktop/cli-coexistence.d.ts +90 -0
  59. package/dist/desktop/cli-coexistence.d.ts.map +1 -0
  60. package/dist/desktop/cli-coexistence.js +219 -0
  61. package/dist/desktop/cli-coexistence.js.map +1 -0
  62. package/dist/desktop/dashboard-state.d.ts +50 -0
  63. package/dist/desktop/dashboard-state.d.ts.map +1 -0
  64. package/dist/desktop/dashboard-state.js +155 -0
  65. package/dist/desktop/dashboard-state.js.map +1 -0
  66. package/dist/desktop/error-log.d.ts +53 -0
  67. package/dist/desktop/error-log.d.ts.map +1 -0
  68. package/dist/desktop/error-log.js +127 -0
  69. package/dist/desktop/error-log.js.map +1 -0
  70. package/dist/desktop/sidecar-manager.d.ts +80 -0
  71. package/dist/desktop/sidecar-manager.d.ts.map +1 -0
  72. package/dist/desktop/sidecar-manager.js +222 -0
  73. package/dist/desktop/sidecar-manager.js.map +1 -0
  74. package/dist/desktop/tunnel-failure-handler.d.ts +56 -0
  75. package/dist/desktop/tunnel-failure-handler.d.ts.map +1 -0
  76. package/dist/desktop/tunnel-failure-handler.js +157 -0
  77. package/dist/desktop/tunnel-failure-handler.js.map +1 -0
  78. package/dist/desktop/tunnel-manager.d.ts +85 -0
  79. package/dist/desktop/tunnel-manager.d.ts.map +1 -0
  80. package/dist/desktop/tunnel-manager.js +363 -0
  81. package/dist/desktop/tunnel-manager.js.map +1 -0
  82. package/dist/index.js +15 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/mcp-server.d.ts.map +1 -1
  85. package/dist/mcp-server.js +4 -0
  86. package/dist/mcp-server.js.map +1 -1
  87. package/dist/session-manager.d.ts +6 -0
  88. package/dist/session-manager.d.ts.map +1 -1
  89. package/dist/session-manager.js +12 -0
  90. package/dist/session-manager.js.map +1 -1
  91. package/dist/tools/connect.d.ts +7 -0
  92. package/dist/tools/connect.d.ts.map +1 -0
  93. package/dist/tools/connect.js +125 -0
  94. package/dist/tools/connect.js.map +1 -0
  95. package/dist/tools/index.d.ts.map +1 -1
  96. package/dist/tools/index.js +4 -0
  97. package/dist/tools/index.js.map +1 -1
  98. package/dist/tools/navigate.d.ts.map +1 -1
  99. package/dist/tools/navigate.js +15 -6
  100. package/dist/tools/navigate.js.map +1 -1
  101. package/dist/transports/http.d.ts +26 -1
  102. package/dist/transports/http.d.ts.map +1 -1
  103. package/dist/transports/http.js +161 -4
  104. package/dist/transports/http.js.map +1 -1
  105. package/dist/transports/index.d.ts +1 -0
  106. package/dist/transports/index.d.ts.map +1 -1
  107. package/dist/transports/index.js +1 -1
  108. package/dist/transports/index.js.map +1 -1
  109. package/package.json +1 -1
  110. package/dist/tools/click-element.d.ts +0 -8
  111. package/dist/tools/click-element.d.ts.map +0 -1
  112. package/dist/tools/click-element.js +0 -347
  113. package/dist/tools/click-element.js.map +0 -1
  114. package/dist/tools/wait-and-click.d.ts +0 -8
  115. package/dist/tools/wait-and-click.d.ts.map +0 -1
  116. package/dist/tools/wait-and-click.js +0 -208
  117. package/dist/tools/wait-and-click.js.map +0 -1
@@ -1,347 +0,0 @@
1
- "use strict";
2
- /**
3
- * Click Element Tool - Composite tool that finds and clicks an element in one operation
4
- *
5
- * This reduces the typical find → get coordinates → click pattern into a single tool call.
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.registerClickElementTool = registerClickElementTool;
9
- const mcp_1 = require("../types/mcp");
10
- const session_manager_1 = require("../session-manager");
11
- const ref_id_manager_1 = require("../utils/ref-id-manager");
12
- const defaults_1 = require("../config/defaults");
13
- const dom_delta_1 = require("../utils/dom-delta");
14
- const adaptive_screenshot_1 = require("../utils/adaptive-screenshot");
15
- const element_finder_1 = require("../utils/element-finder");
16
- const element_discovery_1 = require("../utils/element-discovery");
17
- const ax_element_resolver_1 = require("../utils/ax-element-resolver");
18
- const outcome_classifier_1 = require("../utils/ralph/outcome-classifier");
19
- const puppeteer_helpers_1 = require("../utils/puppeteer-helpers");
20
- const definition = {
21
- name: 'click_element',
22
- description: 'Find and click an element by query in one call.',
23
- inputSchema: {
24
- type: 'object',
25
- properties: {
26
- tabId: {
27
- type: 'string',
28
- description: 'Tab ID to execute on',
29
- },
30
- query: {
31
- type: 'string',
32
- description: 'Element to click (natural language)',
33
- },
34
- wait_after: {
35
- type: 'number',
36
- description: 'Wait after click in ms. Default: 100',
37
- },
38
- verify: {
39
- type: 'boolean',
40
- description: 'Return screenshot after click',
41
- },
42
- double_click: {
43
- type: 'boolean',
44
- description: 'Perform double-click instead of single',
45
- },
46
- waitForMs: {
47
- type: 'number',
48
- description: 'Poll timeout for element in ms. Default: 0',
49
- },
50
- pollInterval: {
51
- type: 'number',
52
- description: 'Poll interval in ms. Default: 200',
53
- },
54
- },
55
- required: ['tabId', 'query'],
56
- },
57
- };
58
- const handler = async (sessionId, args, context) => {
59
- const tabId = args.tabId;
60
- const query = args.query;
61
- const waitAfter = Math.min(Math.max(args.wait_after || 100, 0), 5000);
62
- const verify = args.verify;
63
- const doubleClick = args.double_click;
64
- const waitForMs = args.waitForMs;
65
- const pollInterval = Math.min(Math.max(args.pollInterval || 200, 50), 2000);
66
- const sessionManager = (0, session_manager_1.getSessionManager)();
67
- const refIdManager = (0, ref_id_manager_1.getRefIdManager)();
68
- if (!tabId) {
69
- return {
70
- content: [{ type: 'text', text: 'Error: tabId is required' }],
71
- isError: true,
72
- };
73
- }
74
- if (!query) {
75
- return {
76
- content: [{ type: 'text', text: 'Error: query is required' }],
77
- isError: true,
78
- };
79
- }
80
- try {
81
- const page = await sessionManager.getPage(sessionId, tabId, undefined, 'click_element');
82
- if (!page) {
83
- return {
84
- content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
85
- isError: true,
86
- };
87
- }
88
- const queryNorm = (0, element_finder_1.normalizeQuery)(query);
89
- const queryLower = queryNorm;
90
- const queryTokens = (0, element_finder_1.tokenizeQuery)(queryNorm);
91
- // Optional polling for dynamic/lazy content
92
- const maxWait = waitForMs ? Math.min(Math.max(waitForMs, 100), 30000) : 0;
93
- let bestMatch = null;
94
- const startTime = Date.now();
95
- const cdpClient = sessionManager.getCDPClient();
96
- // ─── AX-First Resolution ───
97
- try {
98
- const axMatches = await (0, ax_element_resolver_1.resolveElementsByAXTree)(page, cdpClient, query, {
99
- useCenter: true, maxResults: 3,
100
- });
101
- if (axMatches.length > 0) {
102
- const ax = axMatches[0];
103
- // Scroll into view and re-resolve coordinates
104
- try {
105
- await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', { backendNodeId: ax.backendDOMNodeId });
106
- await new Promise(resolve => setTimeout(resolve, defaults_1.DEFAULT_DOM_SETTLE_DELAY_MS));
107
- const { model } = await cdpClient.send(page, 'DOM.getBoxModel', { backendNodeId: ax.backendDOMNodeId });
108
- if (model?.content && model.content.length >= 8) {
109
- const bx = model.content[0], by = model.content[1];
110
- const bw = model.content[2] - bx, bh = model.content[5] - by;
111
- if (bw > 0 && bh > 0)
112
- ax.rect = { x: bx + bw / 2, y: by + bh / 2, width: bw, height: bh };
113
- }
114
- }
115
- catch { /* use original coords */ }
116
- const axX = Math.round(ax.rect.x), axY = Math.round(ax.rect.y);
117
- const { delta: axDelta } = await (0, dom_delta_1.withDomDelta)(page, async () => {
118
- if (doubleClick)
119
- await page.mouse.click(axX, axY, { clickCount: 2 });
120
- else
121
- await page.mouse.click(axX, axY);
122
- }, { settleMs: Math.max(150, waitAfter) });
123
- (0, ax_element_resolver_1.invalidateAXCache)((0, puppeteer_helpers_1.getTargetId)(page.target()));
124
- const axRef = refIdManager.generateRef(sessionId, tabId, ax.backendDOMNodeId, ax.role, ax.name, undefined, undefined);
125
- await (0, element_discovery_1.cleanupTags)(page, element_discovery_1.DISCOVERY_TAG).catch(() => { });
126
- adaptive_screenshot_1.AdaptiveScreenshot.getInstance().reset(tabId);
127
- const axVerb = doubleClick ? 'Double-clicked' : 'Clicked';
128
- const axOutcome = (0, outcome_classifier_1.classifyOutcome)(axDelta, ax.role);
129
- const resultText = (0, outcome_classifier_1.formatOutcomeLine)(axOutcome, axVerb, `${ax.role} "${ax.name}"`, `[${axRef}]`, `[${ax_element_resolver_1.MATCH_LEVEL_LABELS[ax.matchLevel]} via AX tree]`) + (axDelta || '');
130
- if (verify) {
131
- try {
132
- const buf = await page.screenshot({ type: 'webp', quality: defaults_1.DEFAULT_SCREENSHOT_QUALITY, encoding: 'base64' });
133
- return {
134
- content: [
135
- { type: 'text', text: resultText },
136
- { type: 'image', data: buf, mimeType: 'image/webp' },
137
- ],
138
- };
139
- }
140
- catch { /* screenshot failed */ }
141
- }
142
- return { content: [{ type: 'text', text: resultText }] };
143
- }
144
- }
145
- catch {
146
- // AX non-fatal — fall through to CSS
147
- }
148
- // Budget check before expensive CSS discovery
149
- if (context && !(0, mcp_1.hasBudget)(context, 15_000)) {
150
- return {
151
- content: [{ type: 'text', text: `click_element: deadline approaching — skipped CSS fallback for "${query}"` }],
152
- isError: true,
153
- };
154
- }
155
- // ─── CSS Fallback ───
156
- do { // --- polling loop start ---
157
- // Find elements matching the query
158
- let rawResults;
159
- try {
160
- rawResults = await (0, element_discovery_1.discoverElements)(page, cdpClient, queryLower, {
161
- maxResults: 30,
162
- useCenter: true,
163
- timeout: 10000,
164
- toolName: 'click_element',
165
- });
166
- }
167
- catch {
168
- // CDP evaluate timed out — retry on next poll iteration if budget remains
169
- if (maxWait > 0 && Date.now() - startTime < maxWait) {
170
- await new Promise(resolve => setTimeout(resolve, pollInterval));
171
- continue;
172
- }
173
- rawResults = [];
174
- }
175
- if (rawResults.length === 0) {
176
- if (maxWait > 0 && Date.now() - startTime < maxWait) {
177
- await new Promise(resolve => setTimeout(resolve, pollInterval));
178
- continue;
179
- }
180
- const pageUrl = page.url();
181
- return {
182
- content: [
183
- {
184
- type: 'text',
185
- text: `No clickable elements found matching "${query}" on ${pageUrl}`,
186
- },
187
- ],
188
- isError: true,
189
- };
190
- }
191
- // Score and sort elements, tracking original discovery index for re-positioning
192
- const scoredResults = rawResults
193
- .map((el, i) => ({ ...el, score: (0, element_finder_1.scoreElement)(el, queryLower, queryTokens), _origIdx: i }))
194
- .sort((a, b) => b.score - a.score);
195
- if (scoredResults.length > 0 && scoredResults[0].score >= 10) {
196
- bestMatch = scoredResults[0];
197
- break;
198
- }
199
- if (maxWait > 0 && Date.now() - startTime < maxWait) {
200
- await new Promise(resolve => setTimeout(resolve, pollInterval));
201
- }
202
- else {
203
- // No polling or timeout reached — use best available even if low score
204
- if (scoredResults.length > 0) {
205
- bestMatch = scoredResults[0];
206
- }
207
- break;
208
- }
209
- } while (Date.now() - startTime < maxWait); // --- polling loop end ---
210
- if (!bestMatch || bestMatch.score < 10) {
211
- return {
212
- content: [
213
- {
214
- type: 'text',
215
- text: `No good match found for "${query}". Best candidate was "${bestMatch?.name || 'unknown'}" with low confidence.`,
216
- },
217
- ],
218
- isError: true,
219
- };
220
- }
221
- // Click the element at its center coordinates
222
- const clickX = Math.round(bestMatch.rect.x);
223
- const clickY = Math.round(bestMatch.rect.y);
224
- // Scroll into view first if needed
225
- if (bestMatch.backendDOMNodeId) {
226
- try {
227
- await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', {
228
- backendNodeId: bestMatch.backendDOMNodeId,
229
- });
230
- // Small delay after scroll
231
- await new Promise(resolve => setTimeout(resolve, defaults_1.DEFAULT_DOM_SETTLE_DELAY_MS));
232
- // Re-get position after scroll using the shared getTaggedElementRect helper
233
- const newRect = await (0, element_discovery_1.getTaggedElementRect)(page, cdpClient, element_discovery_1.DISCOVERY_TAG, bestMatch._origIdx, true);
234
- if (newRect) {
235
- bestMatch.rect.x = newRect.x;
236
- bestMatch.rect.y = newRect.y;
237
- }
238
- }
239
- catch {
240
- // Continue with original coordinates
241
- }
242
- }
243
- const finalX = Math.round(bestMatch.rect.x);
244
- const finalY = Math.round(bestMatch.rect.y);
245
- // Perform the click with DOM delta capture (settleMs includes waitAfter)
246
- const { delta } = await (0, dom_delta_1.withDomDelta)(page, async () => {
247
- if (doubleClick) {
248
- await page.mouse.click(finalX, finalY, { clickCount: 2 });
249
- }
250
- else {
251
- await page.mouse.click(finalX, finalY);
252
- }
253
- }, { settleMs: Math.max(150, waitAfter) });
254
- // Generate ref for the clicked element
255
- let refId = '';
256
- if (bestMatch.backendDOMNodeId) {
257
- refId = refIdManager.generateRef(sessionId, tabId, bestMatch.backendDOMNodeId, bestMatch.role, bestMatch.name, bestMatch.tagName, bestMatch.textContent);
258
- }
259
- // Clean up discovery tags to prevent stale properties
260
- await (0, element_discovery_1.cleanupTags)(page, element_discovery_1.DISCOVERY_TAG).catch(() => { });
261
- // Reset adaptive screenshot on click (page state changes)
262
- adaptive_screenshot_1.AdaptiveScreenshot.getInstance().reset(tabId);
263
- const clickType = doubleClick ? 'Double-clicked' : 'Clicked';
264
- const textSample = bestMatch.textContent?.slice(0, 50) || bestMatch.name.slice(0, 50);
265
- const textPart = textSample ? ` "${textSample}"` : '';
266
- const refPart = refId ? ` [${refId}]` : '';
267
- const confidencePart = bestMatch.score < 50 ? ' [via CSS, LOW CONFIDENCE]' : ' [via CSS]';
268
- const cssOutcome = (0, outcome_classifier_1.classifyOutcome)(delta, bestMatch.role);
269
- const resultText = (0, outcome_classifier_1.formatOutcomeLine)(cssOutcome, clickType, `${bestMatch.tagName}${textPart}`, refPart, confidencePart) + (delta || '');
270
- // Optional verification screenshot — WebP via CDP for speed and consistency
271
- if (verify) {
272
- try {
273
- const screenshotResult = await Promise.race([
274
- (async () => {
275
- const cdpSession = await page.target().createCDPSession();
276
- try {
277
- const { data } = await cdpSession.send('Page.captureScreenshot', {
278
- format: 'webp',
279
- quality: defaults_1.DEFAULT_SCREENSHOT_QUALITY,
280
- optimizeForSpeed: true,
281
- });
282
- return data;
283
- }
284
- finally {
285
- await cdpSession.detach().catch(() => { });
286
- }
287
- })(),
288
- new Promise((resolve) => setTimeout(() => resolve(null), defaults_1.DEFAULT_SCREENSHOT_RACE_TIMEOUT_MS)),
289
- ]);
290
- if (screenshotResult !== null) {
291
- return {
292
- content: [
293
- { type: 'text', text: resultText },
294
- { type: 'image', data: screenshotResult, mimeType: 'image/webp' },
295
- ],
296
- };
297
- }
298
- // Timeout — fall through to fallback
299
- throw new Error('Screenshot timed out');
300
- }
301
- catch {
302
- // Fall back to Puppeteer PNG with timeout to prevent hangs on dialog-blocked pages
303
- let fallbackTimer;
304
- const screenshot = await Promise.race([
305
- page.screenshot({
306
- encoding: 'base64',
307
- type: 'png',
308
- fullPage: false,
309
- clip: {
310
- x: 0,
311
- y: 0,
312
- width: Math.min(page.viewport()?.width || defaults_1.DEFAULT_VIEWPORT.width, defaults_1.DEFAULT_VIEWPORT.width),
313
- height: Math.min(page.viewport()?.height || defaults_1.DEFAULT_VIEWPORT.height, defaults_1.DEFAULT_VIEWPORT.height),
314
- },
315
- }).finally(() => clearTimeout(fallbackTimer)),
316
- new Promise((_, reject) => {
317
- fallbackTimer = setTimeout(() => reject(new Error('Fallback screenshot timed out')), defaults_1.DEFAULT_SCREENSHOT_TIMEOUT_MS);
318
- }),
319
- ]);
320
- return {
321
- content: [
322
- { type: 'text', text: resultText },
323
- { type: 'image', data: screenshot, mimeType: 'image/png' },
324
- ],
325
- };
326
- }
327
- }
328
- return {
329
- content: [{ type: 'text', text: resultText }],
330
- };
331
- }
332
- catch (error) {
333
- return {
334
- content: [
335
- {
336
- type: 'text',
337
- text: `Click element error: ${error instanceof Error ? error.message : String(error)}`,
338
- },
339
- ],
340
- isError: true,
341
- };
342
- }
343
- };
344
- function registerClickElementTool(server) {
345
- server.registerTool('click_element', handler, definition);
346
- }
347
- //# sourceMappingURL=click-element.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"click-element.js","sourceRoot":"","sources":["../../src/tools/click-element.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Wait and Click Tool - Waits for an element to appear and then clicks it
3
- *
4
- * Useful for dynamic content that loads after page interaction.
5
- */
6
- import { MCPServer } from '../mcp-server';
7
- export declare function registerWaitAndClickTool(server: MCPServer): void;
8
- //# sourceMappingURL=wait-and-click.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait-and-click.d.ts","sourceRoot":"","sources":["../../src/tools/wait-and-click.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAyO1C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEhE"}
@@ -1,208 +0,0 @@
1
- "use strict";
2
- /**
3
- * Wait and Click Tool - Waits for an element to appear and then clicks it
4
- *
5
- * Useful for dynamic content that loads after page interaction.
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.registerWaitAndClickTool = registerWaitAndClickTool;
9
- const session_manager_1 = require("../session-manager");
10
- const ref_id_manager_1 = require("../utils/ref-id-manager");
11
- const defaults_1 = require("../config/defaults");
12
- const dom_delta_1 = require("../utils/dom-delta");
13
- const element_discovery_1 = require("../utils/element-discovery");
14
- const element_finder_1 = require("../utils/element-finder");
15
- const ax_element_resolver_1 = require("../utils/ax-element-resolver");
16
- const outcome_classifier_1 = require("../utils/ralph/outcome-classifier");
17
- const puppeteer_helpers_1 = require("../utils/puppeteer-helpers");
18
- const definition = {
19
- name: 'wait_and_click',
20
- description: 'Wait for element to appear, then click it.',
21
- inputSchema: {
22
- type: 'object',
23
- properties: {
24
- tabId: {
25
- type: 'string',
26
- description: 'Tab ID to execute on',
27
- },
28
- query: {
29
- type: 'string',
30
- description: 'Element to find and click (natural language)',
31
- },
32
- timeout: {
33
- type: 'number',
34
- description: 'Max wait in ms. Default: 5000, max: 30000',
35
- },
36
- poll_interval: {
37
- type: 'number',
38
- description: 'Poll interval in ms. Default: 200',
39
- },
40
- },
41
- required: ['tabId', 'query'],
42
- },
43
- };
44
- const handler = async (sessionId, args) => {
45
- const tabId = args.tabId;
46
- const query = args.query;
47
- const timeout = Math.min(Math.max(args.timeout || 5000, 100), 30000);
48
- const pollInterval = Math.min(Math.max(args.poll_interval || 200, 50), 2000);
49
- const sessionManager = (0, session_manager_1.getSessionManager)();
50
- const refIdManager = (0, ref_id_manager_1.getRefIdManager)();
51
- if (!tabId) {
52
- return {
53
- content: [{ type: 'text', text: 'Error: tabId is required' }],
54
- isError: true,
55
- };
56
- }
57
- if (!query) {
58
- return {
59
- content: [{ type: 'text', text: 'Error: query is required' }],
60
- isError: true,
61
- };
62
- }
63
- try {
64
- const page = await sessionManager.getPage(sessionId, tabId, undefined, 'wait_and_click');
65
- if (!page) {
66
- return {
67
- content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
68
- isError: true,
69
- };
70
- }
71
- const queryLower = (0, element_finder_1.normalizeQuery)(query);
72
- const queryTokens = (0, element_finder_1.tokenizeQuery)(query);
73
- const startTime = Date.now();
74
- let bestMatch = null;
75
- const cdpClient = sessionManager.getCDPClient();
76
- // Poll for the element (AX-first, CSS fallback)
77
- let axMatch = null;
78
- while (Date.now() - startTime < timeout) {
79
- // Try AX tree first
80
- try {
81
- const axMatches = await (0, ax_element_resolver_1.resolveElementsByAXTree)(page, cdpClient, query, {
82
- useCenter: true, maxResults: 1,
83
- });
84
- if (axMatches.length > 0) {
85
- axMatch = axMatches[0];
86
- break;
87
- }
88
- }
89
- catch { /* AX non-fatal */ }
90
- // CSS fallback
91
- try {
92
- const results = await (0, element_discovery_1.discoverElements)(page, cdpClient, queryLower, {
93
- maxResults: 30,
94
- useCenter: true,
95
- timeout: 10000,
96
- toolName: 'wait_and_click',
97
- });
98
- const scored = results
99
- .map((el, i) => ({ ...el, score: (0, element_finder_1.scoreElement)(el, queryLower, queryTokens), _origIdx: i }))
100
- .sort((a, b) => b.score - a.score);
101
- if (scored.length > 0 && scored[0].score >= 20) {
102
- bestMatch = scored[0];
103
- break;
104
- }
105
- }
106
- catch {
107
- // CDP evaluate timed out — retry on next poll iteration
108
- }
109
- await new Promise(resolve => setTimeout(resolve, pollInterval));
110
- }
111
- // ─── AX Match Path ───
112
- if (axMatch) {
113
- const waitTime = Date.now() - startTime;
114
- try {
115
- await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', { backendNodeId: axMatch.backendDOMNodeId });
116
- await new Promise(resolve => setTimeout(resolve, defaults_1.DEFAULT_DOM_SETTLE_DELAY_MS));
117
- const { model } = await cdpClient.send(page, 'DOM.getBoxModel', { backendNodeId: axMatch.backendDOMNodeId });
118
- if (model?.content && model.content.length >= 8) {
119
- const bx = model.content[0], by = model.content[1];
120
- const bw = model.content[2] - bx, bh = model.content[5] - by;
121
- if (bw > 0 && bh > 0)
122
- axMatch.rect = { x: bx + bw / 2, y: by + bh / 2, width: bw, height: bh };
123
- }
124
- }
125
- catch { /* use original coords */ }
126
- const axX = Math.round(axMatch.rect.x), axY = Math.round(axMatch.rect.y);
127
- const { delta: axDelta } = await (0, dom_delta_1.withDomDelta)(page, () => page.mouse.click(axX, axY));
128
- (0, ax_element_resolver_1.invalidateAXCache)((0, puppeteer_helpers_1.getTargetId)(page.target()));
129
- await (0, element_discovery_1.cleanupTags)(page, element_discovery_1.DISCOVERY_TAG).catch(() => { });
130
- const axRef = refIdManager.generateRef(sessionId, tabId, axMatch.backendDOMNodeId, axMatch.role, axMatch.name, undefined, undefined);
131
- const axOutcome = (0, outcome_classifier_1.classifyOutcome)(axDelta, axMatch.role);
132
- const axLine = (0, outcome_classifier_1.formatOutcomeLine)(axOutcome, 'Clicked', `${axMatch.role} "${axMatch.name}"`, `[${axRef}]`, `[${ax_element_resolver_1.MATCH_LEVEL_LABELS[axMatch.matchLevel]} via AX tree]`);
133
- return {
134
- content: [{
135
- type: 'text',
136
- text: `${axLine} (waited ${waitTime}ms)${axDelta || ''}`,
137
- }],
138
- };
139
- }
140
- if (!bestMatch) {
141
- return {
142
- content: [
143
- {
144
- type: 'text',
145
- text: `Timeout: No element matching "${query}" appeared within ${timeout}ms`,
146
- },
147
- ],
148
- isError: true,
149
- };
150
- }
151
- const waitTime = Date.now() - startTime;
152
- // Scroll into view if needed
153
- if (bestMatch.backendDOMNodeId) {
154
- try {
155
- await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', {
156
- backendNodeId: bestMatch.backendDOMNodeId,
157
- });
158
- await new Promise(resolve => setTimeout(resolve, defaults_1.DEFAULT_DOM_SETTLE_DELAY_MS));
159
- // Re-get position after scroll
160
- const newRect = await (0, element_discovery_1.getTaggedElementRect)(page, cdpClient, element_discovery_1.DISCOVERY_TAG, bestMatch._origIdx, true);
161
- if (newRect) {
162
- bestMatch.rect.x = newRect.x;
163
- bestMatch.rect.y = newRect.y;
164
- }
165
- }
166
- catch {
167
- // Continue with original coordinates
168
- }
169
- }
170
- // Click the element with DOM delta capture
171
- const clickX = Math.round(bestMatch.rect.x);
172
- const clickY = Math.round(bestMatch.rect.y);
173
- const { delta } = await (0, dom_delta_1.withDomDelta)(page, () => page.mouse.click(clickX, clickY));
174
- // Clean up discovery tags
175
- await (0, element_discovery_1.cleanupTags)(page, element_discovery_1.DISCOVERY_TAG);
176
- // Generate ref
177
- let refId = '';
178
- if (bestMatch.backendDOMNodeId) {
179
- refId = refIdManager.generateRef(sessionId, tabId, bestMatch.backendDOMNodeId, bestMatch.role, bestMatch.name, bestMatch.tagName, bestMatch.textContent);
180
- }
181
- const textSample = bestMatch.textContent?.slice(0, 50) || bestMatch.name.slice(0, 50);
182
- const textPart = textSample ? ` "${textSample}"` : '';
183
- const refPart = refId ? ` [${refId}]` : '';
184
- return {
185
- content: [
186
- {
187
- type: 'text',
188
- text: `\u2713 Waited ${waitTime}ms, clicked ${bestMatch.tagName}${textPart}${refPart}${delta}`,
189
- },
190
- ],
191
- };
192
- }
193
- catch (error) {
194
- return {
195
- content: [
196
- {
197
- type: 'text',
198
- text: `Wait and click error: ${error instanceof Error ? error.message : String(error)}`,
199
- },
200
- ],
201
- isError: true,
202
- };
203
- }
204
- };
205
- function registerWaitAndClickTool(server) {
206
- server.registerTool('wait_and_click', handler, definition);
207
- }
208
- //# sourceMappingURL=wait-and-click.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait-and-click.js","sourceRoot":"","sources":["../../src/tools/wait-and-click.ts"],"names":[],"mappings":"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"}