@bctrl/sdk 1.0.1
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 +75 -0
- package/dist/agents/browser-use/index.d.ts +1 -0
- package/dist/agents/browser-use/index.js +9 -0
- package/dist/agents/browser-use/namespace.d.ts +39 -0
- package/dist/agents/browser-use/namespace.js +93 -0
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/index.js +17 -0
- package/dist/agents/stagehand/core.d.ts +93 -0
- package/dist/agents/stagehand/core.js +144 -0
- package/dist/agents/stagehand/index.d.ts +3 -0
- package/dist/agents/stagehand/index.js +24 -0
- package/dist/agents/stagehand/namespace.d.ts +51 -0
- package/dist/agents/stagehand/namespace.js +65 -0
- package/dist/ai-credentials/client.d.ts +12 -0
- package/dist/ai-credentials/client.js +70 -0
- package/dist/ai-credentials/index.d.ts +1 -0
- package/dist/ai-credentials/index.js +1 -0
- package/dist/base/event-binding.d.ts +7 -0
- package/dist/base/event-binding.js +23 -0
- package/dist/base/types.d.ts +109 -0
- package/dist/base/types.js +4 -0
- package/dist/bctrl.d.ts +37 -0
- package/dist/bctrl.js +77 -0
- package/dist/browser-extensions/client.d.ts +15 -0
- package/dist/browser-extensions/client.js +72 -0
- package/dist/browser-extensions/index.d.ts +2 -0
- package/dist/browser-extensions/index.js +1 -0
- package/dist/browser-profiles/client.d.ts +11 -0
- package/dist/browser-profiles/client.js +63 -0
- package/dist/browser-profiles/index.d.ts +1 -0
- package/dist/browser-profiles/index.js +1 -0
- package/dist/captcha/index.d.ts +1 -0
- package/dist/captcha/index.js +1 -0
- package/dist/captcha/namespace.d.ts +34 -0
- package/dist/captcha/namespace.js +41 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -0
- package/dist/client/rpc.d.ts +83 -0
- package/dist/client/rpc.js +354 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +28 -0
- package/dist/constants/browser.d.ts +2 -0
- package/dist/constants/browser.js +1 -0
- package/dist/contracts/agent-tools.d.ts +45 -0
- package/dist/contracts/agent-tools.js +31 -0
- package/dist/contracts/automation.d.ts +265 -0
- package/dist/contracts/automation.js +109 -0
- package/dist/contracts/browser-management.d.ts +179 -0
- package/dist/contracts/browser-management.js +95 -0
- package/dist/contracts/browser-use.d.ts +136 -0
- package/dist/contracts/browser-use.js +93 -0
- package/dist/contracts/captcha.d.ts +114 -0
- package/dist/contracts/captcha.js +40 -0
- package/dist/contracts/desktop.d.ts +223 -0
- package/dist/contracts/desktop.js +121 -0
- package/dist/contracts/drivers/playwright.d.ts +2008 -0
- package/dist/contracts/drivers/playwright.js +2033 -0
- package/dist/contracts/drivers/puppeteer.d.ts +1221 -0
- package/dist/contracts/drivers/puppeteer.js +941 -0
- package/dist/contracts/drivers/selenium.d.ts +156 -0
- package/dist/contracts/drivers/selenium.js +61 -0
- package/dist/contracts/drivers/stagehand.d.ts +155 -0
- package/dist/contracts/drivers/stagehand.js +7 -0
- package/dist/contracts/extensions.d.ts +13 -0
- package/dist/contracts/extensions.js +9 -0
- package/dist/contracts/index.d.ts +13 -0
- package/dist/contracts/index.js +13 -0
- package/dist/contracts/public-api.d.ts +360 -0
- package/dist/contracts/public-api.js +17 -0
- package/dist/contracts/runtime.d.ts +81 -0
- package/dist/contracts/runtime.js +16 -0
- package/dist/contracts/stagehand.d.ts +253 -0
- package/dist/contracts/stagehand.js +145 -0
- package/dist/contracts/storage.d.ts +51 -0
- package/dist/contracts/storage.js +56 -0
- package/dist/contracts/vault.d.ts +119 -0
- package/dist/contracts/vault.js +112 -0
- package/dist/contracts/version.d.ts +3 -0
- package/dist/contracts/version.js +16 -0
- package/dist/desktop.d.ts +2 -0
- package/dist/desktop.js +3 -0
- package/dist/drivers/desktop/index.d.ts +65 -0
- package/dist/drivers/desktop/index.js +68 -0
- package/dist/drivers/desktop/session.d.ts +313 -0
- package/dist/drivers/desktop/session.js +432 -0
- package/dist/drivers/playwright/event-emitter.d.ts +160 -0
- package/dist/drivers/playwright/event-emitter.js +297 -0
- package/dist/drivers/playwright/generated/api-request-context.d.ts +137 -0
- package/dist/drivers/playwright/generated/api-request-context.js +154 -0
- package/dist/drivers/playwright/generated/api-response.d.ts +119 -0
- package/dist/drivers/playwright/generated/api-response.js +123 -0
- package/dist/drivers/playwright/generated/browser-context.d.ts +284 -0
- package/dist/drivers/playwright/generated/browser-context.js +458 -0
- package/dist/drivers/playwright/generated/browser.d.ts +120 -0
- package/dist/drivers/playwright/generated/browser.js +151 -0
- package/dist/drivers/playwright/generated/clock.d.ts +80 -0
- package/dist/drivers/playwright/generated/clock.js +94 -0
- package/dist/drivers/playwright/generated/console-message.d.ts +94 -0
- package/dist/drivers/playwright/generated/console-message.js +89 -0
- package/dist/drivers/playwright/generated/coverage.d.ts +57 -0
- package/dist/drivers/playwright/generated/coverage.js +66 -0
- package/dist/drivers/playwright/generated/dialog.d.ts +79 -0
- package/dist/drivers/playwright/generated/dialog.js +80 -0
- package/dist/drivers/playwright/generated/element-handle.d.ts +399 -0
- package/dist/drivers/playwright/generated/element-handle.js +501 -0
- package/dist/drivers/playwright/generated/frame-locator.d.ts +34 -0
- package/dist/drivers/playwright/generated/frame-locator.js +63 -0
- package/dist/drivers/playwright/generated/frame.d.ts +557 -0
- package/dist/drivers/playwright/generated/frame.js +634 -0
- package/dist/drivers/playwright/generated/js-handle.d.ts +72 -0
- package/dist/drivers/playwright/generated/js-handle.js +92 -0
- package/dist/drivers/playwright/generated/keyboard.d.ts +103 -0
- package/dist/drivers/playwright/generated/keyboard.js +113 -0
- package/dist/drivers/playwright/generated/locator.d.ts +795 -0
- package/dist/drivers/playwright/generated/locator.js +974 -0
- package/dist/drivers/playwright/generated/mouse.d.ts +97 -0
- package/dist/drivers/playwright/generated/mouse.js +109 -0
- package/dist/drivers/playwright/generated/page.d.ts +762 -0
- package/dist/drivers/playwright/generated/page.js +988 -0
- package/dist/drivers/playwright/generated/touchscreen.d.ts +34 -0
- package/dist/drivers/playwright/generated/touchscreen.js +37 -0
- package/dist/drivers/playwright/generated/tracing.d.ts +78 -0
- package/dist/drivers/playwright/generated/tracing.js +80 -0
- package/dist/drivers/playwright/generated/worker.d.ts +53 -0
- package/dist/drivers/playwright/generated/worker.js +59 -0
- package/dist/drivers/playwright/index.d.ts +19 -0
- package/dist/drivers/playwright/index.js +20 -0
- package/dist/drivers/playwright/remote-base.d.ts +62 -0
- package/dist/drivers/playwright/remote-base.js +86 -0
- package/dist/drivers/playwright/types.d.ts +148 -0
- package/dist/drivers/playwright/types.js +8 -0
- package/dist/drivers/puppeteer/errors.d.ts +50 -0
- package/dist/drivers/puppeteer/errors.js +71 -0
- package/dist/drivers/puppeteer/event-emitter.d.ts +145 -0
- package/dist/drivers/puppeteer/event-emitter.js +259 -0
- package/dist/drivers/puppeteer/generated/accessibility.d.ts +77 -0
- package/dist/drivers/puppeteer/generated/accessibility.js +74 -0
- package/dist/drivers/puppeteer/generated/browser-context.d.ts +116 -0
- package/dist/drivers/puppeteer/generated/browser-context.js +168 -0
- package/dist/drivers/puppeteer/generated/browser.d.ts +169 -0
- package/dist/drivers/puppeteer/generated/browser.js +246 -0
- package/dist/drivers/puppeteer/generated/console-message.d.ts +54 -0
- package/dist/drivers/puppeteer/generated/console-message.js +69 -0
- package/dist/drivers/puppeteer/generated/coverage.d.ts +49 -0
- package/dist/drivers/puppeteer/generated/coverage.js +57 -0
- package/dist/drivers/puppeteer/generated/dialog.d.ts +46 -0
- package/dist/drivers/puppeteer/generated/dialog.js +60 -0
- package/dist/drivers/puppeteer/generated/element-handle.d.ts +261 -0
- package/dist/drivers/puppeteer/generated/element-handle.js +341 -0
- package/dist/drivers/puppeteer/generated/file-chooser.d.ts +34 -0
- package/dist/drivers/puppeteer/generated/file-chooser.js +43 -0
- package/dist/drivers/puppeteer/generated/frame.d.ts +221 -0
- package/dist/drivers/puppeteer/generated/frame.js +302 -0
- package/dist/drivers/puppeteer/generated/http-request.d.ts +195 -0
- package/dist/drivers/puppeteer/generated/http-request.js +243 -0
- package/dist/drivers/puppeteer/generated/http-response.d.ts +142 -0
- package/dist/drivers/puppeteer/generated/http-response.js +169 -0
- package/dist/drivers/puppeteer/generated/js-handle.d.ts +104 -0
- package/dist/drivers/puppeteer/generated/js-handle.js +125 -0
- package/dist/drivers/puppeteer/generated/keyboard.d.ts +79 -0
- package/dist/drivers/puppeteer/generated/keyboard.js +89 -0
- package/dist/drivers/puppeteer/generated/locator.d.ts +141 -0
- package/dist/drivers/puppeteer/generated/locator.js +164 -0
- package/dist/drivers/puppeteer/generated/mouse.d.ts +74 -0
- package/dist/drivers/puppeteer/generated/mouse.js +94 -0
- package/dist/drivers/puppeteer/generated/page.d.ts +604 -0
- package/dist/drivers/puppeteer/generated/page.js +776 -0
- package/dist/drivers/puppeteer/generated/target.d.ts +105 -0
- package/dist/drivers/puppeteer/generated/target.js +123 -0
- package/dist/drivers/puppeteer/generated/touchscreen.d.ts +87 -0
- package/dist/drivers/puppeteer/generated/touchscreen.js +103 -0
- package/dist/drivers/puppeteer/generated/tracing.d.ts +38 -0
- package/dist/drivers/puppeteer/generated/tracing.js +43 -0
- package/dist/drivers/puppeteer/generated/web-worker.d.ts +63 -0
- package/dist/drivers/puppeteer/generated/web-worker.js +73 -0
- package/dist/drivers/puppeteer/index.d.ts +21 -0
- package/dist/drivers/puppeteer/index.js +23 -0
- package/dist/drivers/puppeteer/remote-base.d.ts +57 -0
- package/dist/drivers/puppeteer/remote-base.js +79 -0
- package/dist/drivers/puppeteer/types.d.ts +178 -0
- package/dist/drivers/puppeteer/types.js +8 -0
- package/dist/drivers/selenium/driver.d.ts +28 -0
- package/dist/drivers/selenium/driver.js +169 -0
- package/dist/drivers/selenium/element.d.ts +34 -0
- package/dist/drivers/selenium/element.js +73 -0
- package/dist/drivers/selenium/index.d.ts +3 -0
- package/dist/drivers/selenium/index.js +5 -0
- package/dist/drivers/selenium/types.d.ts +2 -0
- package/dist/drivers/selenium/types.js +12 -0
- package/dist/drivers/stagehand/generated/context.d.ts +127 -0
- package/dist/drivers/stagehand/generated/context.js +153 -0
- package/dist/drivers/stagehand/generated/locator.d.ts +324 -0
- package/dist/drivers/stagehand/generated/locator.js +368 -0
- package/dist/drivers/stagehand/generated/page.d.ts +377 -0
- package/dist/drivers/stagehand/generated/page.js +439 -0
- package/dist/drivers/stagehand/generated/response.d.ts +197 -0
- package/dist/drivers/stagehand/generated/response.js +232 -0
- package/dist/drivers/stagehand/index.d.ts +5 -0
- package/dist/drivers/stagehand/index.js +8 -0
- package/dist/drivers/stagehand/types.d.ts +1 -0
- package/dist/drivers/stagehand/types.js +7 -0
- package/dist/errors.d.ts +47 -0
- package/dist/errors.js +157 -0
- package/dist/extensions/client.d.ts +47 -0
- package/dist/extensions/client.js +154 -0
- package/dist/extensions/index.d.ts +1 -0
- package/dist/extensions/index.js +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +23 -0
- package/dist/internal/dev-client.d.ts +5 -0
- package/dist/internal/dev-client.js +9 -0
- package/dist/internal/rpc-targets.d.ts +17 -0
- package/dist/internal/rpc-targets.js +58 -0
- package/dist/internal/serialization.d.ts +32 -0
- package/dist/internal/serialization.js +42 -0
- package/dist/internal/transport.d.ts +24 -0
- package/dist/internal/transport.js +29 -0
- package/dist/playwright.d.ts +1 -0
- package/dist/playwright.js +2 -0
- package/dist/puppeteer.d.ts +1 -0
- package/dist/puppeteer.js +2 -0
- package/dist/selenium.d.ts +1 -0
- package/dist/selenium.js +2 -0
- package/dist/stagehand.d.ts +1 -0
- package/dist/stagehand.js +2 -0
- package/dist/storage/client.d.ts +151 -0
- package/dist/storage/client.js +329 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.js +4 -0
- package/dist/telemetry.d.ts +18 -0
- package/dist/telemetry.js +93 -0
- package/dist/updates/client.d.ts +8 -0
- package/dist/updates/client.js +128 -0
- package/dist/updates/index.d.ts +1 -0
- package/dist/updates/index.js +1 -0
- package/dist/utils/http.d.ts +39 -0
- package/dist/utils/http.js +88 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.js +74 -0
- package/dist/utils/schema.d.ts +17 -0
- package/dist/utils/schema.js +31 -0
- package/dist/utils/url.d.ts +5 -0
- package/dist/utils/url.js +7 -0
- package/dist/vault/client.d.ts +43 -0
- package/dist/vault/client.js +123 -0
- package/dist/vault/index.d.ts +1 -0
- package/dist/vault/index.js +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +4 -0
- package/dist/workspaces/browser-runtime.d.ts +251 -0
- package/dist/workspaces/browser-runtime.js +1025 -0
- package/dist/workspaces/client.d.ts +48 -0
- package/dist/workspaces/client.js +222 -0
- package/dist/workspaces/index.d.ts +2 -0
- package/dist/workspaces/index.js +2 -0
- package/dist/workspaces/runtime-event-pump.d.ts +65 -0
- package/dist/workspaces/runtime-event-pump.js +716 -0
- package/package.json +56 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { fetchWithTimeout, parseErrorDetails, parseJsonResponse } from '../utils/http.js';
|
|
2
|
+
import { SDK_VERSION } from '../version.js';
|
|
3
|
+
function buildHeaders(apiKey, withJsonBody = false) {
|
|
4
|
+
const headers = {
|
|
5
|
+
'x-sdk-version': SDK_VERSION,
|
|
6
|
+
Authorization: `Bearer ${apiKey}`,
|
|
7
|
+
};
|
|
8
|
+
if (withJsonBody) {
|
|
9
|
+
headers['Content-Type'] = 'application/json';
|
|
10
|
+
}
|
|
11
|
+
return headers;
|
|
12
|
+
}
|
|
13
|
+
async function expectJson(response, context) {
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
const details = parseErrorDetails(await response.text());
|
|
16
|
+
throw new Error(`${context}: ${details.message}`);
|
|
17
|
+
}
|
|
18
|
+
return parseJsonResponse(response, context);
|
|
19
|
+
}
|
|
20
|
+
export class AiCredentialsClient {
|
|
21
|
+
baseUrl;
|
|
22
|
+
apiKey;
|
|
23
|
+
constructor(baseUrl, apiKey) {
|
|
24
|
+
this.baseUrl = baseUrl;
|
|
25
|
+
this.apiKey = apiKey;
|
|
26
|
+
}
|
|
27
|
+
async list() {
|
|
28
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/ai-credentials`, {
|
|
29
|
+
headers: buildHeaders(this.apiKey),
|
|
30
|
+
});
|
|
31
|
+
const data = await expectJson(response, 'List AI credentials');
|
|
32
|
+
return data.credentials;
|
|
33
|
+
}
|
|
34
|
+
async create(request) {
|
|
35
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/ai-credentials`, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: buildHeaders(this.apiKey, true),
|
|
38
|
+
body: JSON.stringify(request),
|
|
39
|
+
});
|
|
40
|
+
return expectJson(response, 'Create AI credential');
|
|
41
|
+
}
|
|
42
|
+
async get(id) {
|
|
43
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/ai-credentials/${encodeURIComponent(id)}`, {
|
|
44
|
+
headers: buildHeaders(this.apiKey),
|
|
45
|
+
});
|
|
46
|
+
return expectJson(response, 'Get AI credential');
|
|
47
|
+
}
|
|
48
|
+
async update(id, request) {
|
|
49
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/ai-credentials/${encodeURIComponent(id)}`, {
|
|
50
|
+
method: 'PATCH',
|
|
51
|
+
headers: buildHeaders(this.apiKey, true),
|
|
52
|
+
body: JSON.stringify(request),
|
|
53
|
+
});
|
|
54
|
+
return expectJson(response, 'Update AI credential');
|
|
55
|
+
}
|
|
56
|
+
async delete(id) {
|
|
57
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/ai-credentials/${encodeURIComponent(id)}`, {
|
|
58
|
+
method: 'DELETE',
|
|
59
|
+
headers: buildHeaders(this.apiKey),
|
|
60
|
+
});
|
|
61
|
+
await expectJson(response, 'Delete AI credential');
|
|
62
|
+
}
|
|
63
|
+
async test(id) {
|
|
64
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/ai-credentials/${encodeURIComponent(id)}/test`, {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: buildHeaders(this.apiKey),
|
|
67
|
+
});
|
|
68
|
+
return expectJson(response, 'Test AI credential');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AiCredentialsClient } from './client.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AiCredentialsClient } from './client.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface RemoteListenerBinding {
|
|
2
|
+
onFirstListener(event: string): void;
|
|
3
|
+
onNoListeners(event: string): void;
|
|
4
|
+
}
|
|
5
|
+
export declare const REMOTE_LISTENER_BINDING_SYMBOL: unique symbol;
|
|
6
|
+
export declare function getRemoteListenerBinding(target: unknown): RemoteListenerBinding | null;
|
|
7
|
+
export declare function setRemoteListenerBinding(target: unknown, binding: RemoteListenerBinding | null): void;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const REMOTE_LISTENER_BINDING_SYMBOL = Symbol.for('bctrl.remoteListenerBinding');
|
|
2
|
+
function isRemoteListenerBinding(value) {
|
|
3
|
+
if (!value || typeof value !== 'object')
|
|
4
|
+
return false;
|
|
5
|
+
const onFirstListener = Reflect.get(value, 'onFirstListener');
|
|
6
|
+
const onNoListeners = Reflect.get(value, 'onNoListeners');
|
|
7
|
+
return typeof onFirstListener === 'function' && typeof onNoListeners === 'function';
|
|
8
|
+
}
|
|
9
|
+
export function getRemoteListenerBinding(target) {
|
|
10
|
+
if (!target || typeof target !== 'object')
|
|
11
|
+
return null;
|
|
12
|
+
const candidate = Reflect.get(target, REMOTE_LISTENER_BINDING_SYMBOL);
|
|
13
|
+
return isRemoteListenerBinding(candidate) ? candidate : null;
|
|
14
|
+
}
|
|
15
|
+
export function setRemoteListenerBinding(target, binding) {
|
|
16
|
+
if (!target || typeof target !== 'object')
|
|
17
|
+
return;
|
|
18
|
+
if (!binding) {
|
|
19
|
+
Reflect.deleteProperty(target, REMOTE_LISTENER_BINDING_SYMBOL);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
Reflect.set(target, REMOTE_LISTENER_BINDING_SYMBOL, binding);
|
|
23
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export type { DriverType, RpcMessage as _RpcMessage } from '../contracts/runtime.js';
|
|
2
|
+
type InternalBctrlEnvironment = 'production' | 'development';
|
|
3
|
+
/**
|
|
4
|
+
* Profile selection options
|
|
5
|
+
*/
|
|
6
|
+
export interface ProfileOptions {
|
|
7
|
+
/** Use existing profile by ID */
|
|
8
|
+
id?: string;
|
|
9
|
+
/** Use existing profile by name */
|
|
10
|
+
name?: string;
|
|
11
|
+
/** Create new profile with this name */
|
|
12
|
+
createName?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Connection options for connecting to bctrl
|
|
16
|
+
*/
|
|
17
|
+
export interface ConnectOptions {
|
|
18
|
+
/** Profile to use (by ID or name) */
|
|
19
|
+
profile?: ProfileOptions;
|
|
20
|
+
/** API key for authentication */
|
|
21
|
+
apiKey: string;
|
|
22
|
+
/**
|
|
23
|
+
* Target environment.
|
|
24
|
+
* Defaults to `production` (`https://api.bctrl.ai`).
|
|
25
|
+
* Use `development` for a local gateway on `http://localhost:8787`.
|
|
26
|
+
*/
|
|
27
|
+
environment?: InternalBctrlEnvironment;
|
|
28
|
+
/**
|
|
29
|
+
* Gateway origin or API base URL.
|
|
30
|
+
* If you pass an origin, the SDK appends `/v1` automatically.
|
|
31
|
+
*/
|
|
32
|
+
baseUrl?: string;
|
|
33
|
+
/** Browser options */
|
|
34
|
+
browserOptions?: {
|
|
35
|
+
/** Run browser in headless mode */
|
|
36
|
+
headless?: boolean;
|
|
37
|
+
};
|
|
38
|
+
/** Enable human-like mouse movement via CDP proxy (default: true) */
|
|
39
|
+
humanize?: boolean;
|
|
40
|
+
/** Mouse persona ID for humanization (0-124) */
|
|
41
|
+
humanizePersonaId?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Locator step for remote locator chains
|
|
45
|
+
*/
|
|
46
|
+
export interface LocatorStep {
|
|
47
|
+
/** Locator method (e.g., 'locator', 'getByRole', 'getByText') */
|
|
48
|
+
method: string;
|
|
49
|
+
/** Arguments for the locator method */
|
|
50
|
+
args: unknown[];
|
|
51
|
+
}
|
|
52
|
+
import type { DriverType, RpcTarget } from '../contracts/runtime.js';
|
|
53
|
+
/**
|
|
54
|
+
* SDK RPC message for sending commands to control-plane
|
|
55
|
+
*/
|
|
56
|
+
export interface RpcMessageSdk {
|
|
57
|
+
/** Driver type */
|
|
58
|
+
driver: DriverType;
|
|
59
|
+
/** Target object (browser, context, page, locator) */
|
|
60
|
+
target: RpcTarget;
|
|
61
|
+
/** Method to call on the target */
|
|
62
|
+
method: string;
|
|
63
|
+
/** Arguments for the method */
|
|
64
|
+
args: unknown[];
|
|
65
|
+
/** Page ID for page-specific operations */
|
|
66
|
+
pageId?: string;
|
|
67
|
+
/** Context ID for context-specific operations */
|
|
68
|
+
contextId?: string;
|
|
69
|
+
/** Locator chain for locator operations */
|
|
70
|
+
locatorChain?: LocatorStep[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Session information returned from control-plane
|
|
74
|
+
*/
|
|
75
|
+
export interface SessionInfo {
|
|
76
|
+
/** Unique session ID */
|
|
77
|
+
id: string;
|
|
78
|
+
/** Default browser context ID (if applicable) */
|
|
79
|
+
defaultContextId?: string;
|
|
80
|
+
/** Default page ID (if applicable) */
|
|
81
|
+
defaultPageId?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Select options
|
|
85
|
+
*/
|
|
86
|
+
export interface SelectOption {
|
|
87
|
+
value?: string;
|
|
88
|
+
label?: string;
|
|
89
|
+
index?: number;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Keyboard press options
|
|
93
|
+
*/
|
|
94
|
+
export interface PressOptions {
|
|
95
|
+
delay?: number;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Mouse click options
|
|
99
|
+
*/
|
|
100
|
+
export interface MouseClickOptions {
|
|
101
|
+
button?: 'left' | 'right' | 'middle';
|
|
102
|
+
clickCount?: number;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Evaluate options
|
|
106
|
+
*/
|
|
107
|
+
export interface EvaluateOptions {
|
|
108
|
+
timeout?: number;
|
|
109
|
+
}
|
package/dist/bctrl.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AiCredentialsClient } from './ai-credentials/client.js';
|
|
2
|
+
import { BrowserExtensionsClient } from './browser-extensions/client.js';
|
|
3
|
+
import { BrowserProfilesClient } from './browser-profiles/client.js';
|
|
4
|
+
import { StorageClient } from './storage/client.js';
|
|
5
|
+
import { UpdatesClient } from './updates/client.js';
|
|
6
|
+
import { VaultClient } from './vault/client.js';
|
|
7
|
+
import { WorkspacesClient } from './workspaces/client.js';
|
|
8
|
+
declare const INTERNAL_BASE_URL: unique symbol;
|
|
9
|
+
export interface BctrlOptions {
|
|
10
|
+
apiKey: string;
|
|
11
|
+
telemetry?: boolean;
|
|
12
|
+
}
|
|
13
|
+
type InternalBctrlOverride = {
|
|
14
|
+
[INTERNAL_BASE_URL]: string;
|
|
15
|
+
};
|
|
16
|
+
export declare class Bctrl {
|
|
17
|
+
private readonly baseUrl;
|
|
18
|
+
private readonly apiKey;
|
|
19
|
+
private _aiCredentials;
|
|
20
|
+
private _browserExtensions;
|
|
21
|
+
private _browserProfiles;
|
|
22
|
+
private _vault;
|
|
23
|
+
private _workspaces;
|
|
24
|
+
private _updates;
|
|
25
|
+
constructor(options: BctrlOptions, internalOverride?: InternalBctrlOverride);
|
|
26
|
+
get aiCredentials(): AiCredentialsClient;
|
|
27
|
+
get browserProfiles(): BrowserProfilesClient;
|
|
28
|
+
get browserExtensions(): BrowserExtensionsClient;
|
|
29
|
+
storage(workspace: string): StorageClient;
|
|
30
|
+
get vault(): VaultClient;
|
|
31
|
+
get workspaces(): WorkspacesClient;
|
|
32
|
+
get updates(): UpdatesClient;
|
|
33
|
+
}
|
|
34
|
+
export declare function createInternalBctrlClient(options: BctrlOptions & {
|
|
35
|
+
apiBaseUrl: string;
|
|
36
|
+
}): Bctrl;
|
|
37
|
+
export {};
|
package/dist/bctrl.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as telemetry from './telemetry.js';
|
|
2
|
+
import { AiCredentialsClient } from './ai-credentials/client.js';
|
|
3
|
+
import { BrowserExtensionsClient } from './browser-extensions/client.js';
|
|
4
|
+
import { BrowserProfilesClient } from './browser-profiles/client.js';
|
|
5
|
+
import { resolveApiKey, resolveProductionApiBaseUrl } from './config.js';
|
|
6
|
+
import { StorageClient } from './storage/client.js';
|
|
7
|
+
import { UpdatesClient } from './updates/client.js';
|
|
8
|
+
import { VaultClient } from './vault/client.js';
|
|
9
|
+
import { WorkspacesClient } from './workspaces/client.js';
|
|
10
|
+
const INTERNAL_BASE_URL = Symbol('bctrl.internalBaseUrl');
|
|
11
|
+
export class Bctrl {
|
|
12
|
+
baseUrl;
|
|
13
|
+
apiKey;
|
|
14
|
+
_aiCredentials = null;
|
|
15
|
+
_browserExtensions = null;
|
|
16
|
+
_browserProfiles = null;
|
|
17
|
+
_vault = null;
|
|
18
|
+
_workspaces = null;
|
|
19
|
+
_updates = null;
|
|
20
|
+
constructor(options, internalOverride) {
|
|
21
|
+
this.apiKey = resolveApiKey(options.apiKey);
|
|
22
|
+
this.baseUrl = internalOverride?.[INTERNAL_BASE_URL] ?? resolveProductionApiBaseUrl();
|
|
23
|
+
if (options.telemetry === false) {
|
|
24
|
+
telemetry.disable();
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
telemetry.init();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
get aiCredentials() {
|
|
31
|
+
if (!this._aiCredentials) {
|
|
32
|
+
this._aiCredentials = new AiCredentialsClient(this.baseUrl, this.apiKey);
|
|
33
|
+
}
|
|
34
|
+
return this._aiCredentials;
|
|
35
|
+
}
|
|
36
|
+
get browserProfiles() {
|
|
37
|
+
if (!this._browserProfiles) {
|
|
38
|
+
this._browserProfiles = new BrowserProfilesClient(this.baseUrl, this.apiKey);
|
|
39
|
+
}
|
|
40
|
+
return this._browserProfiles;
|
|
41
|
+
}
|
|
42
|
+
get browserExtensions() {
|
|
43
|
+
if (!this._browserExtensions) {
|
|
44
|
+
this._browserExtensions = new BrowserExtensionsClient(this.baseUrl, this.apiKey);
|
|
45
|
+
}
|
|
46
|
+
return this._browserExtensions;
|
|
47
|
+
}
|
|
48
|
+
storage(workspace) {
|
|
49
|
+
return new StorageClient(this.baseUrl, workspace, this.apiKey);
|
|
50
|
+
}
|
|
51
|
+
get vault() {
|
|
52
|
+
if (!this._vault) {
|
|
53
|
+
this._vault = new VaultClient(this.baseUrl, this.apiKey);
|
|
54
|
+
}
|
|
55
|
+
return this._vault;
|
|
56
|
+
}
|
|
57
|
+
get workspaces() {
|
|
58
|
+
if (!this._workspaces) {
|
|
59
|
+
this._workspaces = new WorkspacesClient(this.baseUrl, this.apiKey);
|
|
60
|
+
}
|
|
61
|
+
return this._workspaces;
|
|
62
|
+
}
|
|
63
|
+
get updates() {
|
|
64
|
+
if (!this._updates) {
|
|
65
|
+
this._updates = new UpdatesClient(this.baseUrl, this.apiKey);
|
|
66
|
+
}
|
|
67
|
+
return this._updates;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function createInternalBctrlClient(options) {
|
|
71
|
+
return new Bctrl({
|
|
72
|
+
apiKey: options.apiKey,
|
|
73
|
+
telemetry: options.telemetry,
|
|
74
|
+
}, {
|
|
75
|
+
[INTERNAL_BASE_URL]: options.apiBaseUrl,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BrowserExtensionDeleteResponse, BrowserExtensionImportRequest, ExtensionMetadata } from '../contracts/public-api.js';
|
|
2
|
+
export interface BrowserExtensionUploadRequest {
|
|
3
|
+
file: Buffer | Uint8Array | Blob;
|
|
4
|
+
filename: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class BrowserExtensionsClient {
|
|
7
|
+
private readonly baseUrl;
|
|
8
|
+
private readonly apiKey;
|
|
9
|
+
constructor(baseUrl: string, apiKey: string);
|
|
10
|
+
list(): Promise<ExtensionMetadata[]>;
|
|
11
|
+
upload(request: BrowserExtensionUploadRequest): Promise<ExtensionMetadata>;
|
|
12
|
+
importFromUrl(request: BrowserExtensionImportRequest): Promise<ExtensionMetadata>;
|
|
13
|
+
get(id: string): Promise<ExtensionMetadata>;
|
|
14
|
+
delete(id: string): Promise<BrowserExtensionDeleteResponse>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { fetchWithTimeout, parseErrorDetails, parseJsonResponse } from '../utils/http.js';
|
|
2
|
+
import { SDK_VERSION } from '../version.js';
|
|
3
|
+
function buildHeaders(apiKey) {
|
|
4
|
+
return {
|
|
5
|
+
'x-sdk-version': SDK_VERSION,
|
|
6
|
+
Authorization: `Bearer ${apiKey}`,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function buildJsonHeaders(apiKey) {
|
|
10
|
+
return {
|
|
11
|
+
...buildHeaders(apiKey),
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async function expectJson(response, context) {
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
const details = parseErrorDetails(await response.text());
|
|
18
|
+
throw new Error(`${context}: ${details.message}`);
|
|
19
|
+
}
|
|
20
|
+
return parseJsonResponse(response, context);
|
|
21
|
+
}
|
|
22
|
+
function toBlob(data) {
|
|
23
|
+
if (data instanceof Blob)
|
|
24
|
+
return data;
|
|
25
|
+
return new Blob([new Uint8Array(data)]);
|
|
26
|
+
}
|
|
27
|
+
export class BrowserExtensionsClient {
|
|
28
|
+
baseUrl;
|
|
29
|
+
apiKey;
|
|
30
|
+
constructor(baseUrl, apiKey) {
|
|
31
|
+
this.baseUrl = baseUrl;
|
|
32
|
+
this.apiKey = apiKey;
|
|
33
|
+
}
|
|
34
|
+
async list() {
|
|
35
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-extensions`, {
|
|
36
|
+
headers: buildHeaders(this.apiKey),
|
|
37
|
+
});
|
|
38
|
+
const data = await expectJson(response, 'List browser extensions');
|
|
39
|
+
return data.extensions;
|
|
40
|
+
}
|
|
41
|
+
async upload(request) {
|
|
42
|
+
const formData = new FormData();
|
|
43
|
+
formData.append('file', toBlob(request.file), request.filename);
|
|
44
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-extensions/upload`, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: buildHeaders(this.apiKey),
|
|
47
|
+
body: formData,
|
|
48
|
+
});
|
|
49
|
+
return expectJson(response, 'Upload browser extension');
|
|
50
|
+
}
|
|
51
|
+
async importFromUrl(request) {
|
|
52
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-extensions/import-url`, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: buildJsonHeaders(this.apiKey),
|
|
55
|
+
body: JSON.stringify(request),
|
|
56
|
+
});
|
|
57
|
+
return expectJson(response, 'Import browser extension');
|
|
58
|
+
}
|
|
59
|
+
async get(id) {
|
|
60
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-extensions/${encodeURIComponent(id)}`, {
|
|
61
|
+
headers: buildHeaders(this.apiKey),
|
|
62
|
+
});
|
|
63
|
+
return expectJson(response, 'Get browser extension');
|
|
64
|
+
}
|
|
65
|
+
async delete(id) {
|
|
66
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-extensions/${encodeURIComponent(id)}`, {
|
|
67
|
+
method: 'DELETE',
|
|
68
|
+
headers: buildHeaders(this.apiKey),
|
|
69
|
+
});
|
|
70
|
+
return expectJson(response, 'Delete browser extension');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BrowserExtensionsClient } from './client.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BrowserProfile, BrowserProfileCreateRequest, BrowserProfileDeleteResponse, BrowserProfileDetail, BrowserProfileUpdateRequest } from '../contracts/public-api.js';
|
|
2
|
+
export declare class BrowserProfilesClient {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
constructor(baseUrl: string, apiKey: string);
|
|
6
|
+
list(): Promise<BrowserProfile[]>;
|
|
7
|
+
create(request: BrowserProfileCreateRequest): Promise<BrowserProfileDetail>;
|
|
8
|
+
get(id: string): Promise<BrowserProfileDetail>;
|
|
9
|
+
update(id: string, request: BrowserProfileUpdateRequest): Promise<BrowserProfileDetail>;
|
|
10
|
+
delete(id: string): Promise<BrowserProfileDeleteResponse>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { fetchWithTimeout, parseErrorDetails, parseJsonResponse } from '../utils/http.js';
|
|
2
|
+
import { SDK_VERSION } from '../version.js';
|
|
3
|
+
function buildHeaders(apiKey, withJsonBody = false) {
|
|
4
|
+
const headers = {
|
|
5
|
+
'x-sdk-version': SDK_VERSION,
|
|
6
|
+
Authorization: `Bearer ${apiKey}`,
|
|
7
|
+
};
|
|
8
|
+
if (withJsonBody) {
|
|
9
|
+
headers['Content-Type'] = 'application/json';
|
|
10
|
+
}
|
|
11
|
+
return headers;
|
|
12
|
+
}
|
|
13
|
+
async function expectJson(response, context) {
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
const details = parseErrorDetails(await response.text());
|
|
16
|
+
throw new Error(`${context}: ${details.message}`);
|
|
17
|
+
}
|
|
18
|
+
return parseJsonResponse(response, context);
|
|
19
|
+
}
|
|
20
|
+
export class BrowserProfilesClient {
|
|
21
|
+
baseUrl;
|
|
22
|
+
apiKey;
|
|
23
|
+
constructor(baseUrl, apiKey) {
|
|
24
|
+
this.baseUrl = baseUrl;
|
|
25
|
+
this.apiKey = apiKey;
|
|
26
|
+
}
|
|
27
|
+
async list() {
|
|
28
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-profiles`, {
|
|
29
|
+
headers: buildHeaders(this.apiKey),
|
|
30
|
+
});
|
|
31
|
+
const data = await expectJson(response, 'List browser profiles');
|
|
32
|
+
return data.profiles;
|
|
33
|
+
}
|
|
34
|
+
async create(request) {
|
|
35
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-profiles`, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: buildHeaders(this.apiKey, true),
|
|
38
|
+
body: JSON.stringify(request),
|
|
39
|
+
});
|
|
40
|
+
return expectJson(response, 'Create browser profile');
|
|
41
|
+
}
|
|
42
|
+
async get(id) {
|
|
43
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-profiles/${encodeURIComponent(id)}`, {
|
|
44
|
+
headers: buildHeaders(this.apiKey),
|
|
45
|
+
});
|
|
46
|
+
return expectJson(response, 'Get browser profile');
|
|
47
|
+
}
|
|
48
|
+
async update(id, request) {
|
|
49
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-profiles/${encodeURIComponent(id)}`, {
|
|
50
|
+
method: 'PATCH',
|
|
51
|
+
headers: buildHeaders(this.apiKey, true),
|
|
52
|
+
body: JSON.stringify(request),
|
|
53
|
+
});
|
|
54
|
+
return expectJson(response, 'Update browser profile');
|
|
55
|
+
}
|
|
56
|
+
async delete(id) {
|
|
57
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/browser-profiles/${encodeURIComponent(id)}`, {
|
|
58
|
+
method: 'DELETE',
|
|
59
|
+
headers: buildHeaders(this.apiKey),
|
|
60
|
+
});
|
|
61
|
+
return expectJson(response, 'Delete browser profile');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BrowserProfilesClient } from './client.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BrowserProfilesClient } from './client.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CaptchaNamespace } from './namespace.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CaptchaNamespace } from './namespace.js';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CaptchaNamespace — SDK methods for captcha detection and solving
|
|
3
|
+
*
|
|
4
|
+
* Provides `detect()` and `solve()` methods that send RPC calls
|
|
5
|
+
* to the browser-host via the page target.
|
|
6
|
+
*/
|
|
7
|
+
import type { CaptchaDetectArgs, CaptchaDetectResult, CaptchaSolveArgs, CaptchaSolveResult } from '../contracts/captcha.js';
|
|
8
|
+
import type { RpcSender } from '../internal/transport.js';
|
|
9
|
+
export declare class CaptchaNamespace {
|
|
10
|
+
private sendRpc;
|
|
11
|
+
private getActivePageId;
|
|
12
|
+
constructor(sendRpc: RpcSender, getActivePageId: () => string | undefined);
|
|
13
|
+
/**
|
|
14
|
+
* Detect captchas on the current page.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const result = await session.captcha.detect();
|
|
18
|
+
* if (result.found) {
|
|
19
|
+
* console.log('Found captchas:', result.captchas);
|
|
20
|
+
* }
|
|
21
|
+
*/
|
|
22
|
+
detect(options?: CaptchaDetectArgs): Promise<CaptchaDetectResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Detect and solve a captcha on the current page.
|
|
25
|
+
* Detects the captcha type, sends to solver backend, and injects the token.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const result = await session.captcha.solve();
|
|
29
|
+
* if (result.success) {
|
|
30
|
+
* console.log(`Solved ${result.type} in ${result.duration}ms`);
|
|
31
|
+
* }
|
|
32
|
+
*/
|
|
33
|
+
solve(options?: CaptchaSolveArgs): Promise<CaptchaSolveResult>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CaptchaNamespace — SDK methods for captcha detection and solving
|
|
3
|
+
*
|
|
4
|
+
* Provides `detect()` and `solve()` methods that send RPC calls
|
|
5
|
+
* to the browser-host via the page target.
|
|
6
|
+
*/
|
|
7
|
+
export class CaptchaNamespace {
|
|
8
|
+
sendRpc;
|
|
9
|
+
getActivePageId;
|
|
10
|
+
constructor(sendRpc, getActivePageId) {
|
|
11
|
+
this.sendRpc = sendRpc;
|
|
12
|
+
this.getActivePageId = getActivePageId;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Detect captchas on the current page.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const result = await session.captcha.detect();
|
|
19
|
+
* if (result.found) {
|
|
20
|
+
* console.log('Found captchas:', result.captchas);
|
|
21
|
+
* }
|
|
22
|
+
*/
|
|
23
|
+
async detect(options) {
|
|
24
|
+
const pageId = this.getActivePageId();
|
|
25
|
+
return this.sendRpc('page', 'captcha.detect', [options ?? {}], { pageId });
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Detect and solve a captcha on the current page.
|
|
29
|
+
* Detects the captcha type, sends to solver backend, and injects the token.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* const result = await session.captcha.solve();
|
|
33
|
+
* if (result.success) {
|
|
34
|
+
* console.log(`Solved ${result.type} in ${result.duration}ms`);
|
|
35
|
+
* }
|
|
36
|
+
*/
|
|
37
|
+
async solve(options) {
|
|
38
|
+
const pageId = this.getActivePageId();
|
|
39
|
+
return this.sendRpc('page', 'captcha.solve', [options ?? {}], { pageId });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './rpc.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './rpc.js';
|