@bctrl/sdk 1.0.1 → 1.0.3
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 +28 -29
- package/dist/bctrl.d.ts +22 -36
- package/dist/bctrl.js +40 -75
- package/dist/errors.d.ts +49 -43
- package/dist/errors.js +83 -120
- package/dist/files.d.ts +31 -0
- package/dist/files.js +97 -0
- package/dist/http.d.ts +18 -0
- package/dist/http.js +135 -0
- package/dist/index.d.ts +9 -12
- package/dist/index.js +7 -23
- package/dist/invocations.d.ts +86 -0
- package/dist/invocations.js +159 -0
- package/dist/pagination.d.ts +2 -0
- package/dist/pagination.js +13 -0
- package/dist/runs.d.ts +40 -0
- package/dist/runs.js +105 -0
- package/dist/runtimes.d.ts +69 -0
- package/dist/runtimes.js +202 -0
- package/dist/spaces.d.ts +40 -0
- package/dist/spaces.js +96 -0
- package/dist/types.d.ts +413 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.js +27 -0
- package/dist/version.js +2 -2
- package/package.json +4 -21
- package/dist/agents/browser-use/index.d.ts +0 -1
- package/dist/agents/browser-use/index.js +0 -9
- package/dist/agents/browser-use/namespace.d.ts +0 -39
- package/dist/agents/browser-use/namespace.js +0 -93
- package/dist/agents/index.d.ts +0 -2
- package/dist/agents/index.js +0 -17
- package/dist/agents/stagehand/core.d.ts +0 -93
- package/dist/agents/stagehand/core.js +0 -144
- package/dist/agents/stagehand/index.d.ts +0 -3
- package/dist/agents/stagehand/index.js +0 -24
- package/dist/agents/stagehand/namespace.d.ts +0 -51
- package/dist/agents/stagehand/namespace.js +0 -65
- package/dist/ai-credentials/client.d.ts +0 -12
- package/dist/ai-credentials/client.js +0 -70
- package/dist/ai-credentials/index.d.ts +0 -1
- package/dist/ai-credentials/index.js +0 -1
- package/dist/base/event-binding.d.ts +0 -7
- package/dist/base/event-binding.js +0 -23
- package/dist/base/types.d.ts +0 -109
- package/dist/base/types.js +0 -4
- package/dist/browser-extensions/client.d.ts +0 -15
- package/dist/browser-extensions/client.js +0 -72
- package/dist/browser-extensions/index.d.ts +0 -2
- package/dist/browser-extensions/index.js +0 -1
- package/dist/browser-profiles/client.d.ts +0 -11
- package/dist/browser-profiles/client.js +0 -63
- package/dist/browser-profiles/index.d.ts +0 -1
- package/dist/browser-profiles/index.js +0 -1
- package/dist/captcha/index.d.ts +0 -1
- package/dist/captcha/index.js +0 -1
- package/dist/captcha/namespace.d.ts +0 -34
- package/dist/captcha/namespace.js +0 -41
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.js +0 -1
- package/dist/client/rpc.d.ts +0 -83
- package/dist/client/rpc.js +0 -354
- package/dist/config.d.ts +0 -5
- package/dist/config.js +0 -28
- package/dist/constants/browser.d.ts +0 -2
- package/dist/constants/browser.js +0 -1
- package/dist/contracts/agent-tools.d.ts +0 -45
- package/dist/contracts/agent-tools.js +0 -31
- package/dist/contracts/automation.d.ts +0 -265
- package/dist/contracts/automation.js +0 -109
- package/dist/contracts/browser-management.d.ts +0 -179
- package/dist/contracts/browser-management.js +0 -95
- package/dist/contracts/browser-use.d.ts +0 -136
- package/dist/contracts/browser-use.js +0 -93
- package/dist/contracts/captcha.d.ts +0 -114
- package/dist/contracts/captcha.js +0 -40
- package/dist/contracts/desktop.d.ts +0 -223
- package/dist/contracts/desktop.js +0 -121
- package/dist/contracts/drivers/playwright.d.ts +0 -2008
- package/dist/contracts/drivers/playwright.js +0 -2033
- package/dist/contracts/drivers/puppeteer.d.ts +0 -1221
- package/dist/contracts/drivers/puppeteer.js +0 -941
- package/dist/contracts/drivers/selenium.d.ts +0 -156
- package/dist/contracts/drivers/selenium.js +0 -61
- package/dist/contracts/drivers/stagehand.d.ts +0 -155
- package/dist/contracts/drivers/stagehand.js +0 -7
- package/dist/contracts/extensions.d.ts +0 -13
- package/dist/contracts/extensions.js +0 -9
- package/dist/contracts/index.d.ts +0 -13
- package/dist/contracts/index.js +0 -13
- package/dist/contracts/public-api.d.ts +0 -360
- package/dist/contracts/public-api.js +0 -17
- package/dist/contracts/runtime.d.ts +0 -81
- package/dist/contracts/runtime.js +0 -16
- package/dist/contracts/stagehand.d.ts +0 -253
- package/dist/contracts/stagehand.js +0 -145
- package/dist/contracts/storage.d.ts +0 -51
- package/dist/contracts/storage.js +0 -56
- package/dist/contracts/vault.d.ts +0 -119
- package/dist/contracts/vault.js +0 -112
- package/dist/contracts/version.d.ts +0 -3
- package/dist/contracts/version.js +0 -16
- package/dist/desktop.d.ts +0 -2
- package/dist/desktop.js +0 -3
- package/dist/drivers/desktop/index.d.ts +0 -65
- package/dist/drivers/desktop/index.js +0 -68
- package/dist/drivers/desktop/session.d.ts +0 -313
- package/dist/drivers/desktop/session.js +0 -432
- package/dist/drivers/playwright/event-emitter.d.ts +0 -160
- package/dist/drivers/playwright/event-emitter.js +0 -297
- package/dist/drivers/playwright/generated/api-request-context.d.ts +0 -137
- package/dist/drivers/playwright/generated/api-request-context.js +0 -154
- package/dist/drivers/playwright/generated/api-response.d.ts +0 -119
- package/dist/drivers/playwright/generated/api-response.js +0 -123
- package/dist/drivers/playwright/generated/browser-context.d.ts +0 -284
- package/dist/drivers/playwright/generated/browser-context.js +0 -458
- package/dist/drivers/playwright/generated/browser.d.ts +0 -120
- package/dist/drivers/playwright/generated/browser.js +0 -151
- package/dist/drivers/playwright/generated/clock.d.ts +0 -80
- package/dist/drivers/playwright/generated/clock.js +0 -94
- package/dist/drivers/playwright/generated/console-message.d.ts +0 -94
- package/dist/drivers/playwright/generated/console-message.js +0 -89
- package/dist/drivers/playwright/generated/coverage.d.ts +0 -57
- package/dist/drivers/playwright/generated/coverage.js +0 -66
- package/dist/drivers/playwright/generated/dialog.d.ts +0 -79
- package/dist/drivers/playwright/generated/dialog.js +0 -80
- package/dist/drivers/playwright/generated/element-handle.d.ts +0 -399
- package/dist/drivers/playwright/generated/element-handle.js +0 -501
- package/dist/drivers/playwright/generated/frame-locator.d.ts +0 -34
- package/dist/drivers/playwright/generated/frame-locator.js +0 -63
- package/dist/drivers/playwright/generated/frame.d.ts +0 -557
- package/dist/drivers/playwright/generated/frame.js +0 -634
- package/dist/drivers/playwright/generated/js-handle.d.ts +0 -72
- package/dist/drivers/playwright/generated/js-handle.js +0 -92
- package/dist/drivers/playwright/generated/keyboard.d.ts +0 -103
- package/dist/drivers/playwright/generated/keyboard.js +0 -113
- package/dist/drivers/playwright/generated/locator.d.ts +0 -795
- package/dist/drivers/playwright/generated/locator.js +0 -974
- package/dist/drivers/playwright/generated/mouse.d.ts +0 -97
- package/dist/drivers/playwright/generated/mouse.js +0 -109
- package/dist/drivers/playwright/generated/page.d.ts +0 -762
- package/dist/drivers/playwright/generated/page.js +0 -988
- package/dist/drivers/playwright/generated/touchscreen.d.ts +0 -34
- package/dist/drivers/playwright/generated/touchscreen.js +0 -37
- package/dist/drivers/playwright/generated/tracing.d.ts +0 -78
- package/dist/drivers/playwright/generated/tracing.js +0 -80
- package/dist/drivers/playwright/generated/worker.d.ts +0 -53
- package/dist/drivers/playwright/generated/worker.js +0 -59
- package/dist/drivers/playwright/index.d.ts +0 -19
- package/dist/drivers/playwright/index.js +0 -20
- package/dist/drivers/playwright/remote-base.d.ts +0 -62
- package/dist/drivers/playwright/remote-base.js +0 -86
- package/dist/drivers/playwright/types.d.ts +0 -148
- package/dist/drivers/playwright/types.js +0 -8
- package/dist/drivers/puppeteer/errors.d.ts +0 -50
- package/dist/drivers/puppeteer/errors.js +0 -71
- package/dist/drivers/puppeteer/event-emitter.d.ts +0 -145
- package/dist/drivers/puppeteer/event-emitter.js +0 -259
- package/dist/drivers/puppeteer/generated/accessibility.d.ts +0 -77
- package/dist/drivers/puppeteer/generated/accessibility.js +0 -74
- package/dist/drivers/puppeteer/generated/browser-context.d.ts +0 -116
- package/dist/drivers/puppeteer/generated/browser-context.js +0 -168
- package/dist/drivers/puppeteer/generated/browser.d.ts +0 -169
- package/dist/drivers/puppeteer/generated/browser.js +0 -246
- package/dist/drivers/puppeteer/generated/console-message.d.ts +0 -54
- package/dist/drivers/puppeteer/generated/console-message.js +0 -69
- package/dist/drivers/puppeteer/generated/coverage.d.ts +0 -49
- package/dist/drivers/puppeteer/generated/coverage.js +0 -57
- package/dist/drivers/puppeteer/generated/dialog.d.ts +0 -46
- package/dist/drivers/puppeteer/generated/dialog.js +0 -60
- package/dist/drivers/puppeteer/generated/element-handle.d.ts +0 -261
- package/dist/drivers/puppeteer/generated/element-handle.js +0 -341
- package/dist/drivers/puppeteer/generated/file-chooser.d.ts +0 -34
- package/dist/drivers/puppeteer/generated/file-chooser.js +0 -43
- package/dist/drivers/puppeteer/generated/frame.d.ts +0 -221
- package/dist/drivers/puppeteer/generated/frame.js +0 -302
- package/dist/drivers/puppeteer/generated/http-request.d.ts +0 -195
- package/dist/drivers/puppeteer/generated/http-request.js +0 -243
- package/dist/drivers/puppeteer/generated/http-response.d.ts +0 -142
- package/dist/drivers/puppeteer/generated/http-response.js +0 -169
- package/dist/drivers/puppeteer/generated/js-handle.d.ts +0 -104
- package/dist/drivers/puppeteer/generated/js-handle.js +0 -125
- package/dist/drivers/puppeteer/generated/keyboard.d.ts +0 -79
- package/dist/drivers/puppeteer/generated/keyboard.js +0 -89
- package/dist/drivers/puppeteer/generated/locator.d.ts +0 -141
- package/dist/drivers/puppeteer/generated/locator.js +0 -164
- package/dist/drivers/puppeteer/generated/mouse.d.ts +0 -74
- package/dist/drivers/puppeteer/generated/mouse.js +0 -94
- package/dist/drivers/puppeteer/generated/page.d.ts +0 -604
- package/dist/drivers/puppeteer/generated/page.js +0 -776
- package/dist/drivers/puppeteer/generated/target.d.ts +0 -105
- package/dist/drivers/puppeteer/generated/target.js +0 -123
- package/dist/drivers/puppeteer/generated/touchscreen.d.ts +0 -87
- package/dist/drivers/puppeteer/generated/touchscreen.js +0 -103
- package/dist/drivers/puppeteer/generated/tracing.d.ts +0 -38
- package/dist/drivers/puppeteer/generated/tracing.js +0 -43
- package/dist/drivers/puppeteer/generated/web-worker.d.ts +0 -63
- package/dist/drivers/puppeteer/generated/web-worker.js +0 -73
- package/dist/drivers/puppeteer/index.d.ts +0 -21
- package/dist/drivers/puppeteer/index.js +0 -23
- package/dist/drivers/puppeteer/remote-base.d.ts +0 -57
- package/dist/drivers/puppeteer/remote-base.js +0 -79
- package/dist/drivers/puppeteer/types.d.ts +0 -178
- package/dist/drivers/puppeteer/types.js +0 -8
- package/dist/drivers/selenium/driver.d.ts +0 -28
- package/dist/drivers/selenium/driver.js +0 -169
- package/dist/drivers/selenium/element.d.ts +0 -34
- package/dist/drivers/selenium/element.js +0 -73
- package/dist/drivers/selenium/index.d.ts +0 -3
- package/dist/drivers/selenium/index.js +0 -5
- package/dist/drivers/selenium/types.d.ts +0 -2
- package/dist/drivers/selenium/types.js +0 -12
- package/dist/drivers/stagehand/generated/context.d.ts +0 -127
- package/dist/drivers/stagehand/generated/context.js +0 -153
- package/dist/drivers/stagehand/generated/locator.d.ts +0 -324
- package/dist/drivers/stagehand/generated/locator.js +0 -368
- package/dist/drivers/stagehand/generated/page.d.ts +0 -377
- package/dist/drivers/stagehand/generated/page.js +0 -439
- package/dist/drivers/stagehand/generated/response.d.ts +0 -197
- package/dist/drivers/stagehand/generated/response.js +0 -232
- package/dist/drivers/stagehand/index.d.ts +0 -5
- package/dist/drivers/stagehand/index.js +0 -8
- package/dist/drivers/stagehand/types.d.ts +0 -1
- package/dist/drivers/stagehand/types.js +0 -7
- package/dist/extensions/client.d.ts +0 -47
- package/dist/extensions/client.js +0 -154
- package/dist/extensions/index.d.ts +0 -1
- package/dist/extensions/index.js +0 -1
- package/dist/internal/dev-client.d.ts +0 -5
- package/dist/internal/dev-client.js +0 -9
- package/dist/internal/rpc-targets.d.ts +0 -17
- package/dist/internal/rpc-targets.js +0 -58
- package/dist/internal/serialization.d.ts +0 -32
- package/dist/internal/serialization.js +0 -42
- package/dist/internal/transport.d.ts +0 -24
- package/dist/internal/transport.js +0 -29
- package/dist/playwright.d.ts +0 -1
- package/dist/playwright.js +0 -2
- package/dist/puppeteer.d.ts +0 -1
- package/dist/puppeteer.js +0 -2
- package/dist/selenium.d.ts +0 -1
- package/dist/selenium.js +0 -2
- package/dist/stagehand.d.ts +0 -1
- package/dist/stagehand.js +0 -2
- package/dist/storage/client.d.ts +0 -151
- package/dist/storage/client.js +0 -329
- package/dist/storage/index.d.ts +0 -2
- package/dist/storage/index.js +0 -4
- package/dist/telemetry.d.ts +0 -18
- package/dist/telemetry.js +0 -93
- package/dist/updates/client.d.ts +0 -8
- package/dist/updates/client.js +0 -128
- package/dist/updates/index.d.ts +0 -1
- package/dist/updates/index.js +0 -1
- package/dist/utils/http.d.ts +0 -39
- package/dist/utils/http.js +0 -88
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.js +0 -4
- package/dist/utils/logger.d.ts +0 -27
- package/dist/utils/logger.js +0 -74
- package/dist/utils/schema.d.ts +0 -17
- package/dist/utils/schema.js +0 -31
- package/dist/utils/url.d.ts +0 -5
- package/dist/utils/url.js +0 -7
- package/dist/vault/client.d.ts +0 -43
- package/dist/vault/client.js +0 -123
- package/dist/vault/index.d.ts +0 -1
- package/dist/vault/index.js +0 -1
- package/dist/workspaces/browser-runtime.d.ts +0 -251
- package/dist/workspaces/browser-runtime.js +0 -1025
- package/dist/workspaces/client.d.ts +0 -48
- package/dist/workspaces/client.js +0 -222
- package/dist/workspaces/index.d.ts +0 -2
- package/dist/workspaces/index.js +0 -2
- package/dist/workspaces/runtime-event-pump.d.ts +0 -65
- package/dist/workspaces/runtime-event-pump.js +0 -716
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @bctrl/sdk
|
|
2
2
|
|
|
3
|
-
TypeScript SDK for BCTRL
|
|
3
|
+
TypeScript SDK for BCTRL v1 spaces, browser runtimes, invocations, runs, and files.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -19,44 +19,48 @@ const bctrl = new Bctrl({
|
|
|
19
19
|
apiKey: process.env.BCTRL_API_KEY!,
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
const
|
|
22
|
+
const space = await bctrl.spaces.create({
|
|
23
23
|
name: 'my-task',
|
|
24
|
+
region: 'us-east-1',
|
|
24
25
|
});
|
|
25
26
|
|
|
26
|
-
const
|
|
27
|
-
|
|
27
|
+
const runtime = await space.runtimes.create({
|
|
28
|
+
type: 'browser',
|
|
29
|
+
name: 'browser-task',
|
|
30
|
+
config: {
|
|
31
|
+
browser: { profile: false },
|
|
32
|
+
},
|
|
28
33
|
});
|
|
34
|
+
const { runtime: browser } = await runtime.start();
|
|
29
35
|
|
|
30
|
-
await browser.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
const connection = await browser.connect();
|
|
37
|
+
console.log(connection.wsUrl);
|
|
38
|
+
|
|
39
|
+
const invocation = await browser.invocations.create({
|
|
40
|
+
provider: 'stagehand',
|
|
41
|
+
method: 'act',
|
|
42
|
+
input: { instruction: 'Open https://example.com' },
|
|
34
43
|
});
|
|
35
44
|
|
|
36
|
-
const
|
|
37
|
-
console.log(
|
|
45
|
+
const result = await invocation.wait({ timeoutMs: 60_000 });
|
|
46
|
+
console.log(result.data.status);
|
|
38
47
|
```
|
|
39
48
|
|
|
40
|
-
The public SDK
|
|
41
|
-
|
|
42
|
-
For local development inside this repo, use the internal test helper instead of changing the public client base URL:
|
|
49
|
+
The public SDK targets `https://api.bctrl.ai/v1`. For local development, pass a
|
|
50
|
+
local origin or v1 base URL:
|
|
43
51
|
|
|
44
52
|
```ts
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const bctrl = createInternalBctrl({
|
|
53
|
+
const bctrl = new Bctrl({
|
|
48
54
|
apiKey: process.env.BCTRL_API_KEY!,
|
|
49
|
-
|
|
55
|
+
baseUrl: 'http://localhost:8787',
|
|
50
56
|
});
|
|
51
57
|
```
|
|
52
58
|
|
|
59
|
+
`baseUrl` may include or omit `/v1`; the client normalizes either form.
|
|
60
|
+
|
|
53
61
|
## Entry points
|
|
54
62
|
|
|
55
|
-
- `@bctrl/sdk`:
|
|
56
|
-
- `@bctrl/sdk/playwright`: Playwright driver types and remote browser classes
|
|
57
|
-
- `@bctrl/sdk/puppeteer`: Puppeteer driver types and remote browser classes
|
|
58
|
-
- `@bctrl/sdk/stagehand`: Stagehand driver types and remote browser classes
|
|
59
|
-
- `@bctrl/sdk/selenium`: Selenium driver types and remote browser classes
|
|
63
|
+
- `@bctrl/sdk`: v1 client, resources, errors, and public types
|
|
60
64
|
|
|
61
65
|
## Documentation
|
|
62
66
|
|
|
@@ -65,11 +69,6 @@ const bctrl = createInternalBctrl({
|
|
|
65
69
|
|
|
66
70
|
## Telemetry
|
|
67
71
|
|
|
68
|
-
The SDK
|
|
69
|
-
|
|
70
|
-
- Error reporting is Sentry-based and only activates when `SENTRY_DSN_SDK` is present at runtime.
|
|
71
|
-
- It captures SDK errors such as request timeouts and failed HTTP or automation calls.
|
|
72
|
-
- Sensitive headers like `authorization`, `cookie`, and internal secrets are stripped before an event is sent.
|
|
73
|
-
- Pass `telemetry: false` to `new Bctrl(...)` to disable it explicitly.
|
|
72
|
+
The published SDK does not include vendor-owned telemetry or usage analytics.
|
|
74
73
|
|
|
75
|
-
If you want
|
|
74
|
+
If you want observability around SDK calls, instrument your application directly with your own logging or error tracking.
|
package/dist/bctrl.d.ts
CHANGED
|
@@ -1,37 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
declare
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { V1FilesClient } from './files.js';
|
|
2
|
+
import { type V1ClientOptions } from './http.js';
|
|
3
|
+
import { V1InvocationsClient } from './invocations.js';
|
|
4
|
+
import { V1RunsClient } from './runs.js';
|
|
5
|
+
import { V1RuntimesClient } from './runtimes.js';
|
|
6
|
+
import { V1SpacesClient } from './spaces.js';
|
|
7
|
+
export type BctrlV1Options = V1ClientOptions;
|
|
8
|
+
export declare class BctrlV1 {
|
|
9
|
+
private readonly http;
|
|
10
|
+
private _spaces;
|
|
11
|
+
private _runtimes;
|
|
12
|
+
private _runs;
|
|
13
|
+
private _invocations;
|
|
14
|
+
private _files;
|
|
15
|
+
static isControllerBusy(error: unknown): boolean;
|
|
16
|
+
constructor(options?: BctrlV1Options);
|
|
17
|
+
get spaces(): V1SpacesClient;
|
|
18
|
+
get runtimes(): V1RuntimesClient;
|
|
19
|
+
get runs(): V1RunsClient;
|
|
20
|
+
get invocations(): V1InvocationsClient;
|
|
21
|
+
get files(): V1FilesClient;
|
|
12
22
|
}
|
|
13
|
-
|
|
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 {};
|
|
23
|
+
export { BctrlV1 as Bctrl };
|
package/dist/bctrl.js
CHANGED
|
@@ -1,77 +1,42 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
this.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
1
|
+
import { isControllerBusy } from './errors.js';
|
|
2
|
+
import { V1FilesClient } from './files.js';
|
|
3
|
+
import { V1HttpClient } from './http.js';
|
|
4
|
+
import { V1InvocationsClient } from './invocations.js';
|
|
5
|
+
import { V1RunsClient } from './runs.js';
|
|
6
|
+
import { V1RuntimesClient } from './runtimes.js';
|
|
7
|
+
import { V1SpacesClient } from './spaces.js';
|
|
8
|
+
export class BctrlV1 {
|
|
9
|
+
http;
|
|
10
|
+
_spaces = null;
|
|
11
|
+
_runtimes = null;
|
|
12
|
+
_runs = null;
|
|
13
|
+
_invocations = null;
|
|
14
|
+
_files = null;
|
|
15
|
+
static isControllerBusy(error) {
|
|
16
|
+
return isControllerBusy(error);
|
|
17
|
+
}
|
|
18
|
+
constructor(options = {}) {
|
|
19
|
+
this.http = new V1HttpClient(options);
|
|
20
|
+
}
|
|
21
|
+
get spaces() {
|
|
22
|
+
this._spaces ??= new V1SpacesClient(this.http);
|
|
23
|
+
return this._spaces;
|
|
24
|
+
}
|
|
25
|
+
get runtimes() {
|
|
26
|
+
this._runtimes ??= new V1RuntimesClient(this.http);
|
|
27
|
+
return this._runtimes;
|
|
28
|
+
}
|
|
29
|
+
get runs() {
|
|
30
|
+
this._runs ??= new V1RunsClient(this.http);
|
|
31
|
+
return this._runs;
|
|
32
|
+
}
|
|
33
|
+
get invocations() {
|
|
34
|
+
this._invocations ??= new V1InvocationsClient(this.http);
|
|
35
|
+
return this._invocations;
|
|
36
|
+
}
|
|
37
|
+
get files() {
|
|
38
|
+
this._files ??= new V1FilesClient(this.http);
|
|
39
|
+
return this._files;
|
|
29
40
|
}
|
|
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
41
|
}
|
|
42
|
+
export { BctrlV1 as Bctrl };
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,47 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export interface V1ErrorContext {
|
|
2
|
+
status?: number;
|
|
3
|
+
code?: string;
|
|
4
|
+
requestId?: string;
|
|
5
|
+
body?: unknown;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
6
8
|
export declare class BctrlError extends Error {
|
|
7
9
|
readonly code: string;
|
|
8
|
-
readonly context?:
|
|
9
|
-
constructor(message: string, code: string, context?:
|
|
10
|
-
/** Serialize for structured loggers (pino, winston) and JSON.stringify() */
|
|
10
|
+
readonly context?: V1ErrorContext;
|
|
11
|
+
constructor(message: string, code: string, context?: V1ErrorContext);
|
|
11
12
|
toJSON(): Record<string, unknown>;
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
export declare class
|
|
31
|
-
constructor(message: string,
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
export declare
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
export declare
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
14
|
+
export declare class BctrlApiError extends BctrlError {
|
|
15
|
+
constructor(message: string, code?: string, context?: V1ErrorContext);
|
|
16
|
+
get status(): number | undefined;
|
|
17
|
+
get requestId(): string | undefined;
|
|
18
|
+
}
|
|
19
|
+
export declare class BctrlAuthenticationError extends BctrlApiError {
|
|
20
|
+
constructor(message: string, code?: string, context?: V1ErrorContext);
|
|
21
|
+
}
|
|
22
|
+
export declare class BctrlPermissionError extends BctrlApiError {
|
|
23
|
+
constructor(message: string, code?: string, context?: V1ErrorContext);
|
|
24
|
+
}
|
|
25
|
+
export declare class BctrlNotFoundError extends BctrlApiError {
|
|
26
|
+
constructor(message: string, code?: string, context?: V1ErrorContext);
|
|
27
|
+
}
|
|
28
|
+
export declare class BctrlConflictError extends BctrlApiError {
|
|
29
|
+
constructor(message: string, code?: string, context?: V1ErrorContext);
|
|
30
|
+
}
|
|
31
|
+
export declare class BctrlRateLimitError extends BctrlApiError {
|
|
32
|
+
constructor(message: string, code?: string, context?: V1ErrorContext);
|
|
33
|
+
}
|
|
34
|
+
export declare class BctrlValidationError extends BctrlApiError {
|
|
35
|
+
constructor(message: string, code?: string, context?: V1ErrorContext);
|
|
36
|
+
}
|
|
37
|
+
export declare class BctrlNetworkError extends BctrlError {
|
|
38
|
+
constructor(message: string, context?: V1ErrorContext);
|
|
39
|
+
}
|
|
40
|
+
export declare class BctrlNotReadyError extends BctrlError {
|
|
41
|
+
constructor(message: string, context?: V1ErrorContext);
|
|
42
|
+
}
|
|
43
|
+
export declare class BctrlUnsupportedError extends BctrlError {
|
|
44
|
+
constructor(message: string, context?: V1ErrorContext);
|
|
45
|
+
}
|
|
46
|
+
export declare function createV1HttpError(input: {
|
|
47
|
+
status: number;
|
|
48
|
+
message: string;
|
|
49
|
+
code?: string;
|
|
50
|
+
requestId?: string;
|
|
51
|
+
body?: unknown;
|
|
52
|
+
}): BctrlApiError;
|
|
53
|
+
export declare function isControllerBusy(error: unknown): boolean;
|
package/dist/errors.js
CHANGED
|
@@ -1,157 +1,120 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// SDK Error Hierarchy
|
|
3
|
-
// ============================================================================
|
|
4
|
-
//
|
|
5
|
-
// User-facing error classes oriented around what action to take:
|
|
6
|
-
// - AutomationError → fix selectors, script code, or arguments
|
|
7
|
-
// - SessionError → recreate session, check if browser/host is up
|
|
8
|
-
// - TimeoutError → increase timeout or retry
|
|
9
|
-
// - AuthenticationError → check/refresh API key
|
|
10
|
-
// ============================================================================
|
|
11
|
-
import { AutomationDiagnosticSchema } from './contracts/automation.js';
|
|
12
|
-
function isRecord(value) {
|
|
13
|
-
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
14
|
-
}
|
|
15
|
-
function isAutomationDiagnostic(value) {
|
|
16
|
-
return AutomationDiagnosticSchema.safeParse(value).success;
|
|
17
|
-
}
|
|
18
|
-
function getContextHint(context) {
|
|
19
|
-
if (!context)
|
|
20
|
-
return undefined;
|
|
21
|
-
const hint = context.hint;
|
|
22
|
-
return typeof hint === 'string' && hint.length > 0 ? hint : undefined;
|
|
23
|
-
}
|
|
24
|
-
function getContextDiagnostic(context) {
|
|
25
|
-
if (!context)
|
|
26
|
-
return undefined;
|
|
27
|
-
const diagnostic = context.diagnostic;
|
|
28
|
-
return isAutomationDiagnostic(diagnostic) ? diagnostic : undefined;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Base error class for all bctrl SDK errors.
|
|
32
|
-
* Carries a fine-grained `.code` and optional `.context` metadata.
|
|
33
|
-
*/
|
|
34
1
|
export class BctrlError extends Error {
|
|
35
2
|
code;
|
|
36
3
|
context;
|
|
37
4
|
constructor(message, code, context) {
|
|
38
5
|
super(message);
|
|
6
|
+
this.name = 'BctrlError';
|
|
39
7
|
this.code = code;
|
|
40
8
|
this.context = context;
|
|
41
|
-
this.name = 'BctrlError';
|
|
42
|
-
if (Error.captureStackTrace)
|
|
43
|
-
Error.captureStackTrace(this, this.constructor);
|
|
44
9
|
}
|
|
45
|
-
/** Serialize for structured loggers (pino, winston) and JSON.stringify() */
|
|
46
10
|
toJSON() {
|
|
47
11
|
return {
|
|
48
12
|
name: this.name,
|
|
49
13
|
message: this.message,
|
|
50
14
|
code: this.code,
|
|
51
|
-
context: this.context,
|
|
52
|
-
stack: this.stack,
|
|
15
|
+
...(this.context ? { context: this.context } : {}),
|
|
53
16
|
};
|
|
54
17
|
}
|
|
55
18
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
constructor(message, code = 'DRIVER_ERROR', context) {
|
|
19
|
+
export class BctrlApiError extends BctrlError {
|
|
20
|
+
constructor(message, code = 'api.error', context) {
|
|
59
21
|
super(message, code, context);
|
|
60
|
-
this.name = '
|
|
22
|
+
this.name = 'BctrlApiError';
|
|
61
23
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return getContextHint(this.context);
|
|
24
|
+
get status() {
|
|
25
|
+
return typeof this.context?.status === 'number' ? this.context.status : undefined;
|
|
65
26
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
return getContextDiagnostic(this.context);
|
|
27
|
+
get requestId() {
|
|
28
|
+
return typeof this.context?.requestId === 'string' ? this.context.requestId : undefined;
|
|
69
29
|
}
|
|
70
30
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
constructor(message, code = 'SESSION_ERROR', context) {
|
|
31
|
+
export class BctrlAuthenticationError extends BctrlApiError {
|
|
32
|
+
constructor(message, code = 'auth.error', context) {
|
|
74
33
|
super(message, code, context);
|
|
75
|
-
this.name = '
|
|
34
|
+
this.name = 'BctrlAuthenticationError';
|
|
76
35
|
}
|
|
77
36
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
this.name = 'TimeoutError';
|
|
37
|
+
export class BctrlPermissionError extends BctrlApiError {
|
|
38
|
+
constructor(message, code = 'permission.denied', context) {
|
|
39
|
+
super(message, code, context);
|
|
40
|
+
this.name = 'BctrlPermissionError';
|
|
83
41
|
}
|
|
84
42
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.name = 'AuthenticationError';
|
|
43
|
+
export class BctrlNotFoundError extends BctrlApiError {
|
|
44
|
+
constructor(message, code = 'resource.not_found', context) {
|
|
45
|
+
super(message, code, context);
|
|
46
|
+
this.name = 'BctrlNotFoundError';
|
|
90
47
|
}
|
|
91
48
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
export function fromErrorResponse(message, code, context) {
|
|
97
|
-
switch (code) {
|
|
98
|
-
case 'DRIVER_ERROR':
|
|
99
|
-
case 'EXECUTION_ERROR':
|
|
100
|
-
case 'VALIDATION_ERROR':
|
|
101
|
-
return new AutomationError(message, code, context);
|
|
102
|
-
case 'SESSION_ERROR':
|
|
103
|
-
case 'NOT_FOUND':
|
|
104
|
-
case 'SESSION_NOT_FOUND':
|
|
105
|
-
case 'DRIVER_NOT_CONNECTED':
|
|
106
|
-
case 'CONNECTION_ERROR':
|
|
107
|
-
case 'RPC_ERROR':
|
|
108
|
-
return new SessionError(message, code, context);
|
|
109
|
-
case 'TIMEOUT_ERROR':
|
|
110
|
-
case 'TIMEOUT':
|
|
111
|
-
return new TimeoutError(message, context);
|
|
112
|
-
case 'AUTH_ERROR':
|
|
113
|
-
return new AuthenticationError(message, context);
|
|
114
|
-
default:
|
|
115
|
-
return new BctrlError(message, code || 'UNKNOWN_ERROR', context);
|
|
49
|
+
export class BctrlConflictError extends BctrlApiError {
|
|
50
|
+
constructor(message, code = 'resource.conflict', context) {
|
|
51
|
+
super(message, code, context);
|
|
52
|
+
this.name = 'BctrlConflictError';
|
|
116
53
|
}
|
|
117
54
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
// instanceof fails (bundler duplication, multiple package copies in monorepos).
|
|
124
|
-
export function isBctrlError(error) {
|
|
125
|
-
return error instanceof BctrlError || (error instanceof Error && 'code' in error && typeof error.code === 'string'
|
|
126
|
-
&& (error.name === 'BctrlError' || error.name === 'AutomationError'
|
|
127
|
-
|| error.name === 'SessionError' || error.name === 'TimeoutError'
|
|
128
|
-
|| error.name === 'AuthenticationError'));
|
|
55
|
+
export class BctrlRateLimitError extends BctrlApiError {
|
|
56
|
+
constructor(message, code = 'rate_limit.exceeded', context) {
|
|
57
|
+
super(message, code, context);
|
|
58
|
+
this.name = 'BctrlRateLimitError';
|
|
59
|
+
}
|
|
129
60
|
}
|
|
130
|
-
export
|
|
131
|
-
|
|
61
|
+
export class BctrlValidationError extends BctrlApiError {
|
|
62
|
+
constructor(message, code = 'validation.error', context) {
|
|
63
|
+
super(message, code, context);
|
|
64
|
+
this.name = 'BctrlValidationError';
|
|
65
|
+
}
|
|
132
66
|
}
|
|
133
|
-
export
|
|
134
|
-
|
|
67
|
+
export class BctrlNetworkError extends BctrlError {
|
|
68
|
+
constructor(message, context) {
|
|
69
|
+
super(message, 'network.error', context);
|
|
70
|
+
this.name = 'BctrlNetworkError';
|
|
71
|
+
}
|
|
135
72
|
}
|
|
136
|
-
export
|
|
137
|
-
|
|
73
|
+
export class BctrlNotReadyError extends BctrlError {
|
|
74
|
+
constructor(message, context) {
|
|
75
|
+
super(message, 'runtime.not_ready', context);
|
|
76
|
+
this.name = 'BctrlNotReadyError';
|
|
77
|
+
}
|
|
138
78
|
}
|
|
139
|
-
export
|
|
140
|
-
|
|
79
|
+
export class BctrlUnsupportedError extends BctrlError {
|
|
80
|
+
constructor(message, context) {
|
|
81
|
+
super(message, 'sdk.unsupported', context);
|
|
82
|
+
this.name = 'BctrlUnsupportedError';
|
|
83
|
+
}
|
|
141
84
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
85
|
+
export function createV1HttpError(input) {
|
|
86
|
+
const context = {
|
|
87
|
+
status: input.status,
|
|
88
|
+
requestId: input.requestId,
|
|
89
|
+
body: input.body,
|
|
90
|
+
};
|
|
91
|
+
const code = input.code;
|
|
92
|
+
if (code)
|
|
93
|
+
context.code = code;
|
|
94
|
+
if (input.status === 401) {
|
|
95
|
+
return new BctrlAuthenticationError(input.message, code, context);
|
|
96
|
+
}
|
|
97
|
+
if (input.status === 403) {
|
|
98
|
+
return new BctrlPermissionError(input.message, code, context);
|
|
99
|
+
}
|
|
100
|
+
if (input.status === 404) {
|
|
101
|
+
return new BctrlNotFoundError(input.message, code, context);
|
|
102
|
+
}
|
|
103
|
+
if (input.status === 409) {
|
|
104
|
+
return new BctrlConflictError(input.message, code, context);
|
|
105
|
+
}
|
|
106
|
+
if (input.status === 422 || input.status === 400) {
|
|
107
|
+
return new BctrlValidationError(input.message, code, context);
|
|
108
|
+
}
|
|
109
|
+
if (input.status === 429) {
|
|
110
|
+
return new BctrlRateLimitError(input.message, code, context);
|
|
111
|
+
}
|
|
112
|
+
return new BctrlApiError(input.message, code, context);
|
|
149
113
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return getContextDiagnostic(error.context);
|
|
114
|
+
export function isControllerBusy(error) {
|
|
115
|
+
if (!(error instanceof BctrlError)) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
const code = error.code.toLowerCase();
|
|
119
|
+
return code.includes('controller') && code.includes('busy');
|
|
157
120
|
}
|
package/dist/files.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { V1HttpClient } from './http.js';
|
|
2
|
+
import type { V1File, V1FileDeleteResponse, V1FilesListQuery, V1FileUpdateRequest, V1FileUploadRequest, V1ListEnvelope, V1RunFilesExportRequest, V1RunFilesListQuery } from './types.js';
|
|
3
|
+
export declare class V1FileResource {
|
|
4
|
+
private readonly http;
|
|
5
|
+
readonly data: V1File;
|
|
6
|
+
constructor(http: V1HttpClient, data: V1File);
|
|
7
|
+
get id(): string;
|
|
8
|
+
refresh(): Promise<V1FileResource>;
|
|
9
|
+
content(): Promise<Response>;
|
|
10
|
+
update(request: V1FileUpdateRequest): Promise<V1FileResource>;
|
|
11
|
+
delete(): Promise<V1FileDeleteResponse>;
|
|
12
|
+
}
|
|
13
|
+
export declare class V1FilesClient {
|
|
14
|
+
private readonly http;
|
|
15
|
+
constructor(http: V1HttpClient);
|
|
16
|
+
list(query: V1FilesListQuery): Promise<V1ListEnvelope<V1File>>;
|
|
17
|
+
iter(query: V1FilesListQuery): AsyncGenerator<V1File, void, undefined>;
|
|
18
|
+
get(id: string): Promise<V1FileResource>;
|
|
19
|
+
update(id: string, request: V1FileUpdateRequest): Promise<V1FileResource>;
|
|
20
|
+
content(id: string): Promise<Response>;
|
|
21
|
+
delete(id: string): Promise<V1FileDeleteResponse>;
|
|
22
|
+
upload(request: V1FileUploadRequest): Promise<V1FileResource>;
|
|
23
|
+
}
|
|
24
|
+
export declare class V1RunFilesClient {
|
|
25
|
+
private readonly http;
|
|
26
|
+
private readonly runId;
|
|
27
|
+
constructor(http: V1HttpClient, runId: string);
|
|
28
|
+
list(query?: V1RunFilesListQuery): Promise<V1ListEnvelope<V1File>>;
|
|
29
|
+
iter(query?: V1RunFilesListQuery): AsyncGenerator<V1File, void, undefined>;
|
|
30
|
+
export(request: V1RunFilesExportRequest): Promise<V1FileResource>;
|
|
31
|
+
}
|