@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.
Files changed (46) hide show
  1. package/README.md +30 -5
  2. package/dist/browser-session-state.d.ts +39 -0
  3. package/dist/browser-session-state.d.ts.map +1 -1
  4. package/dist/browser-session-state.js +63 -1
  5. package/dist/commands/act.d.ts.map +1 -1
  6. package/dist/commands/act.js +539 -535
  7. package/dist/commands/attach.d.ts.map +1 -1
  8. package/dist/commands/attach.js +5 -10
  9. package/dist/commands/browser-connection-failure.d.ts +9 -0
  10. package/dist/commands/browser-connection-failure.d.ts.map +1 -0
  11. package/dist/commands/browser-connection-failure.js +15 -0
  12. package/dist/commands/browser-status.d.ts.map +1 -1
  13. package/dist/commands/browser-status.js +26 -30
  14. package/dist/commands/close.d.ts.map +1 -1
  15. package/dist/commands/close.js +5 -0
  16. package/dist/commands/extract.d.ts.map +1 -1
  17. package/dist/commands/extract.js +147 -144
  18. package/dist/commands/launch.d.ts.map +1 -1
  19. package/dist/commands/launch.js +11 -8
  20. package/dist/commands/navigate.d.ts.map +1 -1
  21. package/dist/commands/navigate.js +79 -73
  22. package/dist/commands/observe-inventory.d.ts +1 -0
  23. package/dist/commands/observe-inventory.d.ts.map +1 -1
  24. package/dist/commands/observe-inventory.js +15 -3
  25. package/dist/commands/observe.d.ts.map +1 -1
  26. package/dist/commands/observe.js +260 -272
  27. package/dist/commands/screenshot.d.ts.map +1 -1
  28. package/dist/commands/screenshot.js +50 -64
  29. package/dist/library.d.ts +2 -1
  30. package/dist/library.d.ts.map +1 -1
  31. package/dist/library.js +2 -1
  32. package/dist/protected-fill.d.ts.map +1 -1
  33. package/dist/protected-fill.js +46 -7
  34. package/dist/sticky-owner-host-entry.d.ts +2 -0
  35. package/dist/sticky-owner-host-entry.d.ts.map +1 -0
  36. package/dist/sticky-owner-host-entry.js +97 -0
  37. package/dist/sticky-owner.d.ts +15 -0
  38. package/dist/sticky-owner.d.ts.map +1 -0
  39. package/dist/sticky-owner.js +431 -0
  40. package/docs/configuration.md +36 -4
  41. package/docs/getting-started.md +28 -4
  42. package/docs/troubleshooting.md +42 -6
  43. package/package.json +1 -1
  44. package/dist/protected-fill-browser.d.ts +0 -22
  45. package/dist/protected-fill-browser.d.ts.map +0 -1
  46. 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. A session is valid
29
- only while the underlying browser connection is live; `status(session)`
30
- tells you whether it still is.
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.success) {
109
- throw new Error(statusResult.reason ?? statusResult.message);
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":"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"}
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;AA4CxF,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,CAu2BpB;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"}
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"}