@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.
Files changed (277) hide show
  1. package/README.md +28 -29
  2. package/dist/bctrl.d.ts +22 -36
  3. package/dist/bctrl.js +40 -75
  4. package/dist/errors.d.ts +49 -43
  5. package/dist/errors.js +83 -120
  6. package/dist/files.d.ts +31 -0
  7. package/dist/files.js +97 -0
  8. package/dist/http.d.ts +18 -0
  9. package/dist/http.js +135 -0
  10. package/dist/index.d.ts +9 -12
  11. package/dist/index.js +7 -23
  12. package/dist/invocations.d.ts +86 -0
  13. package/dist/invocations.js +159 -0
  14. package/dist/pagination.d.ts +2 -0
  15. package/dist/pagination.js +13 -0
  16. package/dist/runs.d.ts +40 -0
  17. package/dist/runs.js +105 -0
  18. package/dist/runtimes.d.ts +69 -0
  19. package/dist/runtimes.js +202 -0
  20. package/dist/spaces.d.ts +40 -0
  21. package/dist/spaces.js +96 -0
  22. package/dist/types.d.ts +413 -0
  23. package/dist/types.js +1 -0
  24. package/dist/utils.d.ts +4 -0
  25. package/dist/utils.js +27 -0
  26. package/dist/version.js +2 -2
  27. package/package.json +4 -21
  28. package/dist/agents/browser-use/index.d.ts +0 -1
  29. package/dist/agents/browser-use/index.js +0 -9
  30. package/dist/agents/browser-use/namespace.d.ts +0 -39
  31. package/dist/agents/browser-use/namespace.js +0 -93
  32. package/dist/agents/index.d.ts +0 -2
  33. package/dist/agents/index.js +0 -17
  34. package/dist/agents/stagehand/core.d.ts +0 -93
  35. package/dist/agents/stagehand/core.js +0 -144
  36. package/dist/agents/stagehand/index.d.ts +0 -3
  37. package/dist/agents/stagehand/index.js +0 -24
  38. package/dist/agents/stagehand/namespace.d.ts +0 -51
  39. package/dist/agents/stagehand/namespace.js +0 -65
  40. package/dist/ai-credentials/client.d.ts +0 -12
  41. package/dist/ai-credentials/client.js +0 -70
  42. package/dist/ai-credentials/index.d.ts +0 -1
  43. package/dist/ai-credentials/index.js +0 -1
  44. package/dist/base/event-binding.d.ts +0 -7
  45. package/dist/base/event-binding.js +0 -23
  46. package/dist/base/types.d.ts +0 -109
  47. package/dist/base/types.js +0 -4
  48. package/dist/browser-extensions/client.d.ts +0 -15
  49. package/dist/browser-extensions/client.js +0 -72
  50. package/dist/browser-extensions/index.d.ts +0 -2
  51. package/dist/browser-extensions/index.js +0 -1
  52. package/dist/browser-profiles/client.d.ts +0 -11
  53. package/dist/browser-profiles/client.js +0 -63
  54. package/dist/browser-profiles/index.d.ts +0 -1
  55. package/dist/browser-profiles/index.js +0 -1
  56. package/dist/captcha/index.d.ts +0 -1
  57. package/dist/captcha/index.js +0 -1
  58. package/dist/captcha/namespace.d.ts +0 -34
  59. package/dist/captcha/namespace.js +0 -41
  60. package/dist/client/index.d.ts +0 -1
  61. package/dist/client/index.js +0 -1
  62. package/dist/client/rpc.d.ts +0 -83
  63. package/dist/client/rpc.js +0 -354
  64. package/dist/config.d.ts +0 -5
  65. package/dist/config.js +0 -28
  66. package/dist/constants/browser.d.ts +0 -2
  67. package/dist/constants/browser.js +0 -1
  68. package/dist/contracts/agent-tools.d.ts +0 -45
  69. package/dist/contracts/agent-tools.js +0 -31
  70. package/dist/contracts/automation.d.ts +0 -265
  71. package/dist/contracts/automation.js +0 -109
  72. package/dist/contracts/browser-management.d.ts +0 -179
  73. package/dist/contracts/browser-management.js +0 -95
  74. package/dist/contracts/browser-use.d.ts +0 -136
  75. package/dist/contracts/browser-use.js +0 -93
  76. package/dist/contracts/captcha.d.ts +0 -114
  77. package/dist/contracts/captcha.js +0 -40
  78. package/dist/contracts/desktop.d.ts +0 -223
  79. package/dist/contracts/desktop.js +0 -121
  80. package/dist/contracts/drivers/playwright.d.ts +0 -2008
  81. package/dist/contracts/drivers/playwright.js +0 -2033
  82. package/dist/contracts/drivers/puppeteer.d.ts +0 -1221
  83. package/dist/contracts/drivers/puppeteer.js +0 -941
  84. package/dist/contracts/drivers/selenium.d.ts +0 -156
  85. package/dist/contracts/drivers/selenium.js +0 -61
  86. package/dist/contracts/drivers/stagehand.d.ts +0 -155
  87. package/dist/contracts/drivers/stagehand.js +0 -7
  88. package/dist/contracts/extensions.d.ts +0 -13
  89. package/dist/contracts/extensions.js +0 -9
  90. package/dist/contracts/index.d.ts +0 -13
  91. package/dist/contracts/index.js +0 -13
  92. package/dist/contracts/public-api.d.ts +0 -360
  93. package/dist/contracts/public-api.js +0 -17
  94. package/dist/contracts/runtime.d.ts +0 -81
  95. package/dist/contracts/runtime.js +0 -16
  96. package/dist/contracts/stagehand.d.ts +0 -253
  97. package/dist/contracts/stagehand.js +0 -145
  98. package/dist/contracts/storage.d.ts +0 -51
  99. package/dist/contracts/storage.js +0 -56
  100. package/dist/contracts/vault.d.ts +0 -119
  101. package/dist/contracts/vault.js +0 -112
  102. package/dist/contracts/version.d.ts +0 -3
  103. package/dist/contracts/version.js +0 -16
  104. package/dist/desktop.d.ts +0 -2
  105. package/dist/desktop.js +0 -3
  106. package/dist/drivers/desktop/index.d.ts +0 -65
  107. package/dist/drivers/desktop/index.js +0 -68
  108. package/dist/drivers/desktop/session.d.ts +0 -313
  109. package/dist/drivers/desktop/session.js +0 -432
  110. package/dist/drivers/playwright/event-emitter.d.ts +0 -160
  111. package/dist/drivers/playwright/event-emitter.js +0 -297
  112. package/dist/drivers/playwright/generated/api-request-context.d.ts +0 -137
  113. package/dist/drivers/playwright/generated/api-request-context.js +0 -154
  114. package/dist/drivers/playwright/generated/api-response.d.ts +0 -119
  115. package/dist/drivers/playwright/generated/api-response.js +0 -123
  116. package/dist/drivers/playwright/generated/browser-context.d.ts +0 -284
  117. package/dist/drivers/playwright/generated/browser-context.js +0 -458
  118. package/dist/drivers/playwright/generated/browser.d.ts +0 -120
  119. package/dist/drivers/playwright/generated/browser.js +0 -151
  120. package/dist/drivers/playwright/generated/clock.d.ts +0 -80
  121. package/dist/drivers/playwright/generated/clock.js +0 -94
  122. package/dist/drivers/playwright/generated/console-message.d.ts +0 -94
  123. package/dist/drivers/playwright/generated/console-message.js +0 -89
  124. package/dist/drivers/playwright/generated/coverage.d.ts +0 -57
  125. package/dist/drivers/playwright/generated/coverage.js +0 -66
  126. package/dist/drivers/playwright/generated/dialog.d.ts +0 -79
  127. package/dist/drivers/playwright/generated/dialog.js +0 -80
  128. package/dist/drivers/playwright/generated/element-handle.d.ts +0 -399
  129. package/dist/drivers/playwright/generated/element-handle.js +0 -501
  130. package/dist/drivers/playwright/generated/frame-locator.d.ts +0 -34
  131. package/dist/drivers/playwright/generated/frame-locator.js +0 -63
  132. package/dist/drivers/playwright/generated/frame.d.ts +0 -557
  133. package/dist/drivers/playwright/generated/frame.js +0 -634
  134. package/dist/drivers/playwright/generated/js-handle.d.ts +0 -72
  135. package/dist/drivers/playwright/generated/js-handle.js +0 -92
  136. package/dist/drivers/playwright/generated/keyboard.d.ts +0 -103
  137. package/dist/drivers/playwright/generated/keyboard.js +0 -113
  138. package/dist/drivers/playwright/generated/locator.d.ts +0 -795
  139. package/dist/drivers/playwright/generated/locator.js +0 -974
  140. package/dist/drivers/playwright/generated/mouse.d.ts +0 -97
  141. package/dist/drivers/playwright/generated/mouse.js +0 -109
  142. package/dist/drivers/playwright/generated/page.d.ts +0 -762
  143. package/dist/drivers/playwright/generated/page.js +0 -988
  144. package/dist/drivers/playwright/generated/touchscreen.d.ts +0 -34
  145. package/dist/drivers/playwright/generated/touchscreen.js +0 -37
  146. package/dist/drivers/playwright/generated/tracing.d.ts +0 -78
  147. package/dist/drivers/playwright/generated/tracing.js +0 -80
  148. package/dist/drivers/playwright/generated/worker.d.ts +0 -53
  149. package/dist/drivers/playwright/generated/worker.js +0 -59
  150. package/dist/drivers/playwright/index.d.ts +0 -19
  151. package/dist/drivers/playwright/index.js +0 -20
  152. package/dist/drivers/playwright/remote-base.d.ts +0 -62
  153. package/dist/drivers/playwright/remote-base.js +0 -86
  154. package/dist/drivers/playwright/types.d.ts +0 -148
  155. package/dist/drivers/playwright/types.js +0 -8
  156. package/dist/drivers/puppeteer/errors.d.ts +0 -50
  157. package/dist/drivers/puppeteer/errors.js +0 -71
  158. package/dist/drivers/puppeteer/event-emitter.d.ts +0 -145
  159. package/dist/drivers/puppeteer/event-emitter.js +0 -259
  160. package/dist/drivers/puppeteer/generated/accessibility.d.ts +0 -77
  161. package/dist/drivers/puppeteer/generated/accessibility.js +0 -74
  162. package/dist/drivers/puppeteer/generated/browser-context.d.ts +0 -116
  163. package/dist/drivers/puppeteer/generated/browser-context.js +0 -168
  164. package/dist/drivers/puppeteer/generated/browser.d.ts +0 -169
  165. package/dist/drivers/puppeteer/generated/browser.js +0 -246
  166. package/dist/drivers/puppeteer/generated/console-message.d.ts +0 -54
  167. package/dist/drivers/puppeteer/generated/console-message.js +0 -69
  168. package/dist/drivers/puppeteer/generated/coverage.d.ts +0 -49
  169. package/dist/drivers/puppeteer/generated/coverage.js +0 -57
  170. package/dist/drivers/puppeteer/generated/dialog.d.ts +0 -46
  171. package/dist/drivers/puppeteer/generated/dialog.js +0 -60
  172. package/dist/drivers/puppeteer/generated/element-handle.d.ts +0 -261
  173. package/dist/drivers/puppeteer/generated/element-handle.js +0 -341
  174. package/dist/drivers/puppeteer/generated/file-chooser.d.ts +0 -34
  175. package/dist/drivers/puppeteer/generated/file-chooser.js +0 -43
  176. package/dist/drivers/puppeteer/generated/frame.d.ts +0 -221
  177. package/dist/drivers/puppeteer/generated/frame.js +0 -302
  178. package/dist/drivers/puppeteer/generated/http-request.d.ts +0 -195
  179. package/dist/drivers/puppeteer/generated/http-request.js +0 -243
  180. package/dist/drivers/puppeteer/generated/http-response.d.ts +0 -142
  181. package/dist/drivers/puppeteer/generated/http-response.js +0 -169
  182. package/dist/drivers/puppeteer/generated/js-handle.d.ts +0 -104
  183. package/dist/drivers/puppeteer/generated/js-handle.js +0 -125
  184. package/dist/drivers/puppeteer/generated/keyboard.d.ts +0 -79
  185. package/dist/drivers/puppeteer/generated/keyboard.js +0 -89
  186. package/dist/drivers/puppeteer/generated/locator.d.ts +0 -141
  187. package/dist/drivers/puppeteer/generated/locator.js +0 -164
  188. package/dist/drivers/puppeteer/generated/mouse.d.ts +0 -74
  189. package/dist/drivers/puppeteer/generated/mouse.js +0 -94
  190. package/dist/drivers/puppeteer/generated/page.d.ts +0 -604
  191. package/dist/drivers/puppeteer/generated/page.js +0 -776
  192. package/dist/drivers/puppeteer/generated/target.d.ts +0 -105
  193. package/dist/drivers/puppeteer/generated/target.js +0 -123
  194. package/dist/drivers/puppeteer/generated/touchscreen.d.ts +0 -87
  195. package/dist/drivers/puppeteer/generated/touchscreen.js +0 -103
  196. package/dist/drivers/puppeteer/generated/tracing.d.ts +0 -38
  197. package/dist/drivers/puppeteer/generated/tracing.js +0 -43
  198. package/dist/drivers/puppeteer/generated/web-worker.d.ts +0 -63
  199. package/dist/drivers/puppeteer/generated/web-worker.js +0 -73
  200. package/dist/drivers/puppeteer/index.d.ts +0 -21
  201. package/dist/drivers/puppeteer/index.js +0 -23
  202. package/dist/drivers/puppeteer/remote-base.d.ts +0 -57
  203. package/dist/drivers/puppeteer/remote-base.js +0 -79
  204. package/dist/drivers/puppeteer/types.d.ts +0 -178
  205. package/dist/drivers/puppeteer/types.js +0 -8
  206. package/dist/drivers/selenium/driver.d.ts +0 -28
  207. package/dist/drivers/selenium/driver.js +0 -169
  208. package/dist/drivers/selenium/element.d.ts +0 -34
  209. package/dist/drivers/selenium/element.js +0 -73
  210. package/dist/drivers/selenium/index.d.ts +0 -3
  211. package/dist/drivers/selenium/index.js +0 -5
  212. package/dist/drivers/selenium/types.d.ts +0 -2
  213. package/dist/drivers/selenium/types.js +0 -12
  214. package/dist/drivers/stagehand/generated/context.d.ts +0 -127
  215. package/dist/drivers/stagehand/generated/context.js +0 -153
  216. package/dist/drivers/stagehand/generated/locator.d.ts +0 -324
  217. package/dist/drivers/stagehand/generated/locator.js +0 -368
  218. package/dist/drivers/stagehand/generated/page.d.ts +0 -377
  219. package/dist/drivers/stagehand/generated/page.js +0 -439
  220. package/dist/drivers/stagehand/generated/response.d.ts +0 -197
  221. package/dist/drivers/stagehand/generated/response.js +0 -232
  222. package/dist/drivers/stagehand/index.d.ts +0 -5
  223. package/dist/drivers/stagehand/index.js +0 -8
  224. package/dist/drivers/stagehand/types.d.ts +0 -1
  225. package/dist/drivers/stagehand/types.js +0 -7
  226. package/dist/extensions/client.d.ts +0 -47
  227. package/dist/extensions/client.js +0 -154
  228. package/dist/extensions/index.d.ts +0 -1
  229. package/dist/extensions/index.js +0 -1
  230. package/dist/internal/dev-client.d.ts +0 -5
  231. package/dist/internal/dev-client.js +0 -9
  232. package/dist/internal/rpc-targets.d.ts +0 -17
  233. package/dist/internal/rpc-targets.js +0 -58
  234. package/dist/internal/serialization.d.ts +0 -32
  235. package/dist/internal/serialization.js +0 -42
  236. package/dist/internal/transport.d.ts +0 -24
  237. package/dist/internal/transport.js +0 -29
  238. package/dist/playwright.d.ts +0 -1
  239. package/dist/playwright.js +0 -2
  240. package/dist/puppeteer.d.ts +0 -1
  241. package/dist/puppeteer.js +0 -2
  242. package/dist/selenium.d.ts +0 -1
  243. package/dist/selenium.js +0 -2
  244. package/dist/stagehand.d.ts +0 -1
  245. package/dist/stagehand.js +0 -2
  246. package/dist/storage/client.d.ts +0 -151
  247. package/dist/storage/client.js +0 -329
  248. package/dist/storage/index.d.ts +0 -2
  249. package/dist/storage/index.js +0 -4
  250. package/dist/telemetry.d.ts +0 -18
  251. package/dist/telemetry.js +0 -93
  252. package/dist/updates/client.d.ts +0 -8
  253. package/dist/updates/client.js +0 -128
  254. package/dist/updates/index.d.ts +0 -1
  255. package/dist/updates/index.js +0 -1
  256. package/dist/utils/http.d.ts +0 -39
  257. package/dist/utils/http.js +0 -88
  258. package/dist/utils/index.d.ts +0 -4
  259. package/dist/utils/index.js +0 -4
  260. package/dist/utils/logger.d.ts +0 -27
  261. package/dist/utils/logger.js +0 -74
  262. package/dist/utils/schema.d.ts +0 -17
  263. package/dist/utils/schema.js +0 -31
  264. package/dist/utils/url.d.ts +0 -5
  265. package/dist/utils/url.js +0 -7
  266. package/dist/vault/client.d.ts +0 -43
  267. package/dist/vault/client.js +0 -123
  268. package/dist/vault/index.d.ts +0 -1
  269. package/dist/vault/index.js +0 -1
  270. package/dist/workspaces/browser-runtime.d.ts +0 -251
  271. package/dist/workspaces/browser-runtime.js +0 -1025
  272. package/dist/workspaces/client.d.ts +0 -48
  273. package/dist/workspaces/client.js +0 -222
  274. package/dist/workspaces/index.d.ts +0 -2
  275. package/dist/workspaces/index.js +0 -2
  276. package/dist/workspaces/runtime-event-pump.d.ts +0 -65
  277. 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 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 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 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.run({
31
- steps: [
32
- { call: 'page.goto', args: ['https://example.com'] },
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 state = await workspace.state({ runtime: 'web' });
37
- console.log(state.runtimes[0]?.summary);
45
+ const result = await invocation.wait({ timeoutMs: 60_000 });
46
+ console.log(result.data.status);
38
47
  ```
39
48
 
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:
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
- import { createInternalBctrl } from '../src/internal/dev-client.js';
46
-
47
- const bctrl = createInternalBctrl({
53
+ const bctrl = new Bctrl({
48
54
  apiKey: process.env.BCTRL_API_KEY!,
49
- apiOrigin: 'http://localhost:8787',
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`: 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
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 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.
72
+ The published SDK does not include vendor-owned telemetry or usage analytics.
74
73
 
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.
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 { 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 { 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
- 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 { BctrlV1 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 { 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
- 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 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?: 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?: V1ErrorContext;
11
+ constructor(message: string, code: string, context?: V1ErrorContext);
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?: 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
- /** Automation/driver/script errors your code or selectors need fixing */
57
- export class AutomationError extends BctrlError {
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 = 'AutomationError';
22
+ this.name = 'BctrlApiError';
61
23
  }
62
- /** Human-readable suggestion from control-plane validation. */
63
- get hint() {
64
- return getContextHint(this.context);
24
+ get status() {
25
+ return typeof this.context?.status === 'number' ? this.context.status : undefined;
65
26
  }
66
- /** Structured diagnostic payload with machine-readable fix metadata. */
67
- get diagnostic() {
68
- return getContextDiagnostic(this.context);
27
+ get requestId() {
28
+ return typeof this.context?.requestId === 'string' ? this.context.requestId : undefined;
69
29
  }
70
30
  }
71
- /** Session/browser lifecycle errors reconnect or recreate */
72
- export class SessionError extends BctrlError {
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 = 'SessionError';
34
+ this.name = 'BctrlAuthenticationError';
76
35
  }
77
36
  }
78
- /** Timeout errors increase timeout or retry */
79
- export class TimeoutError extends BctrlError {
80
- constructor(message, context) {
81
- super(message, 'TIMEOUT_ERROR', context);
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
- /** Authentication/authorization errors check API key */
86
- export class AuthenticationError extends BctrlError {
87
- constructor(message, context) {
88
- super(message, 'AUTH_ERROR', context);
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
- // Wire Format Reconstruction
94
- // ============================================================================
95
- /** Reconstruct a typed error from the wire format (errorCode + errorContext) */
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
- // Type Guards
120
- // ============================================================================
121
- //
122
- // These use structural checks as a fallback for environments where
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 function isAutomationError(error) {
131
- return error instanceof AutomationError || (isBctrlError(error) && error.name === 'AutomationError');
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 function isSessionError(error) {
134
- return error instanceof SessionError || (isBctrlError(error) && error.name === 'SessionError');
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 function isTimeoutError(error) {
137
- return error instanceof TimeoutError || (isBctrlError(error) && error.name === 'TimeoutError');
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 function isAuthenticationError(error) {
140
- return error instanceof AuthenticationError || (isBctrlError(error) && error.name === 'AuthenticationError');
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
- * Get a typed automation hint from an SDK error when available.
144
- */
145
- export function getAutomationHint(error) {
146
- if (!isBctrlError(error))
147
- return undefined;
148
- return getContextHint(error.context);
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
- * Get a typed automation diagnostic payload from an SDK error when available.
152
- */
153
- export function getAutomationDiagnostic(error) {
154
- if (!isBctrlError(error))
155
- return undefined;
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
  }
@@ -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
+ }