@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
@@ -6,8 +6,10 @@ import { getProtectedExposure } from '../runtime-protected-state.js';
6
6
  import { saveSession } from '../session.js';
7
7
  import { outputFailure, outputJSON, outputContractFailure, info } from '../output.js';
8
8
  import { captureDiagnosticSnapshotBestEffort, finishDiagnosticStepBestEffort, recordCommandLifecycleEventBestEffort, startDiagnosticStep, } from '../diagnostics.js';
9
- import { connectPlaywright, disconnectPlaywright, resolveCurrentPageContext, syncSessionPage, } from '../playwright-runtime.js';
9
+ import { resolveCurrentPageContext, syncSessionPage } from '../playwright-runtime.js';
10
10
  import { buildProtectedScreenshotBlockedResult, } from '../secrets/protected-artifact-guard.js';
11
+ import { describeBrowserConnectionFailure } from './browser-connection-failure.js';
12
+ import { withStickyOwnerBrowser } from '../sticky-owner.js';
11
13
  /** Stable top-level error codes returned by `screenshot(...)`. */
12
14
  export const SCREENSHOT_ERROR_CODES = [
13
15
  'browser_connection_failed',
@@ -172,81 +174,65 @@ export async function screenshotBrowser(session, filePath) {
172
174
  protectedStep: Boolean(initialProtectedExposure),
173
175
  },
174
176
  });
175
- let browser = null;
176
- let failureMessage = null;
177
- let page = null;
178
177
  try {
179
- browser = await connectPlaywright(session.cdpUrl);
180
- }
181
- catch (err) {
182
- return buildScreenshotContractFailureResult(session, {
183
- step: screenshotStepHandle,
184
- error: 'browser_connection_failed',
185
- outcomeType: 'blocked',
186
- message: 'Screenshot capture could not start because AgentBrowse failed to connect to the browser.',
187
- reason: err instanceof Error ? err.message : String(err),
188
- runId: session.activeRunId,
189
- stepId: screenshotStep?.stepId,
178
+ return await withStickyOwnerBrowser(session, async (browser) => {
179
+ try {
180
+ const resolvedPage = await resolveCurrentPageContext(browser, session);
181
+ pageRef = resolvedPage.pageRef;
182
+ const page = resolvedPage.page;
183
+ const recoveredProtectedExposure = getProtectedExposure(session, pageRef) ?? (!page ? initialProtectedExposure : null);
184
+ if (recoveredProtectedExposure) {
185
+ if (page && pageRef !== initialPageRef) {
186
+ setCurrentPage(session, pageRef);
187
+ }
188
+ return buildScreenshotFailureResult(session, {
189
+ step: screenshotStepHandle,
190
+ ...buildProtectedScreenshotBlockedResult(recoveredProtectedExposure),
191
+ runId: session.activeRunId,
192
+ stepId: screenshotStep?.stepId,
193
+ });
194
+ }
195
+ if (!page) {
196
+ throw new Error('no_open_pages');
197
+ }
198
+ await page.screenshot({ path: outputPath });
199
+ const { url, title } = await syncSessionPage(session, pageRef, page);
200
+ setCurrentPage(session, pageRef);
201
+ return buildScreenshotSuccessResult({
202
+ session,
203
+ step: screenshotStepHandle,
204
+ runId: session.activeRunId,
205
+ stepId: screenshotStep?.stepId,
206
+ pageRef,
207
+ path: outputPath,
208
+ url,
209
+ title,
210
+ });
211
+ }
212
+ catch (error) {
213
+ throw new Error(`screenshot_failed:${error instanceof Error ? error.message : String(error)}`);
214
+ }
190
215
  });
191
216
  }
192
- try {
193
- const resolvedPage = await resolveCurrentPageContext(browser, session);
194
- pageRef = resolvedPage.pageRef;
195
- page = resolvedPage.page;
196
- }
197
217
  catch (err) {
198
- failureMessage = `Screenshot failed: ${err instanceof Error ? err.message : String(err)}`;
199
- }
200
- const recoveredProtectedExposure = getProtectedExposure(session, pageRef) ?? (!page ? initialProtectedExposure : null);
201
- if (recoveredProtectedExposure) {
202
- if (page && pageRef !== initialPageRef) {
203
- setCurrentPage(session, pageRef);
204
- }
205
- if (browser) {
206
- await disconnectPlaywright(browser);
207
- browser = null;
208
- }
209
- return buildScreenshotFailureResult(session, {
210
- step: screenshotStepHandle,
211
- ...buildProtectedScreenshotBlockedResult(recoveredProtectedExposure),
212
- runId: session.activeRunId,
213
- stepId: screenshotStep?.stepId,
218
+ const reason = err instanceof Error ? err.message : String(err);
219
+ const isCommandFailure = reason.startsWith('screenshot_failed:');
220
+ const browserConnectionFailure = describeBrowserConnectionFailure(err, {
221
+ defaultMessage: 'Screenshot capture could not start because AgentBrowse failed to connect to the browser.',
222
+ unrecoverableSessionMessage: 'Screenshot capture could not start because the previous browser session is no longer reachable.',
214
223
  });
215
- }
216
- try {
217
- if (!page) {
218
- throw new Error(failureMessage?.replace(/^Screenshot failed:\s*/, '') ?? 'no_open_pages');
219
- }
220
- await page.screenshot({ path: outputPath });
221
- const { url, title } = await syncSessionPage(session, pageRef, page);
222
- setCurrentPage(session, pageRef);
223
- return buildScreenshotSuccessResult({
224
- session,
225
- step: screenshotStepHandle,
226
- runId: session.activeRunId,
227
- stepId: screenshotStep?.stepId,
228
- pageRef,
229
- path: outputPath,
230
- url,
231
- title,
232
- });
233
- }
234
- catch (err) {
235
224
  return buildScreenshotContractFailureResult(session, {
236
225
  step: screenshotStepHandle,
237
- error: 'screenshot_failed',
226
+ error: isCommandFailure ? 'screenshot_failed' : 'browser_connection_failed',
238
227
  outcomeType: 'blocked',
239
- message: 'Screenshot capture failed.',
240
- reason: err instanceof Error ? err.message : String(err),
228
+ message: isCommandFailure ? 'Screenshot capture failed.' : browserConnectionFailure.message,
229
+ reason: isCommandFailure
230
+ ? reason.replace(/^screenshot_failed:/, '')
231
+ : browserConnectionFailure.reason,
241
232
  runId: session.activeRunId,
242
233
  stepId: screenshotStep?.stepId,
243
234
  });
244
235
  }
245
- finally {
246
- if (browser) {
247
- await disconnectPlaywright(browser);
248
- }
249
- }
250
236
  }
251
237
  /** CLI wrapper for `screenshotBrowser(...)` that persists session changes and writes JSON output. */
252
238
  export async function screenshot(session, filePath) {
package/dist/library.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, type BrowserSessionCapabilities, type BrowserSessionStore, type BrowserSessionState, type BrowseSessionIdentity, type BrowseSessionTransport, } from './browser-session-state.js';
1
+ export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, buildStickyOwnerMetadata, canPersistStickyOwnerMetadata, type BrowserSessionCapabilities, type BrowserSessionStore, type BrowserSessionState, type BrowseSessionIdentity, type BrowseSessionTransport, type StickyOwnerInProcessTransport, type StickyOwnerMetadata, type StickyOwnerPlaywrightBindTransport, type StickyOwnerState, type StickyOwnerTransport, STICKY_OWNER_SCHEMA_VERSION, } from './browser-session-state.js';
2
2
  export { attach, ATTACH_ERROR_CODES, ATTACH_OUTCOME_TYPES, type AttachErrorCode, type AttachFailureResult, type AttachOutcomeType, type AttachOptions, type AttachResult, type AttachSuccessResult, } from './commands/attach.js';
3
3
  export { AgentbrowseAssistiveRuntimeMissingError, AssistiveStructuredOutputTruncatedError, configureAgentbrowseAssistiveRuntime, resetAgentbrowseAssistiveRuntime, type AgentbrowseAssistiveChatCompletionOptions, type AgentbrowseAssistiveChatCompletionRequest, type AgentbrowseAssistiveChatCompletionResult, type AgentbrowseAssistiveChatMessage, type AgentbrowseAssistiveImageInput, type AgentbrowseAssistiveLlmClient, type AgentbrowseAssistiveLlmUsage, type AgentbrowseAssistiveMessageContentPart, type AgentbrowseAssistiveResponseModel, type AgentbrowseAssistiveRuntime, } from './assistive-runtime.js';
4
4
  export { createAgentbrowseClient, type AgentbrowseClient, type AgentbrowseClientOptions, } from './client.js';
@@ -13,6 +13,7 @@ export { observeBrowser as observe, OBSERVE_ERROR_CODES, OBSERVE_OUTCOME_TYPES,
13
13
  export { classifyObservePageState, shouldSuppressFillableFormsForObserve, type ObservePageState, } from './commands/observe-page-state.js';
14
14
  export { resolveObservedField, type ObservedFieldCandidate, type ObservedFieldValueSource, type ObservedFieldValueType, type ResolveObservedFieldOptions, type ResolveObservedFieldResult, } from './secrets/observed-field-resolution.js';
15
15
  export { close, CLOSE_ERROR_CODES, CLOSE_OUTCOME_TYPES, type CloseErrorCode, type CloseFailureResult, type CloseOutcomeType, type CloseResult, type CloseSuccessResult, } from './commands/close.js';
16
+ export { restoreBrowserSessionOwner, type RestoreBrowserSessionOwnerResult, } from './sticky-owner.js';
16
17
  export { launch, LAUNCH_ERROR_CODES, LAUNCH_OUTCOME_TYPES, type LaunchErrorCode, type LaunchOptions, type LaunchFailureResult, type LaunchOutcomeType, type LaunchResult, type LaunchSuccessResult, } from './commands/launch.js';
17
18
  export { navigateBrowser as navigate, NAVIGATE_ERROR_CODES, NAVIGATE_OUTCOME_TYPES, type NavigateErrorCode, type NavigateFailureResult, type NavigateOutcomeType, type NavigateResult, type NavigateSuccessResult, } from './commands/navigate.js';
18
19
  export { screenshotBrowser as screenshot, SCREENSHOT_ERROR_CODES, SCREENSHOT_OUTCOME_TYPES, type ScreenshotErrorCode, type ScreenshotFailureResult, type ScreenshotOutcomeType, type ScreenshotResult, type ScreenshotSuccessResult, } from './commands/screenshot.js';
@@ -1 +1 @@
1
- {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"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"}
package/dist/library.js CHANGED
@@ -1,4 +1,4 @@
1
- export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, } from './browser-session-state.js';
1
+ export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, buildStickyOwnerMetadata, canPersistStickyOwnerMetadata, STICKY_OWNER_SCHEMA_VERSION, } from './browser-session-state.js';
2
2
  export { attach, ATTACH_ERROR_CODES, ATTACH_OUTCOME_TYPES, } from './commands/attach.js';
3
3
  export { AgentbrowseAssistiveRuntimeMissingError, AssistiveStructuredOutputTruncatedError, configureAgentbrowseAssistiveRuntime, resetAgentbrowseAssistiveRuntime, } from './assistive-runtime.js';
4
4
  export { createAgentbrowseClient, } from './client.js';
@@ -11,6 +11,7 @@ export { observeBrowser as observe, OBSERVE_ERROR_CODES, OBSERVE_OUTCOME_TYPES,
11
11
  export { classifyObservePageState, shouldSuppressFillableFormsForObserve, } from './commands/observe-page-state.js';
12
12
  export { resolveObservedField, } from './secrets/observed-field-resolution.js';
13
13
  export { close, CLOSE_ERROR_CODES, CLOSE_OUTCOME_TYPES, } from './commands/close.js';
14
+ export { restoreBrowserSessionOwner, } from './sticky-owner.js';
14
15
  export { launch, LAUNCH_ERROR_CODES, LAUNCH_OUTCOME_TYPES, } from './commands/launch.js';
15
16
  export { navigateBrowser as navigate, NAVIGATE_ERROR_CODES, NAVIGATE_OUTCOME_TYPES, } from './commands/navigate.js';
16
17
  export { screenshotBrowser as screenshot, SCREENSHOT_ERROR_CODES, SCREENSHOT_OUTCOME_TYPES, } from './commands/screenshot.js';
@@ -1 +1 @@
1
- {"version":3,"file":"protected-fill.d.ts","sourceRoot":"","sources":["../src/protected-fill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protected-fill.d.ts","sourceRoot":"","sources":["../src/protected-fill.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,52 @@
1
- import { fillProtectedFormBrowser, } from './protected-fill-browser.js';
2
1
  import { buildProtectedExactValueProfile as buildProtectedExactValueProfileInternal } from './secrets/protected-exact-value-redaction.js';
2
+ import { executeProtectedFill } from './secrets/protected-fill.js';
3
+ import { resolvePageByRef, syncSessionPage } from './playwright-runtime.js';
4
+ import { withStickyOwnerBrowser } from './sticky-owner.js';
3
5
  /** Fills a previously observed protected form with caller-provided protected values. */
4
6
  export async function fillProtectedForm(params) {
5
- return (await fillProtectedFormBrowser({
6
- session: params.session,
7
- fillableForm: params.fillableForm,
8
- protectedValues: params.protectedValues,
9
- fieldPolicies: params.fieldPolicies,
10
- }));
7
+ try {
8
+ return await withStickyOwnerBrowser(params.session, async (browser) => {
9
+ try {
10
+ const page = await resolvePageByRef(browser, params.session, params.fillableForm.pageRef).catch((error) => {
11
+ throw new Error(error instanceof Error ? error.message : String(error));
12
+ });
13
+ const { url, title } = await syncSessionPage(params.session, params.fillableForm.pageRef, page);
14
+ const execution = await executeProtectedFill({
15
+ session: params.session,
16
+ page,
17
+ fillableForm: params.fillableForm,
18
+ protectedValues: Object.fromEntries(Object.entries(params.protectedValues).filter((entry) => {
19
+ const value = entry[1];
20
+ return typeof value === 'string' && value.length > 0;
21
+ })),
22
+ fieldPolicies: params.fieldPolicies,
23
+ });
24
+ return {
25
+ success: true,
26
+ pageRef: params.fillableForm.pageRef,
27
+ url,
28
+ title,
29
+ execution,
30
+ };
31
+ }
32
+ catch (error) {
33
+ return {
34
+ success: false,
35
+ error: 'page_resolution_failed',
36
+ message: 'Protected fill could not resolve the target page in the browser.',
37
+ reason: error instanceof Error ? error.message : String(error),
38
+ };
39
+ }
40
+ });
41
+ }
42
+ catch (error) {
43
+ return {
44
+ success: false,
45
+ error: 'browser_connection_failed',
46
+ message: 'Protected fill could not reach the browser session.',
47
+ reason: error instanceof Error ? error.message : String(error),
48
+ };
49
+ }
11
50
  }
12
51
  export function buildProtectedExposureArtifacts(params) {
13
52
  const filteredProtectedValues = Object.fromEntries(Object.entries(params.protectedValues).filter((entry) => {
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sticky-owner-host-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky-owner-host-entry.d.ts","sourceRoot":"","sources":["../src/sticky-owner-host-entry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ import { existsSync, rmSync, statSync, writeFileSync } from 'node:fs';
2
+ import { connectPlaywright, disconnectPlaywright } from './playwright-runtime.js';
3
+ function readArgValue(argv, name) {
4
+ const index = argv.indexOf(name);
5
+ const value = index >= 0 ? argv[index + 1] : undefined;
6
+ if (!value || value.startsWith('--')) {
7
+ throw new Error(`Missing ${name} argument.`);
8
+ }
9
+ return value;
10
+ }
11
+ function parseArgs(argv = process.argv) {
12
+ const ttlRaw = readArgValue(argv, '--ttl-ms');
13
+ const ttlMs = Number(ttlRaw);
14
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
15
+ throw new Error('Invalid --ttl-ms argument.');
16
+ }
17
+ return {
18
+ manifestPath: readArgValue(argv, '--manifest'),
19
+ cdpUrl: readArgValue(argv, '--cdp-url'),
20
+ hostId: readArgValue(argv, '--host-id'),
21
+ browserSessionId: readArgValue(argv, '--browser-session-id'),
22
+ touchPath: readArgValue(argv, '--touch-path'),
23
+ ttlMs,
24
+ };
25
+ }
26
+ function touchLeaseFile(path) {
27
+ writeFileSync(path, new Date().toISOString());
28
+ }
29
+ function readLeaseAgeMs(path) {
30
+ if (!existsSync(path)) {
31
+ return Number.POSITIVE_INFINITY;
32
+ }
33
+ try {
34
+ return Math.max(0, Date.now() - statSync(path).mtimeMs);
35
+ }
36
+ catch {
37
+ return Number.POSITIVE_INFINITY;
38
+ }
39
+ }
40
+ async function main() {
41
+ const args = parseArgs();
42
+ const browser = await connectPlaywright(args.cdpUrl);
43
+ const binding = await browser.bind(args.hostId, {
44
+ metadata: {
45
+ hostId: args.hostId,
46
+ browserSessionId: args.browserSessionId,
47
+ pid: process.pid,
48
+ startedAt: new Date().toISOString(),
49
+ },
50
+ });
51
+ touchLeaseFile(args.touchPath);
52
+ writeFileSync(args.manifestPath, JSON.stringify({
53
+ endpoint: binding.endpoint,
54
+ pid: process.pid,
55
+ startedAt: new Date().toISOString(),
56
+ }, null, 2));
57
+ let shuttingDown = false;
58
+ let ttlInterval = null;
59
+ const shutdown = async () => {
60
+ if (shuttingDown) {
61
+ return;
62
+ }
63
+ shuttingDown = true;
64
+ if (ttlInterval) {
65
+ clearInterval(ttlInterval);
66
+ ttlInterval = null;
67
+ }
68
+ await browser.unbind().catch(() => undefined);
69
+ await disconnectPlaywright(browser).catch(() => undefined);
70
+ rmSync(args.touchPath, { force: true });
71
+ process.exit(0);
72
+ };
73
+ const reapExpiredOwner = () => {
74
+ if (readLeaseAgeMs(args.touchPath) >= args.ttlMs) {
75
+ void shutdown();
76
+ }
77
+ };
78
+ browser.on('disconnected', () => {
79
+ void shutdown();
80
+ });
81
+ process.on('SIGINT', () => {
82
+ void shutdown();
83
+ });
84
+ process.on('SIGTERM', () => {
85
+ void shutdown();
86
+ });
87
+ const ttlCheckMs = Math.max(5_000, Math.min(Math.floor(args.ttlMs / 6), 60_000));
88
+ ttlInterval = setInterval(reapExpiredOwner, ttlCheckMs);
89
+ ttlInterval.unref?.();
90
+ reapExpiredOwner();
91
+ await new Promise(() => { });
92
+ }
93
+ void main().catch((error) => {
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ console.error(message);
96
+ process.exit(1);
97
+ });
@@ -0,0 +1,15 @@
1
+ import { type Browser } from 'playwright-core';
2
+ import { type BrowserSessionState } from './browser-session-state.js';
3
+ export type RestoreBrowserSessionOwnerResult = {
4
+ success: true;
5
+ session: BrowserSessionState;
6
+ restored: boolean;
7
+ } | {
8
+ success: false;
9
+ reason: 'sticky_owner_unrecoverable';
10
+ };
11
+ export declare function initializeBrowserSessionOwner(session: BrowserSessionState): Promise<BrowserSessionState>;
12
+ export declare function terminateBrowserSessionOwner(session: BrowserSessionState | null): Promise<void>;
13
+ export declare function restoreBrowserSessionOwner(session: BrowserSessionState): Promise<RestoreBrowserSessionOwnerResult>;
14
+ export declare function withStickyOwnerBrowser<TResult>(session: BrowserSessionState, operation: (browser: Browser) => Promise<TResult>): Promise<TResult>;
15
+ //# sourceMappingURL=sticky-owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky-owner.d.ts","sourceRoot":"","sources":["../src/sticky-owner.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAIL,KAAK,mBAAmB,EAGzB,MAAM,4BAA4B,CAAC;AAWpC,MAAM,MAAM,gCAAgC,GACxC;IACE,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,4BAA4B,CAAC;CACtC,CAAC;AAyVN,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,mBAAmB,GAAG,IAAI,GAClC,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gCAAgC,CAAC,CAiG3C;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAClD,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC,CA0BlB"}