@mercuryo-ai/agentbrowse 0.2.60 → 0.2.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -5
- package/dist/browser-session-state.d.ts +39 -0
- package/dist/browser-session-state.d.ts.map +1 -1
- package/dist/browser-session-state.js +63 -1
- package/dist/commands/act.d.ts.map +1 -1
- package/dist/commands/act.js +539 -535
- package/dist/commands/attach.d.ts.map +1 -1
- package/dist/commands/attach.js +5 -10
- package/dist/commands/browser-connection-failure.d.ts +9 -0
- package/dist/commands/browser-connection-failure.d.ts.map +1 -0
- package/dist/commands/browser-connection-failure.js +15 -0
- package/dist/commands/browser-status.d.ts.map +1 -1
- package/dist/commands/browser-status.js +26 -30
- package/dist/commands/close.d.ts.map +1 -1
- package/dist/commands/close.js +5 -0
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +147 -144
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +11 -8
- package/dist/commands/navigate.d.ts.map +1 -1
- package/dist/commands/navigate.js +79 -73
- package/dist/commands/observe-inventory.d.ts +1 -0
- package/dist/commands/observe-inventory.d.ts.map +1 -1
- package/dist/commands/observe-inventory.js +15 -3
- package/dist/commands/observe.d.ts.map +1 -1
- package/dist/commands/observe.js +260 -272
- package/dist/commands/screenshot.d.ts.map +1 -1
- package/dist/commands/screenshot.js +50 -64
- package/dist/library.d.ts +2 -1
- package/dist/library.d.ts.map +1 -1
- package/dist/library.js +2 -1
- package/dist/protected-fill.d.ts.map +1 -1
- package/dist/protected-fill.js +46 -7
- package/dist/sticky-owner-host-entry.d.ts +2 -0
- package/dist/sticky-owner-host-entry.d.ts.map +1 -0
- package/dist/sticky-owner-host-entry.js +97 -0
- package/dist/sticky-owner.d.ts +15 -0
- package/dist/sticky-owner.d.ts.map +1 -0
- package/dist/sticky-owner.js +431 -0
- package/docs/configuration.md +36 -4
- package/docs/getting-started.md +28 -4
- package/docs/troubleshooting.md +42 -6
- package/package.json +1 -1
- package/dist/protected-fill-browser.d.ts +0 -22
- package/dist/protected-fill-browser.d.ts.map +0 -1
- package/dist/protected-fill-browser.js +0 -52
package/README.md
CHANGED
|
@@ -25,9 +25,13 @@ runtime you already have.
|
|
|
25
25
|
Three terms come up repeatedly in the API:
|
|
26
26
|
|
|
27
27
|
- **`session`** — the handle AgentBrowse returns from `launch(...)` or
|
|
28
|
-
`attach(...)`. You pass it into every later call.
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
`attach(...)`. You pass it into every later call. The session carries
|
|
29
|
+
browser identity, runtime state, and sticky-owner metadata so healthy
|
|
30
|
+
commands reuse one browser owner instead of opening a fresh root CDP
|
|
31
|
+
attach for every call. If you persist a session across process runs,
|
|
32
|
+
the next command may repair that owner while the underlying browser is
|
|
33
|
+
still alive; otherwise the session fails closed and you should
|
|
34
|
+
`launch(...)` or `attach(...)` again.
|
|
31
35
|
- **`ref`** (also `targetRef`, `scopeRef`, `fillRef`) — a stable reference
|
|
32
36
|
returned by `observe(...)`. You act on references, never on raw CSS
|
|
33
37
|
selectors. **Refs are valid for the page state that produced them, not
|
|
@@ -105,8 +109,8 @@ try {
|
|
|
105
109
|
}
|
|
106
110
|
|
|
107
111
|
const statusResult = await status(session);
|
|
108
|
-
if (!statusResult.
|
|
109
|
-
throw new Error(
|
|
112
|
+
if (!statusResult.alive) {
|
|
113
|
+
throw new Error('Browser is no longer reachable.');
|
|
110
114
|
}
|
|
111
115
|
} finally {
|
|
112
116
|
await close(session);
|
|
@@ -123,6 +127,10 @@ Runnable examples live in [`examples/`](./examples/README.md):
|
|
|
123
127
|
The library entrypoint does not load `.env` files. Environment loading only
|
|
124
128
|
happens in the CLI entrypoint.
|
|
125
129
|
|
|
130
|
+
Both `launch(...)` and `attach(...)` bootstrap the same sticky-owner
|
|
131
|
+
lifecycle. That owner may live in-process or in an internal detached host,
|
|
132
|
+
but it is not a user-managed daemon contract.
|
|
133
|
+
|
|
126
134
|
## Attach To An Existing Browser
|
|
127
135
|
|
|
128
136
|
If you already have a browser that exposes a CDP WebSocket URL, use
|
|
@@ -158,6 +166,11 @@ const attached = await attach(remoteCdpUrl, {
|
|
|
158
166
|
});
|
|
159
167
|
```
|
|
160
168
|
|
|
169
|
+
`attach(...)` is not a separate reconnect mode. It is the second bootstrap
|
|
170
|
+
path into the same sticky-owner execution model as `launch(...)`. After
|
|
171
|
+
attach succeeds, later browser commands reuse or repair that owner instead of
|
|
172
|
+
performing a fresh provider-level root attach on every healthy command.
|
|
173
|
+
|
|
161
174
|
## What Each Main API Does
|
|
162
175
|
|
|
163
176
|
| API | Use it when | Typical result |
|
|
@@ -240,6 +253,18 @@ store.save(session);
|
|
|
240
253
|
const restoredFromCustomRoot = store.load();
|
|
241
254
|
```
|
|
242
255
|
|
|
256
|
+
Persisted session files contain versioned sticky-owner metadata, not a live
|
|
257
|
+
Playwright connection. `loadBrowserSession()` and custom stores intentionally
|
|
258
|
+
return `null` for incompatible reconnect-era records or incomplete owner
|
|
259
|
+
metadata instead of auto-migrating them. After loading a session, call
|
|
260
|
+
`status(restored)` or let the next browser command verify or repair
|
|
261
|
+
ownership. If the underlying browser is gone, the session fails closed and
|
|
262
|
+
you start fresh with `launch(...)` or `attach(...)`.
|
|
263
|
+
|
|
264
|
+
There is no separate daemon API to supervise. `close(session)` is the public
|
|
265
|
+
lifecycle boundary for shutting down the internal owner host and, when
|
|
266
|
+
applicable, the managed browser itself.
|
|
267
|
+
|
|
243
268
|
If you want to use a proxy, pass it directly to `launch(...)`:
|
|
244
269
|
|
|
245
270
|
```ts
|
|
@@ -4,6 +4,29 @@ import type { ProxyConfig } from './solver/types.js';
|
|
|
4
4
|
export interface BrowserSessionCapabilities {
|
|
5
5
|
captchaSolve?: boolean;
|
|
6
6
|
}
|
|
7
|
+
export declare const STICKY_OWNER_SCHEMA_VERSION: 1;
|
|
8
|
+
export type StickyOwnerState = 'bootstrapping' | 'active' | 'recovering' | 'dead';
|
|
9
|
+
export interface StickyOwnerPlaywrightBindTransport {
|
|
10
|
+
type: 'playwright_bind';
|
|
11
|
+
endpoint: string;
|
|
12
|
+
mode: 'pipe' | 'ws';
|
|
13
|
+
}
|
|
14
|
+
export interface StickyOwnerInProcessTransport {
|
|
15
|
+
type: 'in_process';
|
|
16
|
+
}
|
|
17
|
+
export type StickyOwnerTransport = StickyOwnerPlaywrightBindTransport | StickyOwnerInProcessTransport;
|
|
18
|
+
export interface StickyOwnerMetadata {
|
|
19
|
+
version: typeof STICKY_OWNER_SCHEMA_VERSION;
|
|
20
|
+
hostId: string;
|
|
21
|
+
state: StickyOwnerState;
|
|
22
|
+
startedAt: string;
|
|
23
|
+
lastUsedAt?: string;
|
|
24
|
+
ttlMs?: number;
|
|
25
|
+
touchPath?: string;
|
|
26
|
+
browserSessionId: string;
|
|
27
|
+
transport: StickyOwnerTransport;
|
|
28
|
+
pid?: number;
|
|
29
|
+
}
|
|
7
30
|
/** Persisted browser session state shared across AgentBrowse commands. */
|
|
8
31
|
export interface BrowserSessionState {
|
|
9
32
|
cdpUrl: string;
|
|
@@ -15,6 +38,7 @@ export interface BrowserSessionState {
|
|
|
15
38
|
transport?: BrowseSessionTransport;
|
|
16
39
|
capabilities?: BrowserSessionCapabilities;
|
|
17
40
|
runtime?: BrowseRuntimeState;
|
|
41
|
+
stickyOwner?: StickyOwnerMetadata;
|
|
18
42
|
}
|
|
19
43
|
/** Browser session state plus transient run-scoped metadata. */
|
|
20
44
|
export interface BrowserCommandSession extends BrowserSessionState {
|
|
@@ -53,6 +77,21 @@ type AttachedBrowserSessionInput = Omit<BrowserSessionState, 'port' | 'identity'
|
|
|
53
77
|
browserInstanceRef?: string;
|
|
54
78
|
provider?: string;
|
|
55
79
|
};
|
|
80
|
+
export declare function isStickyOwnerMetadata(value: unknown): value is StickyOwnerMetadata;
|
|
81
|
+
export declare function canPersistStickyOwnerMetadata(value: unknown): value is StickyOwnerMetadata & {
|
|
82
|
+
transport: StickyOwnerPlaywrightBindTransport;
|
|
83
|
+
};
|
|
84
|
+
export declare function buildStickyOwnerMetadata(input: {
|
|
85
|
+
hostId: string;
|
|
86
|
+
state: StickyOwnerState;
|
|
87
|
+
startedAt: string;
|
|
88
|
+
lastUsedAt?: string;
|
|
89
|
+
ttlMs?: number;
|
|
90
|
+
touchPath?: string;
|
|
91
|
+
browserSessionId: string;
|
|
92
|
+
transport: StickyOwnerTransport;
|
|
93
|
+
pid?: number;
|
|
94
|
+
}): StickyOwnerMetadata;
|
|
56
95
|
export declare function parseSessionPort(cdpUrl: string): number | undefined;
|
|
57
96
|
/** Converts a CDP websocket or HTTP endpoint into the matching DevTools HTTP endpoint. */
|
|
58
97
|
export declare function buildCdpHttpEndpointUrl(cdpUrl: string, resourcePath?: '/json/version' | '/json/list'): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-session-state.d.ts","sourceRoot":"","sources":["../src/browser-session-state.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,sEAAsE;AACtE,MAAM,WAAW,0BAA0B;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,YAAY,CAAC,EAAE,0BAA0B,CAAC;IAC1C,OAAO,CAAC,EAAE,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-session-state.d.ts","sourceRoot":"","sources":["../src/browser-session-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, unlinkSync, wr
|
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { scrubProtectedExactValues } from './secrets/protected-exact-value-redaction.js';
|
|
5
|
+
export const STICKY_OWNER_SCHEMA_VERSION = 1;
|
|
5
6
|
const BLOCKED_SESSION_KEYS = new Set([
|
|
6
7
|
'rawValue',
|
|
7
8
|
'rawValues',
|
|
@@ -21,6 +22,67 @@ function ensureStateDir(stateDir) {
|
|
|
21
22
|
mkdirSync(stateDir, { recursive: true });
|
|
22
23
|
}
|
|
23
24
|
}
|
|
25
|
+
function isStickyOwnerTransport(value) {
|
|
26
|
+
if (!value || typeof value !== 'object') {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
const candidate = value;
|
|
30
|
+
if (candidate.type === 'in_process') {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (candidate.type !== 'playwright_bind') {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const endpointCandidate = candidate.endpoint;
|
|
37
|
+
const endpoint = typeof endpointCandidate === 'string' ? endpointCandidate.trim() : '';
|
|
38
|
+
const mode = candidate.mode;
|
|
39
|
+
return endpoint.length > 0 && (mode === 'pipe' || mode === 'ws');
|
|
40
|
+
}
|
|
41
|
+
function isStickyOwnerState(value) {
|
|
42
|
+
return (value === 'bootstrapping' || value === 'active' || value === 'recovering' || value === 'dead');
|
|
43
|
+
}
|
|
44
|
+
export function isStickyOwnerMetadata(value) {
|
|
45
|
+
if (!value || typeof value !== 'object') {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const candidate = value;
|
|
49
|
+
return (candidate.version === STICKY_OWNER_SCHEMA_VERSION &&
|
|
50
|
+
typeof candidate.hostId === 'string' &&
|
|
51
|
+
candidate.hostId.trim().length > 0 &&
|
|
52
|
+
isStickyOwnerState(candidate.state) &&
|
|
53
|
+
typeof candidate.startedAt === 'string' &&
|
|
54
|
+
candidate.startedAt.trim().length > 0 &&
|
|
55
|
+
(candidate.lastUsedAt === undefined ||
|
|
56
|
+
(typeof candidate.lastUsedAt === 'string' && candidate.lastUsedAt.trim().length > 0)) &&
|
|
57
|
+
(candidate.ttlMs === undefined ||
|
|
58
|
+
(typeof candidate.ttlMs === 'number' &&
|
|
59
|
+
Number.isFinite(candidate.ttlMs) &&
|
|
60
|
+
candidate.ttlMs > 0)) &&
|
|
61
|
+
(candidate.touchPath === undefined ||
|
|
62
|
+
(typeof candidate.touchPath === 'string' && candidate.touchPath.trim().length > 0)) &&
|
|
63
|
+
typeof candidate.browserSessionId === 'string' &&
|
|
64
|
+
candidate.browserSessionId.trim().length > 0 &&
|
|
65
|
+
isStickyOwnerTransport(candidate.transport) &&
|
|
66
|
+
(candidate.pid === undefined ||
|
|
67
|
+
(typeof candidate.pid === 'number' && Number.isFinite(candidate.pid) && candidate.pid > 0)));
|
|
68
|
+
}
|
|
69
|
+
export function canPersistStickyOwnerMetadata(value) {
|
|
70
|
+
return isStickyOwnerMetadata(value) && value.transport.type === 'playwright_bind';
|
|
71
|
+
}
|
|
72
|
+
export function buildStickyOwnerMetadata(input) {
|
|
73
|
+
return {
|
|
74
|
+
version: STICKY_OWNER_SCHEMA_VERSION,
|
|
75
|
+
hostId: input.hostId,
|
|
76
|
+
state: input.state,
|
|
77
|
+
startedAt: input.startedAt,
|
|
78
|
+
...(input.lastUsedAt ? { lastUsedAt: input.lastUsedAt } : {}),
|
|
79
|
+
...(typeof input.ttlMs === 'number' ? { ttlMs: input.ttlMs } : {}),
|
|
80
|
+
...(input.touchPath ? { touchPath: input.touchPath } : {}),
|
|
81
|
+
browserSessionId: input.browserSessionId,
|
|
82
|
+
transport: input.transport,
|
|
83
|
+
...(typeof input.pid === 'number' ? { pid: input.pid } : {}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
24
86
|
function atomicWriteJson(path, contents) {
|
|
25
87
|
const tempPath = `${path}.${process.pid}.tmp`;
|
|
26
88
|
try {
|
|
@@ -136,7 +198,7 @@ export function createBrowserSessionStore(options = {}) {
|
|
|
136
198
|
}
|
|
137
199
|
try {
|
|
138
200
|
const raw = JSON.parse(readFileSync(sessionPath, 'utf-8'));
|
|
139
|
-
if (!raw.cdpUrl) {
|
|
201
|
+
if (!raw.cdpUrl || !canPersistStickyOwnerMetadata(raw.stickyOwner)) {
|
|
140
202
|
return null;
|
|
141
203
|
}
|
|
142
204
|
return raw;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/commands/act.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAgBzE,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AA6BtB,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/commands/act.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAgBzE,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AA6BtB,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAwCxF,2DAA2D;AAC3D,eAAO,MAAM,eAAe,oWAgBlB,CAAC;AAEX,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,8FAMpB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,8CAA8C;AAC9C,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG;IAC5C,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,yEAAyE;AACzE,MAAM,MAAM,yBAAyB,GAAG,qBAAqB,GAAG;IAC9D,OAAO,EAAE,KAAK,CAAC;IACf,cAAc,EAAE,UAAU,CAAC;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE,eAAe,GAAG,SAAS,GAAG,aAAa,CAAC,CAAC;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,yBAAyB,GAAG,YAAY,GAAG;IACrD,OAAO,EAAE,KAAK,CAAC;IACf,cAAc,EAAE,QAAQ,CAAC;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE,eAAe,GAAG,SAAS,CAAC,CAAC;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,yBAAyB,GAAG,yBAAyB,CAAC;AAErF,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAmK5D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,CAAC;AA+Q7B,wBAAsB,UAAU,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CA+3BpB;AAED,wBAAsB,GAAG,CACvB,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAaf"}
|