@nuanu-ai/agentbrowse 0.2.37 → 0.2.38
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/commands/close.d.ts.map +1 -1
- package/dist/commands/close.js +11 -4
- package/dist/commands/observe-accessibility.d.ts.map +1 -1
- package/dist/commands/observe-accessibility.js +29 -1
- package/dist/commands/observe-inventory.d.ts.map +1 -1
- package/dist/commands/observe-inventory.js +74 -11
- package/dist/commands/observe-surfaces.d.ts.map +1 -1
- package/dist/commands/observe-surfaces.js +14 -28
- package/dist/control-semantics.d.ts.map +1 -1
- package/dist/control-semantics.js +1 -11
- package/dist/owned-process.d.ts +3 -0
- package/dist/owned-process.d.ts.map +1 -1
- package/dist/owned-process.js +3 -0
- package/dist/solver/browser-launcher.d.ts +1 -0
- package/dist/solver/browser-launcher.d.ts.map +1 -1
- package/dist/solver/browser-launcher.js +32 -2
- package/dist/solver/captcha-runtime.d.ts.map +1 -1
- package/dist/solver/captcha-runtime.js +4 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,sBAAsB,CAAC;IAC9B,WAAW,EAAE,SAAS,CAAC;IACvB,OAAO,EAAE,uBAAuB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAclE,wBAAsB,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CAwBlD"}
|
package/dist/commands/close.js
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* browse close — Close the browser and clean up session.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { deleteSession, isOwnedSession, loadSession } from '../session.js';
|
|
5
5
|
import { info } from '../output.js';
|
|
6
6
|
import { closeOwnedBrowser } from '../owned-browser.js';
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
import { isManagedBrowserPid } from '../owned-process.js';
|
|
8
|
+
function isCloseableManagedSession(session) {
|
|
9
|
+
if (!session) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (isOwnedSession(session)) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return !session.identity && isManagedBrowserPid(session.pid);
|
|
9
16
|
}
|
|
10
17
|
export async function close() {
|
|
11
18
|
const session = loadSession();
|
|
12
|
-
if (
|
|
19
|
+
if (isCloseableManagedSession(session)) {
|
|
13
20
|
const closeResult = await closeOwnedBrowser(session);
|
|
14
21
|
if (!closeResult.success) {
|
|
15
22
|
info(`Owned browser close failed; keeping session record: ${closeResult.reason}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe-accessibility.d.ts","sourceRoot":"","sources":["../../src/commands/observe-accessibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAa5C,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,wBAAwB,CAAC;AAEhC,KAAK,6BAA6B,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;CACpD,CAAC;AAOF,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACtD,CAAC;
|
|
1
|
+
{"version":3,"file":"observe-accessibility.d.ts","sourceRoot":"","sources":["../../src/commands/observe-accessibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAa5C,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,wBAAwB,CAAC;AAEhC,KAAK,6BAA6B,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;CACpD,CAAC;AAOF,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACtD,CAAC;AAoEF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAClC,6BAA6B,GAAG,IAAI,CAoDtC;AAkrBD,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACzC,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAY9B;AAED,eAAO,MAAM,0BAA0B;;CAEtC,CAAC"}
|
|
@@ -19,6 +19,17 @@ const GENERIC_FALLBACK_LABELS = new Set([
|
|
|
19
19
|
'menu item',
|
|
20
20
|
'grid cell',
|
|
21
21
|
]);
|
|
22
|
+
const GENERIC_CONTAINER_AX_NAMES = new Set([
|
|
23
|
+
'alertdialog',
|
|
24
|
+
'article',
|
|
25
|
+
'complementary',
|
|
26
|
+
'dialog',
|
|
27
|
+
'form',
|
|
28
|
+
'group',
|
|
29
|
+
'main',
|
|
30
|
+
'region',
|
|
31
|
+
'search',
|
|
32
|
+
]);
|
|
22
33
|
const NON_CONTAINER_AX_ROLES = new Set([
|
|
23
34
|
'button',
|
|
24
35
|
'checkbox',
|
|
@@ -350,6 +361,16 @@ function shouldUseContainerAccessibilityName(expectedKind, semantics) {
|
|
|
350
361
|
return false;
|
|
351
362
|
}
|
|
352
363
|
function chooseContainerSemanticName(fallbackValue, expectedKind, semantics, stats) {
|
|
364
|
+
const normalizedFallback = normalizeText(fallbackValue);
|
|
365
|
+
const normalizedSemanticName = normalizeLabelKey(semantics?.name);
|
|
366
|
+
const normalizedSemanticRole = normalizedContainerKind(semantics?.role);
|
|
367
|
+
if (isMeaningfulName(normalizedFallback) &&
|
|
368
|
+
(!isMeaningfulName(normalizedSemanticName) ||
|
|
369
|
+
GENERIC_CONTAINER_AX_NAMES.has(normalizedSemanticName) ||
|
|
370
|
+
normalizedSemanticName === normalizedSemanticRole)) {
|
|
371
|
+
stats.fallbackUses += 1;
|
|
372
|
+
return fallbackValue;
|
|
373
|
+
}
|
|
353
374
|
if (shouldUseContainerAccessibilityName(expectedKind, semantics)) {
|
|
354
375
|
return semantics?.name;
|
|
355
376
|
}
|
|
@@ -362,10 +383,17 @@ function enrichContextNode(node, semantics, domFallback, stats) {
|
|
|
362
383
|
if (!node) {
|
|
363
384
|
return undefined;
|
|
364
385
|
}
|
|
386
|
+
const fallbackLabel = [
|
|
387
|
+
fallbackContextNodeLabelOf(node),
|
|
388
|
+
node.text,
|
|
389
|
+
domFallback?.label,
|
|
390
|
+
]
|
|
391
|
+
.map((value) => normalizeText(value))
|
|
392
|
+
.find(isMeaningfulName);
|
|
365
393
|
return {
|
|
366
394
|
...node,
|
|
367
395
|
kind: node.kind ?? semantics?.role,
|
|
368
|
-
label: chooseContainerSemanticName(
|
|
396
|
+
label: chooseContainerSemanticName(fallbackLabel, node.kind, semantics, stats),
|
|
369
397
|
};
|
|
370
398
|
}
|
|
371
399
|
function chooseHintText(context, nextContext, domFallbackHint, stats) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe-inventory.d.ts","sourceRoot":"","sources":["../../src/commands/observe-inventory.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"observe-inventory.d.ts","sourceRoot":"","sources":["../../src/commands/observe-inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1756,7 +1756,12 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
1756
1756
|
const role = inferRole(element) || '';
|
|
1757
1757
|
const className = (element.getAttribute('class') || '').toLowerCase();
|
|
1758
1758
|
const surfaceKind = inferSurfaceKind(surface);
|
|
1759
|
-
const
|
|
1759
|
+
const seatValueLabel =
|
|
1760
|
+
element.getAttribute('data-seat-value')?.trim() ||
|
|
1761
|
+
element.getAttribute('data-seat')?.trim() ||
|
|
1762
|
+
undefined;
|
|
1763
|
+
const label =
|
|
1764
|
+
explicitLabelOf(element) || textOf(element) || seatValueLabel || syntheticLabelOf(element) || '';
|
|
1760
1765
|
const normalizedLabel = label.replace(/\s+/g, ' ').trim();
|
|
1761
1766
|
const explicitDateCellMetadata =
|
|
1762
1767
|
element.hasAttribute('data-day') ||
|
|
@@ -2114,7 +2119,7 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2114
2119
|
}
|
|
2115
2120
|
|
|
2116
2121
|
const rect = element.getBoundingClientRect();
|
|
2117
|
-
if (rect.width < 220 || rect.height <
|
|
2122
|
+
if (rect.width < 220 || rect.height < 160) {
|
|
2118
2123
|
return false;
|
|
2119
2124
|
}
|
|
2120
2125
|
|
|
@@ -2193,6 +2198,56 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2193
2198
|
return states;
|
|
2194
2199
|
};
|
|
2195
2200
|
|
|
2201
|
+
const visualSeatIdentityOf = (element) => {
|
|
2202
|
+
const explicitRow = element.getAttribute('data-row')?.trim();
|
|
2203
|
+
const explicitColumn = element.getAttribute('data-column')?.trim().toUpperCase();
|
|
2204
|
+
if (explicitRow && explicitColumn) {
|
|
2205
|
+
return {
|
|
2206
|
+
row: explicitRow,
|
|
2207
|
+
column: explicitColumn,
|
|
2208
|
+
label: explicitRow + explicitColumn,
|
|
2209
|
+
};
|
|
2210
|
+
}
|
|
2211
|
+
|
|
2212
|
+
const candidates = [
|
|
2213
|
+
element.getAttribute('data-seat-value'),
|
|
2214
|
+
element.getAttribute('data-seat'),
|
|
2215
|
+
element.getAttribute('aria-label'),
|
|
2216
|
+
element.getAttribute('title'),
|
|
2217
|
+
];
|
|
2218
|
+
|
|
2219
|
+
for (const candidate of candidates) {
|
|
2220
|
+
const normalized = compactText(candidate);
|
|
2221
|
+
if (!normalized) {
|
|
2222
|
+
continue;
|
|
2223
|
+
}
|
|
2224
|
+
|
|
2225
|
+
const rowColumnMatch = normalized.match(/(?:^|\b)(\d{1,3})\s*([a-z])(?:\b|$)/i);
|
|
2226
|
+
if (rowColumnMatch) {
|
|
2227
|
+
const row = rowColumnMatch[1];
|
|
2228
|
+
const column = rowColumnMatch[2].toUpperCase();
|
|
2229
|
+
return {
|
|
2230
|
+
row,
|
|
2231
|
+
column,
|
|
2232
|
+
label: row + column,
|
|
2233
|
+
};
|
|
2234
|
+
}
|
|
2235
|
+
|
|
2236
|
+
const columnRowMatch = normalized.match(/(?:^|\b)([a-z])\s*(\d{1,3})(?:\b|$)/i);
|
|
2237
|
+
if (columnRowMatch) {
|
|
2238
|
+
const row = columnRowMatch[2];
|
|
2239
|
+
const column = columnRowMatch[1].toUpperCase();
|
|
2240
|
+
return {
|
|
2241
|
+
row,
|
|
2242
|
+
column,
|
|
2243
|
+
label: row + column,
|
|
2244
|
+
};
|
|
2245
|
+
}
|
|
2246
|
+
}
|
|
2247
|
+
|
|
2248
|
+
return undefined;
|
|
2249
|
+
};
|
|
2250
|
+
|
|
2196
2251
|
const isVisualSeatCellElement = (element) => {
|
|
2197
2252
|
if (!isVisualGridSquareElement(element)) {
|
|
2198
2253
|
return false;
|
|
@@ -2357,6 +2412,7 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2357
2412
|
const descriptors = [];
|
|
2358
2413
|
|
|
2359
2414
|
for (const seatCell of seatCells) {
|
|
2415
|
+
const explicitSeatIdentity = visualSeatIdentityOf(seatCell.element);
|
|
2360
2416
|
const rowHeaderCandidates = rowHeaders.filter((header) => {
|
|
2361
2417
|
const headerCenterY = header.rect.top + header.rect.height / 2;
|
|
2362
2418
|
const seatCenterY = seatCell.rect.top + seatCell.rect.height / 2;
|
|
@@ -2371,19 +2427,26 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2371
2427
|
seatCell.rect,
|
|
2372
2428
|
'row'
|
|
2373
2429
|
) || undefined;
|
|
2374
|
-
const
|
|
2375
|
-
|
|
2376
|
-
seatCell.rect,
|
|
2377
|
-
'column'
|
|
2430
|
+
const columnHeaderCandidates = topColumnHeaders.filter(
|
|
2431
|
+
(header) => header.rect.bottom <= seatCell.rect.top + 12
|
|
2378
2432
|
);
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2433
|
+
const columnHeader =
|
|
2434
|
+
explicitSeatIdentity?.column ||
|
|
2435
|
+
!topColumnHeaders.length
|
|
2436
|
+
? undefined
|
|
2437
|
+
: chooseNearestHeader(
|
|
2438
|
+
columnHeaderCandidates.length > 0 ? columnHeaderCandidates : topColumnHeaders,
|
|
2439
|
+
seatCell.rect,
|
|
2440
|
+
'column'
|
|
2441
|
+
);
|
|
2442
|
+
|
|
2443
|
+
const row = explicitSeatIdentity?.row || rowHeader?.text;
|
|
2444
|
+
const column = explicitSeatIdentity?.column || columnHeader?.text;
|
|
2382
2445
|
if (!row || !column) {
|
|
2383
2446
|
continue;
|
|
2384
2447
|
}
|
|
2385
2448
|
|
|
2386
|
-
const label = row + column;
|
|
2449
|
+
const label = explicitSeatIdentity?.label || row + column;
|
|
2387
2450
|
const states = visualSeatCellStateOf(seatCell.element);
|
|
2388
2451
|
descriptors.push({
|
|
2389
2452
|
element: seatCell.element,
|
|
@@ -2656,7 +2719,7 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2656
2719
|
lane: laneOf(rect),
|
|
2657
2720
|
band: bandOf(rect),
|
|
2658
2721
|
},
|
|
2659
|
-
hintText:
|
|
2722
|
+
hintText: describedByTextOf(element),
|
|
2660
2723
|
fallbackHintText: visualSeatGrid?.hintText,
|
|
2661
2724
|
visual: visualOf(element),
|
|
2662
2725
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe-surfaces.d.ts","sourceRoot":"","sources":["../../src/commands/observe-surfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA6ChE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACxC,OAAO,EAAE,aAAa,CACpB,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,CAC7E,EACD,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACvC,iBAAiB,EAAE,CAiDrB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAa7E;AAyBD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,IAAI,CACV,iBAAiB,EACjB,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,CACxE,GACA,MAAM,GAAG,SAAS,CAkBpB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,eAAe,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC,GAC7F,MAAM,CAMR;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"observe-surfaces.d.ts","sourceRoot":"","sources":["../../src/commands/observe-surfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA6ChE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACxC,OAAO,EAAE,aAAa,CACpB,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,CAC7E,EACD,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACvC,iBAAiB,EAAE,CAiDrB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAa7E;AAyBD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,IAAI,CACV,iBAAiB,EACjB,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,CACxE,GACA,MAAM,GAAG,SAAS,CAkBpB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,eAAe,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC,GAC7F,MAAM,CAMR;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CA8BvF;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,gBAAgB,EAAE,EACvB,SAAS,EAAE,gBAAgB,GAAG,SAAS,GACtC,IAAI,CAON;AAwDD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC,oCAyE1C"}
|
|
@@ -133,37 +133,23 @@ export function summarizeContext(context) {
|
|
|
133
133
|
if (!context)
|
|
134
134
|
return undefined;
|
|
135
135
|
const parts = [];
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
if (parts.length === 0 && context.container?.label) {
|
|
149
|
-
parts.push(context.container.label);
|
|
150
|
-
}
|
|
151
|
-
else if (parts.length === 0 && context.container?.kind) {
|
|
152
|
-
parts.push(context.container.kind);
|
|
153
|
-
}
|
|
154
|
-
if (context.landmark?.label &&
|
|
155
|
-
context.landmark.label !== context.container?.label &&
|
|
156
|
-
context.landmark.label !== context.group?.label) {
|
|
157
|
-
parts.push(context.landmark.label);
|
|
136
|
+
const pushIfDistinct = (value) => {
|
|
137
|
+
const normalized = normalizeSurfaceText(value);
|
|
138
|
+
if (!normalized || parts.includes(normalized)) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
parts.push(normalized);
|
|
142
|
+
};
|
|
143
|
+
pushIfDistinct(context.item?.label ?? context.item?.text ?? context.item?.kind);
|
|
144
|
+
pushIfDistinct(context.group?.label ?? context.group?.text ?? context.group?.kind);
|
|
145
|
+
if (parts.length === 0) {
|
|
146
|
+
pushIfDistinct(context.container?.label ?? context.container?.text ?? context.container?.kind);
|
|
158
147
|
}
|
|
159
|
-
|
|
160
|
-
context.landmark.
|
|
161
|
-
context.landmark.kind !== context.group?.kind &&
|
|
162
|
-
!context.landmark?.label) {
|
|
163
|
-
parts.push(context.landmark.kind);
|
|
148
|
+
if (parts.length === 0 || context.landmark?.label || context.landmark?.text) {
|
|
149
|
+
pushIfDistinct(context.landmark?.label ?? context.landmark?.text ?? context.landmark?.kind);
|
|
164
150
|
}
|
|
165
151
|
if (parts.length === 0 && context.hintText) {
|
|
166
|
-
|
|
152
|
+
pushIfDistinct(context.hintText);
|
|
167
153
|
}
|
|
168
154
|
if (parts.length === 0)
|
|
169
155
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-semantics.d.ts","sourceRoot":"","sources":["../src/control-semantics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"control-semantics.d.ts","sourceRoot":"","sources":["../src/control-semantics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAwCtF,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,oBAAoB,GAC1B,mBAAmB,GAAG,SAAS,CAuCjC;AAyID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAYxE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,oBAAoB,GAAG,mBAAmB,EAAE,CAoG/F;AAED,wBAAgB,0BAA0B,CACxC,MAAM,CAAC,EAAE,gBAAgB,EACzB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC1B,GACL,uBAAuB,CAyBzB;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,oBAAoB,EAC3B,cAAc,EAAE,aAAa,CAAC,mBAAmB,CAAC,GACjD,mBAAmB,GAAG,SAAS,CA0EjC;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,oBAAoB,EAC3B,cAAc,EAAE,aAAa,CAAC,mBAAmB,CAAC,GACjD,sBAAsB,GAAG,SAAS,CA6CpC"}
|
|
@@ -7,14 +7,6 @@ const CARD_EXPIRY_FIELD_RE = /\b(exp(?:iry|iration)(?: date)?|cc-exp|valid\s+thr
|
|
|
7
7
|
const CARD_CVC_FIELD_RE = /\b(cvc|cvv|cc-csc|security code|card cvc)\b/i;
|
|
8
8
|
const DATE_VALUE_MASK_RE = /(?:^|\b)(?:dd|d|дд|д)\s*[./-]\s*(?:mm|m|мм|м)\s*[./-]\s*(?:yyyy|yyy|yy|y|гггг|гг|г)(?:\b|$)/i;
|
|
9
9
|
const NON_CARD_DATE_FIELD_RE = /\b(?:birth|dob|date|issued|expires|expiry|expiration|expir)\b|(?:дата|рожд|срок)/i;
|
|
10
|
-
const POPUP_DISCLOSURE_SURFACE_KINDS = new Set([
|
|
11
|
-
'dialog',
|
|
12
|
-
'dropdown',
|
|
13
|
-
'listbox',
|
|
14
|
-
'menu',
|
|
15
|
-
'popover',
|
|
16
|
-
'datepicker',
|
|
17
|
-
]);
|
|
18
10
|
function normalizeText(value) {
|
|
19
11
|
return (value ?? '').trim().toLowerCase();
|
|
20
12
|
}
|
|
@@ -116,11 +108,9 @@ function isBinaryToggleControlFacts(facts) {
|
|
|
116
108
|
function isDisclosureLikeTriggerFacts(facts, controlFamily) {
|
|
117
109
|
const kind = normalizeText(facts.kind);
|
|
118
110
|
const role = normalizeText(facts.role);
|
|
119
|
-
const surfaceKind = normalizeText(facts.surfaceKind);
|
|
120
111
|
const inputType = normalizeText(facts.inputType);
|
|
121
112
|
const popupBacked = Boolean(facts.controlsSurfaceSelector) ||
|
|
122
|
-
facts.states?.expanded !== undefined
|
|
123
|
-
POPUP_DISCLOSURE_SURFACE_KINDS.has(surfaceKind);
|
|
113
|
+
facts.states?.expanded !== undefined;
|
|
124
114
|
if (!popupBacked) {
|
|
125
115
|
return false;
|
|
126
116
|
}
|
package/dist/owned-process.d.ts
CHANGED
|
@@ -11,4 +11,7 @@ export declare function cleanupManagedBrowserPids(options?: {
|
|
|
11
11
|
export declare function listManagedBrowserPids(options?: {
|
|
12
12
|
processTable?: string;
|
|
13
13
|
}): number[];
|
|
14
|
+
export declare function isManagedBrowserPid(pid: number, options?: {
|
|
15
|
+
processTable?: string;
|
|
16
|
+
}): boolean;
|
|
14
17
|
//# sourceMappingURL=owned-process.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owned-process.d.ts","sourceRoot":"","sources":["../src/owned-process.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;AACjG,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAW/C;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAOvF;AAiCD,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;CAAO,GAC/C,OAAO,CAAC,2BAA2B,CAAC,CAqBtC;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,MAAM,EAAE,CAuBV"}
|
|
1
|
+
{"version":3,"file":"owned-process.d.ts","sourceRoot":"","sources":["../src/owned-process.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;AACjG,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAW/C;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAOvF;AAiCD,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;CAAO,GAC/C,OAAO,CAAC,2BAA2B,CAAC,CAqBtC;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,MAAM,EAAE,CAuBV;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,OAAO,CAET"}
|
package/dist/owned-process.js
CHANGED
|
@@ -93,6 +93,9 @@ export function listManagedBrowserPids(options = {}) {
|
|
|
93
93
|
}
|
|
94
94
|
return Array.from(pids);
|
|
95
95
|
}
|
|
96
|
+
export function isManagedBrowserPid(pid, options = {}) {
|
|
97
|
+
return listManagedBrowserPids(options).includes(pid);
|
|
98
|
+
}
|
|
96
99
|
async function waitForPidExit(pid, attempts, intervalMs) {
|
|
97
100
|
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
98
101
|
if (!isPidAlive(pid)) {
|
|
@@ -10,4 +10,5 @@ export type SolverSession = {
|
|
|
10
10
|
disconnect: () => Promise<void>;
|
|
11
11
|
};
|
|
12
12
|
export declare function launchSolver(profile: ProfileInfo, opts?: LaunchOptions): Promise<SolverSession>;
|
|
13
|
+
export declare function chromeArgsForEnvironment(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): string[];
|
|
13
14
|
//# sourceMappingURL=browser-launcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-launcher.d.ts","sourceRoot":"","sources":["../../src/solver/browser-launcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAsB,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-launcher.d.ts","sourceRoot":"","sources":["../../src/solver/browser-launcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAsB,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgBjF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAAC;AAuBF,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,aAAa,CAAC,CAmExB;AA8TD,wBAAgB,wBAAwB,CACtC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,EAAE,CAGV"}
|
|
@@ -6,11 +6,20 @@ import puppeteerExtra from 'puppeteer-extra';
|
|
|
6
6
|
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
|
|
7
7
|
import { buildTurnstileApiShimSource, isTurnstileApiRequest } from './turnstile-challenge.js';
|
|
8
8
|
const enhancedPuppeteer = puppeteerExtra;
|
|
9
|
-
|
|
9
|
+
const solverStealthPlugin = StealthPlugin();
|
|
10
|
+
// Some iframe-backed checkout flows break when this evasion runs on a connected real Chrome.
|
|
11
|
+
solverStealthPlugin.enabledEvasions.delete('iframe.contentWindow');
|
|
12
|
+
enhancedPuppeteer.use(solverStealthPlugin);
|
|
10
13
|
const AUTO_CDP_PORT = 0;
|
|
11
14
|
const CDP_DISCOVERY_TIMEOUT_MS = 30_000;
|
|
12
15
|
const CDP_DISCOVERY_INTERVAL_MS = 500;
|
|
16
|
+
const BROWSER_DISCONNECT_TIMEOUT_MS = 1_000;
|
|
13
17
|
const INTERCEPTED_PAGES = new WeakSet();
|
|
18
|
+
const LINUX_CI_CHROME_ARGS = [
|
|
19
|
+
'--no-sandbox',
|
|
20
|
+
'--disable-setuid-sandbox',
|
|
21
|
+
'--disable-dev-shm-usage',
|
|
22
|
+
];
|
|
14
23
|
const CHROME_PATHS = [
|
|
15
24
|
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
16
25
|
'/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',
|
|
@@ -30,6 +39,7 @@ export async function launchSolver(profile, opts) {
|
|
|
30
39
|
const cdpUrl = await discoverCdpUrl({
|
|
31
40
|
requestedPort: opts?.cdpPort,
|
|
32
41
|
userDataDir: profile.userDataDir,
|
|
42
|
+
chromeProcess,
|
|
33
43
|
});
|
|
34
44
|
if (!cdpUrl) {
|
|
35
45
|
throw buildCdpDiscoveryError(chromeProcess, opts?.cdpPort, profile.userDataDir);
|
|
@@ -63,7 +73,7 @@ export async function launchSolver(profile, opts) {
|
|
|
63
73
|
profile,
|
|
64
74
|
close: async () => {
|
|
65
75
|
try {
|
|
66
|
-
await browser
|
|
76
|
+
await disconnectBrowserWithinTimeout(browser, BROWSER_DISCONNECT_TIMEOUT_MS);
|
|
67
77
|
}
|
|
68
78
|
finally {
|
|
69
79
|
terminateProcessGroup(chromeProcess.pid);
|
|
@@ -96,10 +106,25 @@ async function discoverCdpUrl(options) {
|
|
|
96
106
|
return discoveredViaActivePort;
|
|
97
107
|
}
|
|
98
108
|
}
|
|
109
|
+
if (typeof options.chromeProcess?.exitCode === 'number' || options.chromeProcess?.signalCode) {
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
99
112
|
await sleep(CDP_DISCOVERY_INTERVAL_MS);
|
|
100
113
|
}
|
|
101
114
|
return null;
|
|
102
115
|
}
|
|
116
|
+
async function disconnectBrowserWithinTimeout(browser, timeoutMs) {
|
|
117
|
+
let timeoutId;
|
|
118
|
+
await Promise.race([
|
|
119
|
+
browser.disconnect().catch(() => { }),
|
|
120
|
+
new Promise((resolve) => {
|
|
121
|
+
timeoutId = setTimeout(resolve, timeoutMs);
|
|
122
|
+
}),
|
|
123
|
+
]);
|
|
124
|
+
if (timeoutId) {
|
|
125
|
+
clearTimeout(timeoutId);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
103
128
|
async function discoverCdpUrlOnPort(port) {
|
|
104
129
|
try {
|
|
105
130
|
const res = await fetch(`http://127.0.0.1:${port}/json/version`);
|
|
@@ -290,6 +315,7 @@ function spawnChromeProcess(executablePath, profile, fp, cdpPort, windowSize, he
|
|
|
290
315
|
'--no-first-run',
|
|
291
316
|
'--no-default-browser-check',
|
|
292
317
|
];
|
|
318
|
+
args.push(...chromeArgsForEnvironment());
|
|
293
319
|
if (headless) {
|
|
294
320
|
args.push('--headless=new');
|
|
295
321
|
}
|
|
@@ -311,6 +337,10 @@ function spawnChromeProcess(executablePath, profile, fp, cdpPort, windowSize, he
|
|
|
311
337
|
}
|
|
312
338
|
return proc;
|
|
313
339
|
}
|
|
340
|
+
export function chromeArgsForEnvironment(platform = process.platform, env = process.env) {
|
|
341
|
+
const isLinuxCi = platform === 'linux' && (env.CI === 'true' || env.GITHUB_ACTIONS === 'true');
|
|
342
|
+
return isLinuxCi ? [...LINUX_CI_CHROME_ARGS] : [];
|
|
343
|
+
}
|
|
314
344
|
function terminateProcessGroup(pid) {
|
|
315
345
|
try {
|
|
316
346
|
process.kill(-pid, 'SIGTERM');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captcha-runtime.d.ts","sourceRoot":"","sources":["../../src/solver/captcha-runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAMF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,yBAAyB,GAC/B,OAAO,CAAC,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"captcha-runtime.d.ts","sourceRoot":"","sources":["../../src/solver/captcha-runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAMF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,yBAAyB,GAC/B,OAAO,CAAC,wBAAwB,CAAC,CAgInC"}
|
|
@@ -12,7 +12,10 @@ export async function solveCaptchasByCdp(cdpUrl, apiKey, opts) {
|
|
|
12
12
|
const onProgress = opts?.onProgress;
|
|
13
13
|
const sharedTransport = opts?.sharedTransport ?? Boolean(opts?.proxy);
|
|
14
14
|
onProgress?.('[captcha] connecting to browser...');
|
|
15
|
-
const browser = await withTimeout(puppeteer.connect(
|
|
15
|
+
const browser = await withTimeout(puppeteer.connect({
|
|
16
|
+
...buildConnectOptions(cdpUrl),
|
|
17
|
+
defaultViewport: null,
|
|
18
|
+
}), connectTimeoutMs, `Failed to connect to browser within ${Math.ceil(connectTimeoutMs / 1000)}s`);
|
|
16
19
|
try {
|
|
17
20
|
const solver = new CaptchaSolver({
|
|
18
21
|
apiKey,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nuanu-ai/agentbrowse",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.38",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Browser automation CLI for AI agents: control a CDP browser, observe UI surfaces, act on refs, extract data, capture screenshots, complete protected fills, and solve captchas",
|
|
6
6
|
"keywords": [
|