dsh-browser-plus 0.0.0-stage → 0.5.0

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 (76) hide show
  1. package/CHANGELOG.md +166 -0
  2. package/LICENSE +22 -0
  3. package/NOTICE.md +7 -0
  4. package/README.en.md +100 -0
  5. package/README.md +99 -2
  6. package/assets/dsh-browser-plus-256.png +0 -0
  7. package/assets/dsh-browser-plus-512.png +0 -0
  8. package/assets/dsh-browser-plus-small.svg +9 -0
  9. package/assets/dsh-browser-plus.ico +0 -0
  10. package/assets/dsh-browser-plus.svg +11 -0
  11. package/assets/readme-workspace.png +0 -0
  12. package/cordis.patch.yml +17 -0
  13. package/docs/MIGRATION.md +48 -0
  14. package/docs/README.md +22 -0
  15. package/docs/SOAK-CHECKLIST.md +98 -0
  16. package/docs/architecture.md +88 -0
  17. package/docs/tool-reference.md +124 -0
  18. package/docs/user-guide.md +121 -0
  19. package/docs/why-browser.md +45 -0
  20. package/lib/browser/runtime.d.ts +225 -0
  21. package/lib/browser/runtime.js +302 -0
  22. package/lib/browser/types.d.ts +668 -0
  23. package/lib/browser/types.js +18 -0
  24. package/lib/browser-electron/auth-cookies.d.ts +54 -0
  25. package/lib/browser-electron/auth-cookies.js +83 -0
  26. package/lib/browser-electron/chrome-state.d.ts +187 -0
  27. package/lib/browser-electron/chrome-state.js +12 -0
  28. package/lib/browser-electron/entry.d.ts +66 -0
  29. package/lib/browser-electron/entry.js +62 -0
  30. package/lib/browser-electron/fingerprint.d.ts +29 -0
  31. package/lib/browser-electron/fingerprint.js +42 -0
  32. package/lib/browser-electron/host-main.d.ts +18 -0
  33. package/lib/browser-electron/host-main.js +2494 -0
  34. package/lib/browser-electron/icon.d.ts +11 -0
  35. package/lib/browser-electron/icon.js +23 -0
  36. package/lib/browser-electron/page-chrome.d.ts +21 -0
  37. package/lib/browser-electron/page-chrome.js +2034 -0
  38. package/lib/browser-electron/provider.d.ts +709 -0
  39. package/lib/browser-electron/provider.js +2575 -0
  40. package/lib/browser-electron/remote-host.d.ts +143 -0
  41. package/lib/browser-electron/remote-host.js +952 -0
  42. package/lib/browser-electron/task-summary.d.ts +2 -0
  43. package/lib/browser-electron/task-summary.js +12 -0
  44. package/lib/browser-electron/task-thumbnail.d.ts +11 -0
  45. package/lib/browser-electron/task-thumbnail.js +9 -0
  46. package/lib/browser-electron/write-guard.d.ts +41 -0
  47. package/lib/browser-electron/write-guard.js +123 -0
  48. package/lib/index.d.ts +16 -0
  49. package/lib/index.js +14 -0
  50. package/lib/tool-browser/index.d.ts +31 -0
  51. package/lib/tool-browser/index.js +1931 -0
  52. package/package.json +95 -4
  53. package/screenshots.json +3 -0
  54. package/scripts/build-icons.mjs +80 -0
  55. package/scripts/capture-window.ps1 +79 -0
  56. package/scripts/crop-image.ps1 +20 -0
  57. package/scripts/smoke-browser-tools.mjs +1968 -0
  58. package/scripts/smoke-chrome-world.mjs +63 -0
  59. package/scripts/smoke-electron-host.mjs +50 -0
  60. package/src/browser/runtime.ts +470 -0
  61. package/src/browser/types.ts +649 -0
  62. package/src/browser-electron/auth-cookies.ts +125 -0
  63. package/src/browser-electron/chrome-state.ts +174 -0
  64. package/src/browser-electron/entry.ts +115 -0
  65. package/src/browser-electron/fingerprint.ts +45 -0
  66. package/src/browser-electron/host-main.ts +2330 -0
  67. package/src/browser-electron/icon.ts +26 -0
  68. package/src/browser-electron/page-chrome.ts +2046 -0
  69. package/src/browser-electron/provider.ts +3088 -0
  70. package/src/browser-electron/remote-host.ts +1004 -0
  71. package/src/browser-electron/task-summary.ts +10 -0
  72. package/src/browser-electron/task-thumbnail.ts +17 -0
  73. package/src/browser-electron/write-guard.ts +134 -0
  74. package/src/index.ts +52 -0
  75. package/src/tool-browser/index.ts +1974 -0
  76. package/src/types/electron-shim.d.ts +143 -0
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Service Definition for the browser capability seam (`ctx.browser`): the
3
+ * provider registry and provider-selecting execution for browser sessions.
4
+ * Duplicate ids are rejected. At execution time, a configured provider must
5
+ * exist and be usable; without one, exactly one usable provider is required,
6
+ * so selection never depends on registration order.
7
+ * @module dsh-browser-plus/browser
8
+ */
9
+ import { Context, Service } from '@deepseek-ai/cordis';
10
+ import z from '@deepseek-ai/schemastery';
11
+ import type { BrowserContentRequest, BrowserHandoffState, BrowserContentResult, BrowserDownloadRequest, BrowserExecuteRequest, BrowserExecuteResult, BrowserFillRequest, BrowserFillResult, BrowserHistoryEntry, BrowserNavigateRequest, BrowserOpenOptions, BrowserOpenRequest, BrowserDragRequest, BrowserDragResult, BrowserPointerResult, BrowserPointerTarget, BrowserPressKeyRequest, BrowserClearAuthRequest, BrowserScrapeRequest, BrowserScrapeStatus, BrowserClearAuthResult, BrowserProvider, BrowserRefRequest, BrowserScreenshotRequest, BrowserScreenshotResult, BrowserScrollIntoViewRequest, BrowserScrollRequest, BrowserScrollResult, BrowserSessionId, BrowserSnapshotResult, BrowserSpaceInfo, BrowserTaskInfo, BrowserTaskUpdate, BrowserTab, BrowserTypeRequest, BrowserUploadFileRequest, BrowserUploadFileResult, BrowserWaitForRequest, BrowserWaitForResult, BrowserChallenge, ExportedCookie } from './types.ts';
12
+ export { BrowserError, } from './types.ts';
13
+ export type { BrowserChallenge, BrowserContentFormat, BrowserControlOwner, BrowserContentRequest, BrowserContentResult, BrowserDownloadRequest, BrowserExecuteRequest, BrowserExecuteResult, BrowserFillField, BrowserFillRequest, BrowserFillResult, BrowserHandoffState, BrowserHistoryEntry, BrowserNavigateRequest, BrowserOpenOptions, BrowserOpenRequest, BrowserDragRequest, BrowserDragResult, BrowserPointerResult, BrowserPointerTarget, BrowserPressKeyRequest, BrowserClearAuthRequest, BrowserScrapeRequest, BrowserScrapeStatus, BrowserClearAuthResult, BrowserProvider, BrowserRefRequest, BrowserScreenshotRequest, BrowserScreenshotResult, BrowserScrollIntoViewRequest, BrowserScrollRequest, BrowserScrollResult, BrowserSessionId, BrowserSnapshotElement, BrowserSnapshotResult, BrowserSpaceInfo, BrowserTaskInfo, BrowserTaskStatus, BrowserTaskUpdate, BrowserTab, BrowserTypeRequest, BrowserUploadFileRequest, BrowserUploadFileResult, BrowserWaitForRequest, BrowserWaitForResult, ExportedCookie, } from './types.ts';
14
+ declare module '@deepseek-ai/cordis' {
15
+ interface Context {
16
+ browser: BrowserRuntime;
17
+ }
18
+ }
19
+ /**
20
+ * Config for the browser seam. `browserProvider` pins which provider wins;
21
+ * it is optional (a single registered usable provider auto-selects).
22
+ */
23
+ export interface BrowserRuntimeConfig {
24
+ /** Explicit browser provider id. Omitted = auto-select when exactly one usable. */
25
+ readonly browserProvider?: string;
26
+ }
27
+ /**
28
+ * The browser access service. Registered as `ctx.browser` (one instance per
29
+ * context).
30
+ *
31
+ * Selection semantics (resolved at execution time, never order-dependent):
32
+ * - A configured id that is registered and `available()` → that provider.
33
+ * - A configured id not registered → `BROWSER_PROVIDER_CONFIGURED_MISSING`.
34
+ * - A configured id registered but unavailable → `BROWSER_PROVIDER_CONFIGURED_UNAVAILABLE`.
35
+ * - No id configured, exactly one registered usable provider → that provider.
36
+ * - No id configured, multiple usable providers → `BROWSER_PROVIDER_AMBIGUOUS`.
37
+ * - No id configured, no usable provider → `BROWSER_PROVIDER_UNAVAILABLE`.
38
+ */
39
+ export declare class BrowserRuntime extends Service {
40
+ /** Provider selection config. */
41
+ static Config: z<BrowserRuntimeConfig>;
42
+ private providers;
43
+ private readonly providerId;
44
+ constructor(ctx: Context, config?: BrowserRuntimeConfig);
45
+ /**
46
+ * Register a browser provider. Throws {@link BrowserError}
47
+ * `BROWSER_DUPLICATE_PROVIDER` if its id is already registered. Returns a
48
+ * disposer; disposed with the calling fiber.
49
+ * @param provider - the provider; its `id` is the registry key.
50
+ * @returns the disposer that unregisters the provider.
51
+ */
52
+ registerBrowserProvider(provider: BrowserProvider): () => void;
53
+ /** Resolve the selected provider or throw the matching {@link BrowserError}. */
54
+ private resolveProvider;
55
+ /** Open a new browser session through the selected provider. */
56
+ open(options?: BrowserOpenOptions): Promise<BrowserSessionId>;
57
+ /** Open a URL through the selected provider, optionally in a new tab. */
58
+ openUrl(session: BrowserSessionId, request: BrowserOpenRequest, signal?: AbortSignal): Promise<void>;
59
+ /** List the session's tabs through the selected provider. */
60
+ listTabs(session: BrowserSessionId): Promise<readonly BrowserTab[]>;
61
+ /** Switch to a tab through the selected provider. */
62
+ switchTab(session: BrowserSessionId, tabId: string): Promise<void>;
63
+ /** Close one tab through the selected provider. */
64
+ closeTab(session: BrowserSessionId, tabId: string): Promise<boolean>;
65
+ /** Close every tab and reset the session through the selected provider. */
66
+ reset(session: BrowserSessionId): Promise<void>;
67
+ /** Navigate the session's page through the selected provider. */
68
+ navigate(session: BrowserSessionId, request: BrowserNavigateRequest, signal?: AbortSignal): Promise<void>;
69
+ /** Navigate to the previous history entry through the selected provider. */
70
+ back(session: BrowserSessionId, signal?: AbortSignal): Promise<boolean>;
71
+ /** Navigate to the next history entry through the selected provider. */
72
+ forward(session: BrowserSessionId, signal?: AbortSignal): Promise<boolean>;
73
+ /** Reload the active page through the selected provider. */
74
+ reload(session: BrowserSessionId, signal?: AbortSignal): Promise<void>;
75
+ /** Stop loading the active page through the selected provider. */
76
+ stopLoading(session: BrowserSessionId, signal?: AbortSignal): Promise<void>;
77
+ /** Execute JS in the session's page context through the selected provider. */
78
+ execute(session: BrowserSessionId, request: BrowserExecuteRequest, signal?: AbortSignal): Promise<BrowserExecuteResult>;
79
+ /** Produce an AI-friendly snapshot of the session's page. */
80
+ snapshot(session: BrowserSessionId, options?: {
81
+ query?: string;
82
+ limit?: number;
83
+ }, signal?: AbortSignal): Promise<BrowserSnapshotResult>;
84
+ /** Apply device/viewport/media emulation to the session's active tab. */
85
+ emulate(session: BrowserSessionId, options?: {
86
+ width?: number;
87
+ height?: number;
88
+ deviceScaleFactor?: number;
89
+ mobile?: boolean;
90
+ userAgent?: string;
91
+ colorScheme?: 'light' | 'dark' | 'no-preference';
92
+ clear?: boolean;
93
+ }): Promise<{
94
+ applied: string[];
95
+ }>;
96
+ /** Console messages the host captured for the session's active tab. */
97
+ consoleMessages(session: BrowserSessionId, options?: {
98
+ limit?: number;
99
+ level?: string;
100
+ clear?: boolean;
101
+ }): Promise<{
102
+ messages: Array<{
103
+ level: string;
104
+ text: string;
105
+ at: string;
106
+ }>;
107
+ }>;
108
+ /** Network requests the host captured for the session's active tab. */
109
+ networkRequests(session: BrowserSessionId, options?: {
110
+ limit?: number;
111
+ failedOnly?: boolean;
112
+ urlContains?: string;
113
+ clear?: boolean;
114
+ }): Promise<{
115
+ requests: Array<{
116
+ method: string;
117
+ url: string;
118
+ status?: number;
119
+ mime?: string;
120
+ kind?: string;
121
+ failed?: string;
122
+ ms?: number;
123
+ at: string;
124
+ }>;
125
+ }>;
126
+ /** Set how the host answers the next JS dialog, and report the state. */
127
+ setDialogPolicy(session: BrowserSessionId, policy: {
128
+ behavior: 'accept' | 'dismiss';
129
+ promptText?: string;
130
+ }): Promise<{
131
+ dialog: unknown;
132
+ policy: {
133
+ behavior: 'accept' | 'dismiss';
134
+ promptText?: string;
135
+ };
136
+ }>;
137
+ /** Drain any pending dialog, then report the last one and the current policy. */
138
+ inspectDialog(session: BrowserSessionId): Promise<{
139
+ dialog: unknown;
140
+ policy: {
141
+ behavior: 'accept' | 'dismiss';
142
+ promptText?: string;
143
+ };
144
+ }>;
145
+ /** The last JS dialog the host reported, plus the current policy. */
146
+ dialogState(session: BrowserSessionId): {
147
+ dialog: unknown;
148
+ policy: {
149
+ behavior: 'accept' | 'dismiss';
150
+ promptText?: string;
151
+ };
152
+ };
153
+ /** Click one element referenced by an exact snapshot. */
154
+ clickRef(session: BrowserSessionId, request: BrowserRefRequest, signal?: AbortSignal): Promise<void>;
155
+ /** Scroll one element referenced by an exact snapshot into view. */
156
+ scrollIntoView(session: BrowserSessionId, request: BrowserScrollIntoViewRequest, signal?: AbortSignal): Promise<BrowserScrollResult>;
157
+ /** Fetch page content in a requested format. */
158
+ content(session: BrowserSessionId, request: BrowserContentRequest, signal?: AbortSignal): Promise<BrowserContentResult>;
159
+ /** Click at viewport coordinates through the selected provider. */
160
+ click(session: BrowserSessionId, request: BrowserPointerTarget, signal?: AbortSignal): Promise<BrowserPointerResult>;
161
+ /** Double-click at viewport coordinates through the selected provider. */
162
+ doubleClick(session: BrowserSessionId, request: BrowserPointerTarget, signal?: AbortSignal): Promise<BrowserPointerResult>;
163
+ /** Press on one target, move to another, release, through the selected provider. */
164
+ drag(session: BrowserSessionId, request: BrowserDragRequest, signal?: AbortSignal): Promise<BrowserDragResult>;
165
+ hover(session: BrowserSessionId, request: BrowserPointerTarget, signal?: AbortSignal): Promise<BrowserPointerResult>;
166
+ /** Scroll the active page through the selected provider. */
167
+ scroll(session: BrowserSessionId, request: BrowserScrollRequest, signal?: AbortSignal): Promise<BrowserScrollResult>;
168
+ /** Attach a local file to a file input through the selected provider. */
169
+ uploadFile(session: BrowserSessionId, request: BrowserUploadFileRequest, signal?: AbortSignal): Promise<BrowserUploadFileResult>;
170
+ /** Wait for an element through the selected provider (bounded polling). */
171
+ waitForElement(session: BrowserSessionId, request: BrowserWaitForRequest, signal?: AbortSignal): Promise<BrowserWaitForResult>;
172
+ /** Type into the focused element through the selected provider. */
173
+ type(session: BrowserSessionId, request: BrowserTypeRequest, signal?: AbortSignal): Promise<void>;
174
+ /** Press a key into the session's page through the selected provider. */
175
+ pressKey(session: BrowserSessionId, request: BrowserPressKeyRequest, signal?: AbortSignal): Promise<void>;
176
+ /** Fill a form's fields in one batch through the selected provider. */
177
+ fillForm(session: BrowserSessionId, request: BrowserFillRequest, signal?: AbortSignal): Promise<BrowserFillResult>;
178
+ /** Capture the current page through the selected provider. */
179
+ screenshot(session: BrowserSessionId, request?: BrowserScreenshotRequest, signal?: AbortSignal): Promise<BrowserScreenshotResult>;
180
+ /** Check for a human-verification challenge on the active tab. */
181
+ detectChallenge(session: BrowserSessionId, signal?: AbortSignal): Promise<BrowserChallenge>;
182
+ /** Return the session's chronological operation log through the provider. */
183
+ history(session: BrowserSessionId): Promise<readonly BrowserHistoryEntry[]>;
184
+ /** Replay one recorded operation by sequence number through the provider. */
185
+ replay(session: BrowserSessionId, seq: number): Promise<void>;
186
+ /** Download a URL to a local file through the provider. */
187
+ download(session: BrowserSessionId, request: BrowserDownloadRequest, signal?: AbortSignal): Promise<{
188
+ readonly path: string;
189
+ }>;
190
+ /** Export the session's cookies through the provider. */
191
+ flushAuth(session: BrowserSessionId): Promise<readonly ExportedCookie[]>;
192
+ /** Import cookies into the session through the provider. */
193
+ restoreAuth(session: BrowserSessionId, cookies: readonly ExportedCookie[]): Promise<number>;
194
+ /** Import cookies from a JSON export on disk through the provider. */
195
+ importAuth(session: BrowserSessionId, path: string): Promise<{
196
+ restored: number;
197
+ failed: number;
198
+ }>;
199
+ /** Start a background scrape batch through the provider. */
200
+ startScrape(session: BrowserSessionId, request: BrowserScrapeRequest): Promise<BrowserScrapeStatus>;
201
+ /** Progress of one scrape batch through the provider. */
202
+ scrapeStatus(id: string): Promise<BrowserScrapeStatus>;
203
+ /** Ask a running scrape batch to stop through the provider. */
204
+ stopScrape(id: string): Promise<BrowserScrapeStatus>;
205
+ /** Every scrape batch the provider knows about. */
206
+ listScrapes(): Promise<readonly BrowserScrapeStatus[]>;
207
+ /** Remove cookies for one site scope through the provider. */
208
+ clearAuth(session: BrowserSessionId, request: BrowserClearAuthRequest): Promise<BrowserClearAuthResult>;
209
+ /** Set the session's browser task label through the selected provider. */
210
+ setSpace(session: BrowserSessionId, label: string): Promise<void>;
211
+ /** List browser tasks (legacy spaces) with labels through the selected provider. */
212
+ listSpaces(): Promise<readonly BrowserSpaceInfo[]>;
213
+ /** List browser tasks with live collaboration status through the provider. */
214
+ listTasks(): Promise<readonly BrowserTaskInfo[]>;
215
+ /** Read one session's task collaboration state through the provider. */
216
+ getTask(session: BrowserSessionId): Promise<BrowserTaskInfo>;
217
+ /** Update one session's visible task state through the provider. */
218
+ updateTask(session: BrowserSessionId, update: BrowserTaskUpdate): Promise<BrowserTaskInfo>;
219
+ /** Mark one session as waiting for the user or returned to Agent control. */
220
+ setHandoff(session: BrowserSessionId, state: BrowserHandoffState): Promise<BrowserTaskInfo>;
221
+ /** Close the session through the selected provider. Idempotent; a missing
222
+ * provider is treated as already-closed so teardown paths stay no-ops. */
223
+ close(session: BrowserSessionId): Promise<void>;
224
+ }
225
+ export default BrowserRuntime;
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Service Definition for the browser capability seam (`ctx.browser`): the
3
+ * provider registry and provider-selecting execution for browser sessions.
4
+ * Duplicate ids are rejected. At execution time, a configured provider must
5
+ * exist and be usable; without one, exactly one usable provider is required,
6
+ * so selection never depends on registration order.
7
+ * @module dsh-browser-plus/browser
8
+ */
9
+ import { Service } from '@deepseek-ai/cordis';
10
+ import z from '@deepseek-ai/schemastery';
11
+ import { BrowserError } from "./types.js";
12
+ export { BrowserError, } from "./types.js";
13
+ /**
14
+ * The browser access service. Registered as `ctx.browser` (one instance per
15
+ * context).
16
+ *
17
+ * Selection semantics (resolved at execution time, never order-dependent):
18
+ * - A configured id that is registered and `available()` → that provider.
19
+ * - A configured id not registered → `BROWSER_PROVIDER_CONFIGURED_MISSING`.
20
+ * - A configured id registered but unavailable → `BROWSER_PROVIDER_CONFIGURED_UNAVAILABLE`.
21
+ * - No id configured, exactly one registered usable provider → that provider.
22
+ * - No id configured, multiple usable providers → `BROWSER_PROVIDER_AMBIGUOUS`.
23
+ * - No id configured, no usable provider → `BROWSER_PROVIDER_UNAVAILABLE`.
24
+ */
25
+ export class BrowserRuntime extends Service {
26
+ /** Provider selection config. */
27
+ static Config = z.object({
28
+ browserProvider: z.string(),
29
+ });
30
+ providers = new Map();
31
+ providerId;
32
+ constructor(ctx, config = {}) {
33
+ super(ctx, 'browser');
34
+ this.providerId = config.browserProvider;
35
+ }
36
+ /**
37
+ * Register a browser provider. Throws {@link BrowserError}
38
+ * `BROWSER_DUPLICATE_PROVIDER` if its id is already registered. Returns a
39
+ * disposer; disposed with the calling fiber.
40
+ * @param provider - the provider; its `id` is the registry key.
41
+ * @returns the disposer that unregisters the provider.
42
+ */
43
+ registerBrowserProvider(provider) {
44
+ if (this.providers.has(provider.id)) {
45
+ throw new BrowserError(`a browser provider with id "${provider.id}" is already registered`, 'BROWSER_DUPLICATE_PROVIDER');
46
+ }
47
+ // Bind the generator to this instance instead of aliasing `this` to a
48
+ // local (no-this-alias): the effect body mutates the instance registry.
49
+ const dispose = this.ctx.effect(function* () {
50
+ this.providers.set(provider.id, provider);
51
+ yield () => this.providers.delete(provider.id);
52
+ }.bind(this), 'browser.registerProvider()');
53
+ // ctx.effect's disposer returns Promise<void>; our disposer API is
54
+ // synchronous fire-and-forget — discard the (always-resolved) promise.
55
+ return () => void dispose();
56
+ }
57
+ /** Resolve the selected provider or throw the matching {@link BrowserError}. */
58
+ resolveProvider() {
59
+ const { providerId, providers } = this;
60
+ if (providerId !== undefined) {
61
+ const provider = providers.get(providerId);
62
+ if (!provider) {
63
+ throw new BrowserError(`configured browser provider "${providerId}" is not registered`, 'BROWSER_PROVIDER_CONFIGURED_MISSING');
64
+ }
65
+ if (!provider.available()) {
66
+ throw new BrowserError(`configured browser provider "${providerId}" is registered but unavailable`, 'BROWSER_PROVIDER_CONFIGURED_UNAVAILABLE');
67
+ }
68
+ return provider;
69
+ }
70
+ const usable = [...providers.values()].filter(provider => provider.available());
71
+ const [single] = usable;
72
+ if (single === undefined) {
73
+ throw new BrowserError('no usable browser provider is registered', 'BROWSER_PROVIDER_UNAVAILABLE');
74
+ }
75
+ if (usable.length > 1) {
76
+ const ids = usable.map(provider => provider.id).join(', ');
77
+ throw new BrowserError(`multiple usable browser providers are registered (${ids}); configure one explicitly`, 'BROWSER_PROVIDER_AMBIGUOUS');
78
+ }
79
+ return single;
80
+ }
81
+ /** Open a new browser session through the selected provider. */
82
+ async open(options) {
83
+ return this.resolveProvider().open(options);
84
+ }
85
+ /** Open a URL through the selected provider, optionally in a new tab. */
86
+ async openUrl(session, request, signal) {
87
+ return this.resolveProvider().openUrl(session, request, signal);
88
+ }
89
+ /** List the session's tabs through the selected provider. */
90
+ async listTabs(session) {
91
+ return this.resolveProvider().listTabs(session);
92
+ }
93
+ /** Switch to a tab through the selected provider. */
94
+ async switchTab(session, tabId) {
95
+ return this.resolveProvider().switchTab(session, tabId);
96
+ }
97
+ /** Close one tab through the selected provider. */
98
+ async closeTab(session, tabId) {
99
+ return this.resolveProvider().closeTab(session, tabId);
100
+ }
101
+ /** Close every tab and reset the session through the selected provider. */
102
+ async reset(session) {
103
+ return this.resolveProvider().reset(session);
104
+ }
105
+ /** Navigate the session's page through the selected provider. */
106
+ async navigate(session, request, signal) {
107
+ return this.resolveProvider().navigate(session, request, signal);
108
+ }
109
+ /** Navigate to the previous history entry through the selected provider. */
110
+ async back(session, signal) {
111
+ return this.resolveProvider().back(session, signal);
112
+ }
113
+ /** Navigate to the next history entry through the selected provider. */
114
+ async forward(session, signal) {
115
+ return this.resolveProvider().forward(session, signal);
116
+ }
117
+ /** Reload the active page through the selected provider. */
118
+ async reload(session, signal) {
119
+ return this.resolveProvider().reload(session, signal);
120
+ }
121
+ /** Stop loading the active page through the selected provider. */
122
+ async stopLoading(session, signal) {
123
+ return this.resolveProvider().stopLoading(session, signal);
124
+ }
125
+ /** Execute JS in the session's page context through the selected provider. */
126
+ async execute(session, request, signal) {
127
+ return this.resolveProvider().execute(session, request, signal);
128
+ }
129
+ /** Produce an AI-friendly snapshot of the session's page. */
130
+ async snapshot(session, options = {}, signal) {
131
+ return this.resolveProvider().snapshot(session, options, signal);
132
+ }
133
+ /** Apply device/viewport/media emulation to the session's active tab. */
134
+ async emulate(session, options = {}) {
135
+ return this.resolveProvider().emulate(session, options);
136
+ }
137
+ /** Console messages the host captured for the session's active tab. */
138
+ async consoleMessages(session, options = {}) {
139
+ return this.resolveProvider().consoleMessages(session, options);
140
+ }
141
+ /** Network requests the host captured for the session's active tab. */
142
+ async networkRequests(session, options = {}) {
143
+ return this.resolveProvider().networkRequests(session, options);
144
+ }
145
+ /** Set how the host answers the next JS dialog, and report the state. */
146
+ async setDialogPolicy(session, policy) {
147
+ return this.resolveProvider().setDialogPolicy(session, policy);
148
+ }
149
+ /** Drain any pending dialog, then report the last one and the current policy. */
150
+ async inspectDialog(session) {
151
+ return this.resolveProvider().inspectDialog(session);
152
+ }
153
+ /** The last JS dialog the host reported, plus the current policy. */
154
+ dialogState(session) {
155
+ return this.resolveProvider().dialogState(session);
156
+ }
157
+ /** Click one element referenced by an exact snapshot. */
158
+ async clickRef(session, request, signal) {
159
+ return this.resolveProvider().clickRef(session, request, signal);
160
+ }
161
+ /** Scroll one element referenced by an exact snapshot into view. */
162
+ async scrollIntoView(session, request, signal) {
163
+ return this.resolveProvider().scrollIntoView(session, request, signal);
164
+ }
165
+ /** Fetch page content in a requested format. */
166
+ async content(session, request, signal) {
167
+ return this.resolveProvider().content(session, request, signal);
168
+ }
169
+ /** Click at viewport coordinates through the selected provider. */
170
+ async click(session, request, signal) {
171
+ return this.resolveProvider().click(session, request, signal);
172
+ }
173
+ /** Double-click at viewport coordinates through the selected provider. */
174
+ async doubleClick(session, request, signal) {
175
+ return this.resolveProvider().doubleClick(session, request, signal);
176
+ }
177
+ /** Press on one target, move to another, release, through the selected provider. */
178
+ async drag(session, request, signal) {
179
+ return this.resolveProvider().drag(session, request, signal);
180
+ }
181
+ async hover(session, request, signal) {
182
+ return this.resolveProvider().hover(session, request, signal);
183
+ }
184
+ /** Scroll the active page through the selected provider. */
185
+ async scroll(session, request, signal) {
186
+ return this.resolveProvider().scroll(session, request, signal);
187
+ }
188
+ /** Attach a local file to a file input through the selected provider. */
189
+ async uploadFile(session, request, signal) {
190
+ return this.resolveProvider().uploadFile(session, request, signal);
191
+ }
192
+ /** Wait for an element through the selected provider (bounded polling). */
193
+ async waitForElement(session, request, signal) {
194
+ return this.resolveProvider().waitForElement(session, request, signal);
195
+ }
196
+ /** Type into the focused element through the selected provider. */
197
+ async type(session, request, signal) {
198
+ return this.resolveProvider().type(session, request, signal);
199
+ }
200
+ /** Press a key into the session's page through the selected provider. */
201
+ async pressKey(session, request, signal) {
202
+ return this.resolveProvider().pressKey(session, request, signal);
203
+ }
204
+ /** Fill a form's fields in one batch through the selected provider. */
205
+ async fillForm(session, request, signal) {
206
+ return this.resolveProvider().fillForm(session, request, signal);
207
+ }
208
+ /** Capture the current page through the selected provider. */
209
+ async screenshot(session, request, signal) {
210
+ return this.resolveProvider().screenshot(session, request, signal);
211
+ }
212
+ /** Check for a human-verification challenge on the active tab. */
213
+ async detectChallenge(session, signal) {
214
+ return this.resolveProvider().detectChallenge(session, signal);
215
+ }
216
+ /** Return the session's chronological operation log through the provider. */
217
+ async history(session) {
218
+ return this.resolveProvider().history(session);
219
+ }
220
+ /** Replay one recorded operation by sequence number through the provider. */
221
+ async replay(session, seq) {
222
+ return this.resolveProvider().replay(session, seq);
223
+ }
224
+ /** Download a URL to a local file through the provider. */
225
+ async download(session, request, signal) {
226
+ return this.resolveProvider().download(session, request, signal);
227
+ }
228
+ /** Export the session's cookies through the provider. */
229
+ async flushAuth(session) {
230
+ return this.resolveProvider().flushAuth(session);
231
+ }
232
+ /** Import cookies into the session through the provider. */
233
+ async restoreAuth(session, cookies) {
234
+ return this.resolveProvider().restoreAuth(session, cookies);
235
+ }
236
+ /** Import cookies from a JSON export on disk through the provider. */
237
+ async importAuth(session, path) {
238
+ return this.resolveProvider().importAuth(session, path);
239
+ }
240
+ /** Start a background scrape batch through the provider. */
241
+ async startScrape(session, request) {
242
+ return this.resolveProvider().startScrape(session, request);
243
+ }
244
+ /** Progress of one scrape batch through the provider. */
245
+ async scrapeStatus(id) {
246
+ return this.resolveProvider().scrapeStatus(id);
247
+ }
248
+ /** Ask a running scrape batch to stop through the provider. */
249
+ async stopScrape(id) {
250
+ return this.resolveProvider().stopScrape(id);
251
+ }
252
+ /** Every scrape batch the provider knows about. */
253
+ async listScrapes() {
254
+ return this.resolveProvider().listScrapes();
255
+ }
256
+ /** Remove cookies for one site scope through the provider. */
257
+ async clearAuth(session, request) {
258
+ return this.resolveProvider().clearAuth(session, request);
259
+ }
260
+ /** Set the session's browser task label through the selected provider. */
261
+ async setSpace(session, label) {
262
+ return this.resolveProvider().setSpace(session, label);
263
+ }
264
+ /** List browser tasks (legacy spaces) with labels through the selected provider. */
265
+ async listSpaces() {
266
+ return this.resolveProvider().listSpaces();
267
+ }
268
+ /** List browser tasks with live collaboration status through the provider. */
269
+ async listTasks() {
270
+ return this.resolveProvider().listTasks();
271
+ }
272
+ /** Read one session's task collaboration state through the provider. */
273
+ async getTask(session) {
274
+ return this.resolveProvider().getTask(session);
275
+ }
276
+ /** Update one session's visible task state through the provider. */
277
+ async updateTask(session, update) {
278
+ return this.resolveProvider().updateTask(session, update);
279
+ }
280
+ /** Mark one session as waiting for the user or returned to Agent control. */
281
+ async setHandoff(session, state) {
282
+ return this.resolveProvider().setHandoff(session, state);
283
+ }
284
+ /** Close the session through the selected provider. Idempotent; a missing
285
+ * provider is treated as already-closed so teardown paths stay no-ops. */
286
+ async close(session) {
287
+ try {
288
+ await this.resolveProvider().close(session);
289
+ }
290
+ catch (error) {
291
+ const code = error instanceof BrowserError ? error.code : undefined;
292
+ if (code === 'BROWSER_PROVIDER_UNAVAILABLE'
293
+ || code === 'BROWSER_PROVIDER_CONFIGURED_MISSING'
294
+ || code === 'BROWSER_PROVIDER_CONFIGURED_UNAVAILABLE'
295
+ || code === 'BROWSER_PROVIDER_AMBIGUOUS') {
296
+ return; // provider gone; nothing to close
297
+ }
298
+ throw error;
299
+ }
300
+ }
301
+ }
302
+ export default BrowserRuntime;