@bctrl/sdk 1.0.1 → 1.0.2

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 (279) hide show
  1. package/README.md +24 -29
  2. package/dist/bctrl.d.ts +22 -36
  3. package/dist/bctrl.js +40 -75
  4. package/dist/browsers.d.ts +24 -0
  5. package/dist/browsers.js +82 -0
  6. package/dist/errors.d.ts +49 -43
  7. package/dist/errors.js +83 -120
  8. package/dist/files.d.ts +31 -0
  9. package/dist/files.js +97 -0
  10. package/dist/http.d.ts +18 -0
  11. package/dist/http.js +135 -0
  12. package/dist/index.d.ts +9 -12
  13. package/dist/index.js +8 -23
  14. package/dist/invocations.d.ts +24 -0
  15. package/dist/invocations.js +66 -0
  16. package/dist/pagination.d.ts +2 -0
  17. package/dist/pagination.js +13 -0
  18. package/dist/runs.d.ts +38 -0
  19. package/dist/runs.js +99 -0
  20. package/dist/runtimes.d.ts +73 -0
  21. package/dist/runtimes.js +205 -0
  22. package/dist/spaces.d.ts +41 -0
  23. package/dist/spaces.js +96 -0
  24. package/dist/types.d.ts +386 -0
  25. package/dist/types.js +1 -0
  26. package/dist/utils.d.ts +4 -0
  27. package/dist/utils.js +27 -0
  28. package/dist/version.js +2 -2
  29. package/package.json +12 -31
  30. package/dist/agents/browser-use/index.d.ts +0 -1
  31. package/dist/agents/browser-use/index.js +0 -9
  32. package/dist/agents/browser-use/namespace.d.ts +0 -39
  33. package/dist/agents/browser-use/namespace.js +0 -93
  34. package/dist/agents/index.d.ts +0 -2
  35. package/dist/agents/index.js +0 -17
  36. package/dist/agents/stagehand/core.d.ts +0 -93
  37. package/dist/agents/stagehand/core.js +0 -144
  38. package/dist/agents/stagehand/index.d.ts +0 -3
  39. package/dist/agents/stagehand/index.js +0 -24
  40. package/dist/agents/stagehand/namespace.d.ts +0 -51
  41. package/dist/agents/stagehand/namespace.js +0 -65
  42. package/dist/ai-credentials/client.d.ts +0 -12
  43. package/dist/ai-credentials/client.js +0 -70
  44. package/dist/ai-credentials/index.d.ts +0 -1
  45. package/dist/ai-credentials/index.js +0 -1
  46. package/dist/base/event-binding.d.ts +0 -7
  47. package/dist/base/event-binding.js +0 -23
  48. package/dist/base/types.d.ts +0 -109
  49. package/dist/base/types.js +0 -4
  50. package/dist/browser-extensions/client.d.ts +0 -15
  51. package/dist/browser-extensions/client.js +0 -72
  52. package/dist/browser-extensions/index.d.ts +0 -2
  53. package/dist/browser-extensions/index.js +0 -1
  54. package/dist/browser-profiles/client.d.ts +0 -11
  55. package/dist/browser-profiles/client.js +0 -63
  56. package/dist/browser-profiles/index.d.ts +0 -1
  57. package/dist/browser-profiles/index.js +0 -1
  58. package/dist/captcha/index.d.ts +0 -1
  59. package/dist/captcha/index.js +0 -1
  60. package/dist/captcha/namespace.d.ts +0 -34
  61. package/dist/captcha/namespace.js +0 -41
  62. package/dist/client/index.d.ts +0 -1
  63. package/dist/client/index.js +0 -1
  64. package/dist/client/rpc.d.ts +0 -83
  65. package/dist/client/rpc.js +0 -354
  66. package/dist/config.d.ts +0 -5
  67. package/dist/config.js +0 -28
  68. package/dist/constants/browser.d.ts +0 -2
  69. package/dist/constants/browser.js +0 -1
  70. package/dist/contracts/agent-tools.d.ts +0 -45
  71. package/dist/contracts/agent-tools.js +0 -31
  72. package/dist/contracts/automation.d.ts +0 -265
  73. package/dist/contracts/automation.js +0 -109
  74. package/dist/contracts/browser-management.d.ts +0 -179
  75. package/dist/contracts/browser-management.js +0 -95
  76. package/dist/contracts/browser-use.d.ts +0 -136
  77. package/dist/contracts/browser-use.js +0 -93
  78. package/dist/contracts/captcha.d.ts +0 -114
  79. package/dist/contracts/captcha.js +0 -40
  80. package/dist/contracts/desktop.d.ts +0 -223
  81. package/dist/contracts/desktop.js +0 -121
  82. package/dist/contracts/drivers/playwright.d.ts +0 -2008
  83. package/dist/contracts/drivers/playwright.js +0 -2033
  84. package/dist/contracts/drivers/puppeteer.d.ts +0 -1221
  85. package/dist/contracts/drivers/puppeteer.js +0 -941
  86. package/dist/contracts/drivers/selenium.d.ts +0 -156
  87. package/dist/contracts/drivers/selenium.js +0 -61
  88. package/dist/contracts/drivers/stagehand.d.ts +0 -155
  89. package/dist/contracts/drivers/stagehand.js +0 -7
  90. package/dist/contracts/extensions.d.ts +0 -13
  91. package/dist/contracts/extensions.js +0 -9
  92. package/dist/contracts/index.d.ts +0 -13
  93. package/dist/contracts/index.js +0 -13
  94. package/dist/contracts/public-api.d.ts +0 -360
  95. package/dist/contracts/public-api.js +0 -17
  96. package/dist/contracts/runtime.d.ts +0 -81
  97. package/dist/contracts/runtime.js +0 -16
  98. package/dist/contracts/stagehand.d.ts +0 -253
  99. package/dist/contracts/stagehand.js +0 -145
  100. package/dist/contracts/storage.d.ts +0 -51
  101. package/dist/contracts/storage.js +0 -56
  102. package/dist/contracts/vault.d.ts +0 -119
  103. package/dist/contracts/vault.js +0 -112
  104. package/dist/contracts/version.d.ts +0 -3
  105. package/dist/contracts/version.js +0 -16
  106. package/dist/desktop.d.ts +0 -2
  107. package/dist/desktop.js +0 -3
  108. package/dist/drivers/desktop/index.d.ts +0 -65
  109. package/dist/drivers/desktop/index.js +0 -68
  110. package/dist/drivers/desktop/session.d.ts +0 -313
  111. package/dist/drivers/desktop/session.js +0 -432
  112. package/dist/drivers/playwright/event-emitter.d.ts +0 -160
  113. package/dist/drivers/playwright/event-emitter.js +0 -297
  114. package/dist/drivers/playwright/generated/api-request-context.d.ts +0 -137
  115. package/dist/drivers/playwright/generated/api-request-context.js +0 -154
  116. package/dist/drivers/playwright/generated/api-response.d.ts +0 -119
  117. package/dist/drivers/playwright/generated/api-response.js +0 -123
  118. package/dist/drivers/playwright/generated/browser-context.d.ts +0 -284
  119. package/dist/drivers/playwright/generated/browser-context.js +0 -458
  120. package/dist/drivers/playwright/generated/browser.d.ts +0 -120
  121. package/dist/drivers/playwright/generated/browser.js +0 -151
  122. package/dist/drivers/playwright/generated/clock.d.ts +0 -80
  123. package/dist/drivers/playwright/generated/clock.js +0 -94
  124. package/dist/drivers/playwright/generated/console-message.d.ts +0 -94
  125. package/dist/drivers/playwright/generated/console-message.js +0 -89
  126. package/dist/drivers/playwright/generated/coverage.d.ts +0 -57
  127. package/dist/drivers/playwright/generated/coverage.js +0 -66
  128. package/dist/drivers/playwright/generated/dialog.d.ts +0 -79
  129. package/dist/drivers/playwright/generated/dialog.js +0 -80
  130. package/dist/drivers/playwright/generated/element-handle.d.ts +0 -399
  131. package/dist/drivers/playwright/generated/element-handle.js +0 -501
  132. package/dist/drivers/playwright/generated/frame-locator.d.ts +0 -34
  133. package/dist/drivers/playwright/generated/frame-locator.js +0 -63
  134. package/dist/drivers/playwright/generated/frame.d.ts +0 -557
  135. package/dist/drivers/playwright/generated/frame.js +0 -634
  136. package/dist/drivers/playwright/generated/js-handle.d.ts +0 -72
  137. package/dist/drivers/playwright/generated/js-handle.js +0 -92
  138. package/dist/drivers/playwright/generated/keyboard.d.ts +0 -103
  139. package/dist/drivers/playwright/generated/keyboard.js +0 -113
  140. package/dist/drivers/playwright/generated/locator.d.ts +0 -795
  141. package/dist/drivers/playwright/generated/locator.js +0 -974
  142. package/dist/drivers/playwright/generated/mouse.d.ts +0 -97
  143. package/dist/drivers/playwright/generated/mouse.js +0 -109
  144. package/dist/drivers/playwright/generated/page.d.ts +0 -762
  145. package/dist/drivers/playwright/generated/page.js +0 -988
  146. package/dist/drivers/playwright/generated/touchscreen.d.ts +0 -34
  147. package/dist/drivers/playwright/generated/touchscreen.js +0 -37
  148. package/dist/drivers/playwright/generated/tracing.d.ts +0 -78
  149. package/dist/drivers/playwright/generated/tracing.js +0 -80
  150. package/dist/drivers/playwright/generated/worker.d.ts +0 -53
  151. package/dist/drivers/playwright/generated/worker.js +0 -59
  152. package/dist/drivers/playwright/index.d.ts +0 -19
  153. package/dist/drivers/playwright/index.js +0 -20
  154. package/dist/drivers/playwright/remote-base.d.ts +0 -62
  155. package/dist/drivers/playwright/remote-base.js +0 -86
  156. package/dist/drivers/playwright/types.d.ts +0 -148
  157. package/dist/drivers/playwright/types.js +0 -8
  158. package/dist/drivers/puppeteer/errors.d.ts +0 -50
  159. package/dist/drivers/puppeteer/errors.js +0 -71
  160. package/dist/drivers/puppeteer/event-emitter.d.ts +0 -145
  161. package/dist/drivers/puppeteer/event-emitter.js +0 -259
  162. package/dist/drivers/puppeteer/generated/accessibility.d.ts +0 -77
  163. package/dist/drivers/puppeteer/generated/accessibility.js +0 -74
  164. package/dist/drivers/puppeteer/generated/browser-context.d.ts +0 -116
  165. package/dist/drivers/puppeteer/generated/browser-context.js +0 -168
  166. package/dist/drivers/puppeteer/generated/browser.d.ts +0 -169
  167. package/dist/drivers/puppeteer/generated/browser.js +0 -246
  168. package/dist/drivers/puppeteer/generated/console-message.d.ts +0 -54
  169. package/dist/drivers/puppeteer/generated/console-message.js +0 -69
  170. package/dist/drivers/puppeteer/generated/coverage.d.ts +0 -49
  171. package/dist/drivers/puppeteer/generated/coverage.js +0 -57
  172. package/dist/drivers/puppeteer/generated/dialog.d.ts +0 -46
  173. package/dist/drivers/puppeteer/generated/dialog.js +0 -60
  174. package/dist/drivers/puppeteer/generated/element-handle.d.ts +0 -261
  175. package/dist/drivers/puppeteer/generated/element-handle.js +0 -341
  176. package/dist/drivers/puppeteer/generated/file-chooser.d.ts +0 -34
  177. package/dist/drivers/puppeteer/generated/file-chooser.js +0 -43
  178. package/dist/drivers/puppeteer/generated/frame.d.ts +0 -221
  179. package/dist/drivers/puppeteer/generated/frame.js +0 -302
  180. package/dist/drivers/puppeteer/generated/http-request.d.ts +0 -195
  181. package/dist/drivers/puppeteer/generated/http-request.js +0 -243
  182. package/dist/drivers/puppeteer/generated/http-response.d.ts +0 -142
  183. package/dist/drivers/puppeteer/generated/http-response.js +0 -169
  184. package/dist/drivers/puppeteer/generated/js-handle.d.ts +0 -104
  185. package/dist/drivers/puppeteer/generated/js-handle.js +0 -125
  186. package/dist/drivers/puppeteer/generated/keyboard.d.ts +0 -79
  187. package/dist/drivers/puppeteer/generated/keyboard.js +0 -89
  188. package/dist/drivers/puppeteer/generated/locator.d.ts +0 -141
  189. package/dist/drivers/puppeteer/generated/locator.js +0 -164
  190. package/dist/drivers/puppeteer/generated/mouse.d.ts +0 -74
  191. package/dist/drivers/puppeteer/generated/mouse.js +0 -94
  192. package/dist/drivers/puppeteer/generated/page.d.ts +0 -604
  193. package/dist/drivers/puppeteer/generated/page.js +0 -776
  194. package/dist/drivers/puppeteer/generated/target.d.ts +0 -105
  195. package/dist/drivers/puppeteer/generated/target.js +0 -123
  196. package/dist/drivers/puppeteer/generated/touchscreen.d.ts +0 -87
  197. package/dist/drivers/puppeteer/generated/touchscreen.js +0 -103
  198. package/dist/drivers/puppeteer/generated/tracing.d.ts +0 -38
  199. package/dist/drivers/puppeteer/generated/tracing.js +0 -43
  200. package/dist/drivers/puppeteer/generated/web-worker.d.ts +0 -63
  201. package/dist/drivers/puppeteer/generated/web-worker.js +0 -73
  202. package/dist/drivers/puppeteer/index.d.ts +0 -21
  203. package/dist/drivers/puppeteer/index.js +0 -23
  204. package/dist/drivers/puppeteer/remote-base.d.ts +0 -57
  205. package/dist/drivers/puppeteer/remote-base.js +0 -79
  206. package/dist/drivers/puppeteer/types.d.ts +0 -178
  207. package/dist/drivers/puppeteer/types.js +0 -8
  208. package/dist/drivers/selenium/driver.d.ts +0 -28
  209. package/dist/drivers/selenium/driver.js +0 -169
  210. package/dist/drivers/selenium/element.d.ts +0 -34
  211. package/dist/drivers/selenium/element.js +0 -73
  212. package/dist/drivers/selenium/index.d.ts +0 -3
  213. package/dist/drivers/selenium/index.js +0 -5
  214. package/dist/drivers/selenium/types.d.ts +0 -2
  215. package/dist/drivers/selenium/types.js +0 -12
  216. package/dist/drivers/stagehand/generated/context.d.ts +0 -127
  217. package/dist/drivers/stagehand/generated/context.js +0 -153
  218. package/dist/drivers/stagehand/generated/locator.d.ts +0 -324
  219. package/dist/drivers/stagehand/generated/locator.js +0 -368
  220. package/dist/drivers/stagehand/generated/page.d.ts +0 -377
  221. package/dist/drivers/stagehand/generated/page.js +0 -439
  222. package/dist/drivers/stagehand/generated/response.d.ts +0 -197
  223. package/dist/drivers/stagehand/generated/response.js +0 -232
  224. package/dist/drivers/stagehand/index.d.ts +0 -5
  225. package/dist/drivers/stagehand/index.js +0 -8
  226. package/dist/drivers/stagehand/types.d.ts +0 -1
  227. package/dist/drivers/stagehand/types.js +0 -7
  228. package/dist/extensions/client.d.ts +0 -47
  229. package/dist/extensions/client.js +0 -154
  230. package/dist/extensions/index.d.ts +0 -1
  231. package/dist/extensions/index.js +0 -1
  232. package/dist/internal/dev-client.d.ts +0 -5
  233. package/dist/internal/dev-client.js +0 -9
  234. package/dist/internal/rpc-targets.d.ts +0 -17
  235. package/dist/internal/rpc-targets.js +0 -58
  236. package/dist/internal/serialization.d.ts +0 -32
  237. package/dist/internal/serialization.js +0 -42
  238. package/dist/internal/transport.d.ts +0 -24
  239. package/dist/internal/transport.js +0 -29
  240. package/dist/playwright.d.ts +0 -1
  241. package/dist/playwright.js +0 -2
  242. package/dist/puppeteer.d.ts +0 -1
  243. package/dist/puppeteer.js +0 -2
  244. package/dist/selenium.d.ts +0 -1
  245. package/dist/selenium.js +0 -2
  246. package/dist/stagehand.d.ts +0 -1
  247. package/dist/stagehand.js +0 -2
  248. package/dist/storage/client.d.ts +0 -151
  249. package/dist/storage/client.js +0 -329
  250. package/dist/storage/index.d.ts +0 -2
  251. package/dist/storage/index.js +0 -4
  252. package/dist/telemetry.d.ts +0 -18
  253. package/dist/telemetry.js +0 -93
  254. package/dist/updates/client.d.ts +0 -8
  255. package/dist/updates/client.js +0 -128
  256. package/dist/updates/index.d.ts +0 -1
  257. package/dist/updates/index.js +0 -1
  258. package/dist/utils/http.d.ts +0 -39
  259. package/dist/utils/http.js +0 -88
  260. package/dist/utils/index.d.ts +0 -4
  261. package/dist/utils/index.js +0 -4
  262. package/dist/utils/logger.d.ts +0 -27
  263. package/dist/utils/logger.js +0 -74
  264. package/dist/utils/schema.d.ts +0 -17
  265. package/dist/utils/schema.js +0 -31
  266. package/dist/utils/url.d.ts +0 -5
  267. package/dist/utils/url.js +0 -7
  268. package/dist/vault/client.d.ts +0 -43
  269. package/dist/vault/client.js +0 -123
  270. package/dist/vault/index.d.ts +0 -1
  271. package/dist/vault/index.js +0 -1
  272. package/dist/workspaces/browser-runtime.d.ts +0 -251
  273. package/dist/workspaces/browser-runtime.js +0 -1025
  274. package/dist/workspaces/client.d.ts +0 -48
  275. package/dist/workspaces/client.js +0 -222
  276. package/dist/workspaces/index.d.ts +0 -2
  277. package/dist/workspaces/index.js +0 -2
  278. package/dist/workspaces/runtime-event-pump.d.ts +0 -65
  279. 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 workspaces, browser runtimes, and browser profile automation.
3
+ TypeScript SDK for BCTRL v2 spaces, browser runtimes, invocations, runs, and files.
4
4
 
5
5
  ## Install
6
6
 
@@ -19,44 +19,44 @@ const bctrl = new Bctrl({
19
19
  apiKey: process.env.BCTRL_API_KEY!,
20
20
  });
21
21
 
22
- const workspace = await bctrl.workspaces.create({
22
+ const space = await bctrl.spaces.create({
23
23
  name: 'my-task',
24
+ region: 'us-east-1',
24
25
  });
25
26
 
26
- const browser = await workspace.runtimes.browser('web').playwright({
27
- launch: { mode: 'ephemeral' },
27
+ const browser = await space.browsers.launch({
28
+ name: 'browser-task',
29
+ state: 'ephemeral',
28
30
  });
29
31
 
30
- await browser.run({
31
- steps: [
32
- { call: 'page.goto', args: ['https://example.com'] },
33
- ],
32
+ const connection = await browser.connect();
33
+ console.log(connection.wsUrl);
34
+
35
+ const invocation = await browser.invocations.create({
36
+ provider: 'stagehand',
37
+ method: 'act',
38
+ input: { instruction: 'Open https://example.com' },
34
39
  });
35
40
 
36
- const state = await workspace.state({ runtime: 'web' });
37
- console.log(state.runtimes[0]?.summary);
41
+ const result = await invocation.wait({ timeoutMs: 60_000 });
42
+ console.log(result.data.status);
38
43
  ```
39
44
 
40
- The public SDK always targets `https://api.bctrl.ai/v1`.
41
-
42
- For local development inside this repo, use the internal test helper instead of changing the public client base URL:
45
+ The public SDK targets `https://api.bctrl.ai/v2`. For local development, pass a
46
+ local origin or v2 base URL:
43
47
 
44
48
  ```ts
45
- import { createInternalBctrl } from '../src/internal/dev-client.js';
46
-
47
- const bctrl = createInternalBctrl({
49
+ const bctrl = new Bctrl({
48
50
  apiKey: process.env.BCTRL_API_KEY!,
49
- apiOrigin: 'http://localhost:8787',
51
+ baseUrl: 'http://localhost:8787',
50
52
  });
51
53
  ```
52
54
 
55
+ `baseUrl` may include or omit `/v2`; the client normalizes either form.
56
+
53
57
  ## Entry points
54
58
 
55
- - `@bctrl/sdk`: core client, workspaces, browser profiles, AI credentials, storage, vault, updates
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
59
+ - `@bctrl/sdk`: v2 client, resources, errors, and public types
60
60
 
61
61
  ## Documentation
62
62
 
@@ -65,11 +65,6 @@ const bctrl = createInternalBctrl({
65
65
 
66
66
  ## Telemetry
67
67
 
68
- The SDK currently contains optional error telemetry, not full usage analytics.
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.
68
+ The published SDK does not include vendor-owned telemetry or usage analytics.
74
69
 
75
- If you want to measure feature adoption, successful operations, or per-method usage, that is not implemented in the published SDK today. Instrument your application around SDK calls or add explicit SDK hooks before relying on package-level usage analytics.
70
+ 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 { 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;
1
+ import { V2FilesClient } from './files.js';
2
+ import { type V2ClientOptions } from './http.js';
3
+ import { V2InvocationsClient } from './invocations.js';
4
+ import { V2RunsClient } from './runs.js';
5
+ import { V2RuntimesClient } from './runtimes.js';
6
+ import { V2SpacesClient } from './spaces.js';
7
+ export type BctrlV2Options = V2ClientOptions;
8
+ export declare class BctrlV2 {
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?: BctrlV2Options);
17
+ get spaces(): V2SpacesClient;
18
+ get runtimes(): V2RuntimesClient;
19
+ get runs(): V2RunsClient;
20
+ get invocations(): V2InvocationsClient;
21
+ get files(): V2FilesClient;
12
22
  }
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 {};
23
+ export { BctrlV2 as Bctrl };
package/dist/bctrl.js CHANGED
@@ -1,77 +1,42 @@
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
- }
1
+ import { isControllerBusy } from './errors.js';
2
+ import { V2FilesClient } from './files.js';
3
+ import { V2HttpClient } from './http.js';
4
+ import { V2InvocationsClient } from './invocations.js';
5
+ import { V2RunsClient } from './runs.js';
6
+ import { V2RuntimesClient } from './runtimes.js';
7
+ import { V2SpacesClient } from './spaces.js';
8
+ export class BctrlV2 {
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 V2HttpClient(options);
20
+ }
21
+ get spaces() {
22
+ this._spaces ??= new V2SpacesClient(this.http);
23
+ return this._spaces;
24
+ }
25
+ get runtimes() {
26
+ this._runtimes ??= new V2RuntimesClient(this.http);
27
+ return this._runtimes;
28
+ }
29
+ get runs() {
30
+ this._runs ??= new V2RunsClient(this.http);
31
+ return this._runs;
32
+ }
33
+ get invocations() {
34
+ this._invocations ??= new V2InvocationsClient(this.http);
35
+ return this._invocations;
36
+ }
37
+ get files() {
38
+ this._files ??= new V2FilesClient(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 { BctrlV2 as Bctrl };
@@ -0,0 +1,24 @@
1
+ import type { V2HttpClient } from './http.js';
2
+ import type { V2RuntimeInvocationsClient } from './invocations.js';
3
+ import { V2RuntimeConnectionResource, V2RuntimeResource } from './runtimes.js';
4
+ import { V2RunResource } from './runs.js';
5
+ import type { BrowserLaunchOptions, V2Runtime, V2RuntimeConnectionCreateOptions } from './types.js';
6
+ export declare class V2BrowserResource {
7
+ private readonly http;
8
+ private readonly spaceId;
9
+ readonly runtime: V2RuntimeResource;
10
+ constructor(http: V2HttpClient, spaceId: string, runtime: V2RuntimeResource);
11
+ get id(): string;
12
+ get data(): V2Runtime;
13
+ get invocations(): V2RuntimeInvocationsClient;
14
+ connect(request?: V2RuntimeConnectionCreateOptions): Promise<V2RuntimeConnectionResource>;
15
+ run(): Promise<V2RunResource>;
16
+ stop(): Promise<V2Runtime>;
17
+ refresh(): Promise<V2BrowserResource>;
18
+ }
19
+ export declare class V2SpaceBrowsersClient {
20
+ private readonly http;
21
+ private readonly spaceId;
22
+ constructor(http: V2HttpClient, spaceId: string);
23
+ launch(options: BrowserLaunchOptions): Promise<V2BrowserResource>;
24
+ }
@@ -0,0 +1,82 @@
1
+ import { BctrlValidationError } from './errors.js';
2
+ import { V2RuntimesClient, } from './runtimes.js';
3
+ export class V2BrowserResource {
4
+ http;
5
+ spaceId;
6
+ runtime;
7
+ constructor(http, spaceId, runtime) {
8
+ this.http = http;
9
+ this.spaceId = spaceId;
10
+ this.runtime = runtime;
11
+ }
12
+ get id() {
13
+ return this.runtime.id;
14
+ }
15
+ get data() {
16
+ return this.runtime.data;
17
+ }
18
+ get invocations() {
19
+ return this.runtime.invocations;
20
+ }
21
+ connect(request) {
22
+ return this.runtime.connect(request);
23
+ }
24
+ async run() {
25
+ return this.runtime.run();
26
+ }
27
+ stop() {
28
+ return this.runtime.stop();
29
+ }
30
+ async refresh() {
31
+ const runtime = await new V2RuntimesClient(this.http).get(this.id);
32
+ return new V2BrowserResource(this.http, this.spaceId, runtime);
33
+ }
34
+ }
35
+ export class V2SpaceBrowsersClient {
36
+ http;
37
+ spaceId;
38
+ constructor(http, spaceId) {
39
+ this.http = http;
40
+ this.spaceId = spaceId;
41
+ }
42
+ async launch(options) {
43
+ const request = browserLaunchToRuntimeCreate(options);
44
+ const runtime = await new V2RuntimesClient(this.http).createInSpace(this.spaceId, request);
45
+ const started = await runtime.start();
46
+ return new V2BrowserResource(this.http, this.spaceId, started.runtime);
47
+ }
48
+ }
49
+ function browserLaunchToRuntimeCreate(options) {
50
+ const state = options.state ?? 'ephemeral';
51
+ if (!options.name?.trim()) {
52
+ throw new BctrlValidationError('Browser name is required', 'browser.name_required');
53
+ }
54
+ if (state === 'profile') {
55
+ const unsupported = [
56
+ ['stealth', options.stealth],
57
+ ['proxy', options.proxy],
58
+ ['fingerprint', options.fingerprint],
59
+ ['extensions', options.extensions],
60
+ ]
61
+ .filter(([, value]) => value !== undefined)
62
+ .map(([key]) => key);
63
+ if (unsupported.length > 0) {
64
+ throw new BctrlValidationError('Profile-backed browser launch only supports lifecycle config right now', 'browser.profile_config_unsupported', { unsupported });
65
+ }
66
+ }
67
+ return {
68
+ type: 'browser',
69
+ name: options.name,
70
+ metadata: options.metadata,
71
+ config: {
72
+ browser: {
73
+ profile: state === 'profile',
74
+ },
75
+ ...(options.lifecycle ? { lifecycle: options.lifecycle } : {}),
76
+ ...(state === 'ephemeral' && options.stealth ? { stealth: options.stealth } : {}),
77
+ ...(state === 'ephemeral' && options.proxy !== undefined ? { proxy: options.proxy } : {}),
78
+ ...(state === 'ephemeral' && options.fingerprint ? { fingerprint: options.fingerprint } : {}),
79
+ ...(state === 'ephemeral' && options.extensions ? { extensions: options.extensions } : {}),
80
+ },
81
+ };
82
+ }
package/dist/errors.d.ts CHANGED
@@ -1,47 +1,53 @@
1
- import { type AutomationDiagnostic } from './contracts/automation.js';
2
- /**
3
- * Base error class for all bctrl SDK errors.
4
- * Carries a fine-grained `.code` and optional `.context` metadata.
5
- */
1
+ export interface V2ErrorContext {
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?: Record<string, unknown> | undefined;
9
- constructor(message: string, code: string, context?: Record<string, unknown> | undefined);
10
- /** Serialize for structured loggers (pino, winston) and JSON.stringify() */
10
+ readonly context?: V2ErrorContext;
11
+ constructor(message: string, code: string, context?: V2ErrorContext);
11
12
  toJSON(): Record<string, unknown>;
12
13
  }
13
- /** Automation/driver/script errors your code or selectors need fixing */
14
- export declare class AutomationError extends BctrlError {
15
- constructor(message: string, code?: string, context?: Record<string, unknown>);
16
- /** Human-readable suggestion from control-plane validation. */
17
- get hint(): string | undefined;
18
- /** Structured diagnostic payload with machine-readable fix metadata. */
19
- get diagnostic(): AutomationDiagnostic | undefined;
20
- }
21
- /** Session/browser lifecycle errors reconnect or recreate */
22
- export declare class SessionError extends BctrlError {
23
- constructor(message: string, code?: string, context?: Record<string, unknown>);
24
- }
25
- /** Timeout errors increase timeout or retry */
26
- export declare class TimeoutError extends BctrlError {
27
- constructor(message: string, context?: Record<string, unknown>);
28
- }
29
- /** Authentication/authorization errors — check API key */
30
- export declare class AuthenticationError extends BctrlError {
31
- constructor(message: string, context?: Record<string, unknown>);
32
- }
33
- /** Reconstruct a typed error from the wire format (errorCode + errorContext) */
34
- export declare function fromErrorResponse(message: string, code?: string, context?: Record<string, unknown>): BctrlError;
35
- export declare function isBctrlError(error: unknown): error is BctrlError;
36
- export declare function isAutomationError(error: unknown): error is AutomationError;
37
- export declare function isSessionError(error: unknown): error is SessionError;
38
- export declare function isTimeoutError(error: unknown): error is TimeoutError;
39
- export declare function isAuthenticationError(error: unknown): error is AuthenticationError;
40
- /**
41
- * Get a typed automation hint from an SDK error when available.
42
- */
43
- export declare function getAutomationHint(error: unknown): string | undefined;
44
- /**
45
- * Get a typed automation diagnostic payload from an SDK error when available.
46
- */
47
- export declare function getAutomationDiagnostic(error: unknown): AutomationDiagnostic | undefined;
14
+ export declare class BctrlApiError extends BctrlError {
15
+ constructor(message: string, code?: string, context?: V2ErrorContext);
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?: V2ErrorContext);
21
+ }
22
+ export declare class BctrlPermissionError extends BctrlApiError {
23
+ constructor(message: string, code?: string, context?: V2ErrorContext);
24
+ }
25
+ export declare class BctrlNotFoundError extends BctrlApiError {
26
+ constructor(message: string, code?: string, context?: V2ErrorContext);
27
+ }
28
+ export declare class BctrlConflictError extends BctrlApiError {
29
+ constructor(message: string, code?: string, context?: V2ErrorContext);
30
+ }
31
+ export declare class BctrlRateLimitError extends BctrlApiError {
32
+ constructor(message: string, code?: string, context?: V2ErrorContext);
33
+ }
34
+ export declare class BctrlValidationError extends BctrlApiError {
35
+ constructor(message: string, code?: string, context?: V2ErrorContext);
36
+ }
37
+ export declare class BctrlNetworkError extends BctrlError {
38
+ constructor(message: string, context?: V2ErrorContext);
39
+ }
40
+ export declare class BctrlNotReadyError extends BctrlError {
41
+ constructor(message: string, context?: V2ErrorContext);
42
+ }
43
+ export declare class BctrlUnsupportedError extends BctrlError {
44
+ constructor(message: string, context?: V2ErrorContext);
45
+ }
46
+ export declare function createV2HttpError(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;