openchrome-mcp 1.7.1 → 1.7.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.
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +43 -5
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/cli/index.js +89 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts +6 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +7 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/tools/computer.d.ts.map +1 -1
- package/dist/tools/computer.js +27 -13
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/form-input.d.ts.map +1 -1
- package/dist/tools/form-input.js +16 -8
- package/dist/tools/form-input.js.map +1 -1
- package/dist/tools/javascript.d.ts +1 -0
- package/dist/tools/javascript.d.ts.map +1 -1
- package/dist/tools/javascript.js +47 -1
- package/dist/tools/javascript.js.map +1 -1
- package/dist/tools/lightweight-scroll.d.ts.map +1 -1
- package/dist/tools/lightweight-scroll.js +50 -2
- package/dist/tools/lightweight-scroll.js.map +1 -1
- package/dist/utils/ref-id-manager.d.ts +17 -0
- package/dist/utils/ref-id-manager.d.ts.map +1 -1
- package/dist/utils/ref-id-manager.js +107 -0
- package/dist/utils/ref-id-manager.js.map +1 -1
- package/dist/utils/retry-with-fallback.d.ts +18 -0
- package/dist/utils/retry-with-fallback.d.ts.map +1 -0
- package/dist/utils/retry-with-fallback.js +39 -0
- package/dist/utils/retry-with-fallback.js.map +1 -0
- package/package.json +1 -1
|
@@ -140,6 +140,113 @@ class RefIdManager {
|
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Attempt to relocate a stale ref by searching for an element that matches the
|
|
145
|
+
* stored metadata (tagName + name/aria-label or textContent).
|
|
146
|
+
*
|
|
147
|
+
* Returns { backendNodeId, newRef } if the element is found and a new ref is
|
|
148
|
+
* registered for it, or null if the element cannot be located.
|
|
149
|
+
*
|
|
150
|
+
* This is used by computer and form_input to recover transparently from stale
|
|
151
|
+
* refs without surfacing an error to the LLM.
|
|
152
|
+
*/
|
|
153
|
+
async tryRelocateRef(sessionId, tabId, ref, page, cdpClient) {
|
|
154
|
+
const entry = this.getRef(sessionId, tabId, ref);
|
|
155
|
+
if (!entry)
|
|
156
|
+
return null;
|
|
157
|
+
const { tagName, name, textContent, role } = entry;
|
|
158
|
+
// Build a selector from stored metadata. We need at least a tagName to proceed.
|
|
159
|
+
if (!tagName)
|
|
160
|
+
return null;
|
|
161
|
+
try {
|
|
162
|
+
// Use page.evaluate to search for a matching element quickly.
|
|
163
|
+
// Strategy 1: tagName + aria-label/title exact match (most reliable).
|
|
164
|
+
// Strategy 2: tagName + text content prefix match.
|
|
165
|
+
// Strategy 3: tagName alone (only if role is unique enough, e.g. input types).
|
|
166
|
+
const foundNodeId = await page.evaluate((tag, elName, elText, elRole) => {
|
|
167
|
+
const selector = tag;
|
|
168
|
+
const candidates = Array.from(document.querySelectorAll(selector));
|
|
169
|
+
// Helper: check visibility
|
|
170
|
+
function isVisible(el) {
|
|
171
|
+
const rect = el.getBoundingClientRect();
|
|
172
|
+
if (rect.width === 0 || rect.height === 0)
|
|
173
|
+
return false;
|
|
174
|
+
const style = window.getComputedStyle(el);
|
|
175
|
+
return style.visibility !== 'hidden' && style.display !== 'none' && style.opacity !== '0';
|
|
176
|
+
}
|
|
177
|
+
const textPrefix = elText ? elText.slice(0, 30).trim() : '';
|
|
178
|
+
const nameLower = elName ? elName.toLowerCase() : '';
|
|
179
|
+
for (const el of candidates) {
|
|
180
|
+
if (!isVisible(el))
|
|
181
|
+
continue;
|
|
182
|
+
const inputEl = el;
|
|
183
|
+
// Strategy 1: aria-label or title match
|
|
184
|
+
if (nameLower) {
|
|
185
|
+
const ariaLabel = (el.getAttribute('aria-label') || '').toLowerCase();
|
|
186
|
+
const titleAttr = (el.getAttribute('title') || '').toLowerCase();
|
|
187
|
+
const placeholder = (inputEl.placeholder || '').toLowerCase();
|
|
188
|
+
if (ariaLabel === nameLower || titleAttr === nameLower || placeholder === nameLower) {
|
|
189
|
+
el.__relocateTarget = true;
|
|
190
|
+
return 1;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Strategy 2: textContent prefix match
|
|
194
|
+
if (textPrefix) {
|
|
195
|
+
const currentText = (el.textContent || '').trim().slice(0, 30);
|
|
196
|
+
if (currentText === textPrefix) {
|
|
197
|
+
el.__relocateTarget = true;
|
|
198
|
+
return 1;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Strategy 3: role-only match — only use for inputs/buttons with no text/name
|
|
203
|
+
if (!nameLower && !textPrefix && elRole) {
|
|
204
|
+
const roleLower = elRole.toLowerCase();
|
|
205
|
+
for (const el of candidates) {
|
|
206
|
+
if (!isVisible(el))
|
|
207
|
+
continue;
|
|
208
|
+
const inputEl = el;
|
|
209
|
+
const elRoleAttr = (el.getAttribute('role') || '').toLowerCase();
|
|
210
|
+
const inferredRole = el.tagName === 'BUTTON' ? 'button'
|
|
211
|
+
: el.tagName === 'A' ? 'link'
|
|
212
|
+
: el.tagName === 'INPUT' ? (inputEl.type || 'textbox')
|
|
213
|
+
: elRoleAttr;
|
|
214
|
+
if (inferredRole === roleLower) {
|
|
215
|
+
el.__relocateTarget = true;
|
|
216
|
+
return 1;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return 0;
|
|
221
|
+
}, tagName, name, textContent, role);
|
|
222
|
+
if (!foundNodeId)
|
|
223
|
+
return null;
|
|
224
|
+
// Get the backend node ID via CDP
|
|
225
|
+
const { result: batchResult } = await cdpClient.send(page, 'Runtime.evaluate', {
|
|
226
|
+
expression: `(() => {
|
|
227
|
+
const el = document.querySelector('*.__relocateTarget') ||
|
|
228
|
+
Array.from(document.querySelectorAll('*')).find(e => e.__relocateTarget);
|
|
229
|
+
if (el) { delete el.__relocateTarget; }
|
|
230
|
+
return el || null;
|
|
231
|
+
})()`,
|
|
232
|
+
returnByValue: false,
|
|
233
|
+
});
|
|
234
|
+
if (!batchResult?.objectId)
|
|
235
|
+
return null;
|
|
236
|
+
const { node } = await cdpClient.send(page, 'DOM.describeNode', {
|
|
237
|
+
objectId: batchResult.objectId,
|
|
238
|
+
});
|
|
239
|
+
if (!node?.backendNodeId)
|
|
240
|
+
return null;
|
|
241
|
+
// Register a new ref for the re-located element
|
|
242
|
+
const newRef = this.generateRef(sessionId, tabId, node.backendNodeId, entry.role, entry.name, entry.tagName, entry.textContent);
|
|
243
|
+
return { backendNodeId: node.backendNodeId, newRef };
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Any CDP or evaluate failure means we cannot relocate
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
143
250
|
/**
|
|
144
251
|
* Unified resolver: accepts "ref_N", raw integer string "142", or "node_142"
|
|
145
252
|
* Returns the backendDOMNodeId for use with CDP DOM.resolveNode
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref-id-manager.js","sourceRoot":"","sources":["../../src/utils/ref-id-manager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"ref-id-manager.js","sourceRoot":"","sources":["../../src/utils/ref-id-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry with fallback utility.
|
|
3
|
+
* Retries the primary operation, then tries fallback methods before giving up.
|
|
4
|
+
*/
|
|
5
|
+
export interface RetryOptions {
|
|
6
|
+
/** Maximum retry attempts for primary method (default: 1) */
|
|
7
|
+
maxRetries?: number;
|
|
8
|
+
/** Delay between retries in ms (default: 500) */
|
|
9
|
+
retryDelayMs?: number;
|
|
10
|
+
/** Label for logging (default: 'operation') */
|
|
11
|
+
label?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function retryWithFallback<T>(primary: () => Promise<T>, fallbacks: Array<() => Promise<T>>, options?: RetryOptions): Promise<{
|
|
14
|
+
result: T;
|
|
15
|
+
recovered: boolean;
|
|
16
|
+
method: string;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=retry-with-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-with-fallback.d.ts","sourceRoot":"","sources":["../../src/utils/retry-with-fallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,SAAS,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAClC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B5D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retry with fallback utility.
|
|
4
|
+
* Retries the primary operation, then tries fallback methods before giving up.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.retryWithFallback = retryWithFallback;
|
|
8
|
+
async function retryWithFallback(primary, fallbacks, options = {}) {
|
|
9
|
+
const { maxRetries = 1, retryDelayMs = 500, label = 'operation' } = options;
|
|
10
|
+
// Try primary with retries
|
|
11
|
+
let lastError;
|
|
12
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
13
|
+
try {
|
|
14
|
+
const result = await primary();
|
|
15
|
+
return { result, recovered: attempt > 0, method: 'primary' };
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
19
|
+
if (attempt < maxRetries) {
|
|
20
|
+
console.error(`[retry] ${label} attempt ${attempt + 1} failed, retrying in ${retryDelayMs}ms...`);
|
|
21
|
+
await new Promise(r => setTimeout(r, retryDelayMs));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Try fallbacks
|
|
26
|
+
for (let i = 0; i < fallbacks.length; i++) {
|
|
27
|
+
try {
|
|
28
|
+
console.error(`[retry] ${label} trying fallback ${i + 1}...`);
|
|
29
|
+
const result = await fallbacks[i]();
|
|
30
|
+
return { result, recovered: true, method: `fallback-${i + 1}` };
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// All methods exhausted
|
|
37
|
+
throw lastError || new Error(`${label}: all recovery methods exhausted`);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=retry-with-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-with-fallback.js","sourceRoot":"","sources":["../../src/utils/retry-with-fallback.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAWH,8CAmCC;AAnCM,KAAK,UAAU,iBAAiB,CACrC,OAAyB,EACzB,SAAkC,EAClC,UAAwB,EAAE;IAE1B,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,YAAY,GAAG,GAAG,EAAE,KAAK,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAE5E,2BAA2B;IAC3B,IAAI,SAA4B,CAAC;IACjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,YAAY,OAAO,GAAG,CAAC,wBAAwB,YAAY,OAAO,CAAC,CAAC;gBAClG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;AAC3E,CAAC"}
|