@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/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 createV2HttpError(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 { V2HttpClient } from './http.js';
2
+ import type { V2File, V2FileDeleteResponse, V2FilesListQuery, V2FileUpdateRequest, V2FileUploadRequest, V2ListEnvelope, V2RunFilesExportRequest, V2RunFilesListQuery } from './types.js';
3
+ export declare class V2FileResource {
4
+ private readonly http;
5
+ readonly data: V2File;
6
+ constructor(http: V2HttpClient, data: V2File);
7
+ get id(): string;
8
+ refresh(): Promise<V2FileResource>;
9
+ content(): Promise<Response>;
10
+ update(request: V2FileUpdateRequest): Promise<V2FileResource>;
11
+ delete(): Promise<V2FileDeleteResponse>;
12
+ }
13
+ export declare class V2FilesClient {
14
+ private readonly http;
15
+ constructor(http: V2HttpClient);
16
+ list(query: V2FilesListQuery): Promise<V2ListEnvelope<V2File>>;
17
+ iter(query: V2FilesListQuery): AsyncGenerator<V2File, void, undefined>;
18
+ get(id: string): Promise<V2FileResource>;
19
+ update(id: string, request: V2FileUpdateRequest): Promise<V2FileResource>;
20
+ content(id: string): Promise<Response>;
21
+ delete(id: string): Promise<V2FileDeleteResponse>;
22
+ upload(request: V2FileUploadRequest): Promise<V2FileResource>;
23
+ }
24
+ export declare class V2RunFilesClient {
25
+ private readonly http;
26
+ private readonly runId;
27
+ constructor(http: V2HttpClient, runId: string);
28
+ list(query?: V2RunFilesListQuery): Promise<V2ListEnvelope<V2File>>;
29
+ iter(query?: V2RunFilesListQuery): AsyncGenerator<V2File, void, undefined>;
30
+ export(request: V2RunFilesExportRequest): Promise<V2FileResource>;
31
+ }
package/dist/files.js ADDED
@@ -0,0 +1,97 @@
1
+ import { iterateV2Pages } from './pagination.js';
2
+ export class V2FileResource {
3
+ http;
4
+ data;
5
+ constructor(http, data) {
6
+ this.http = http;
7
+ this.data = data;
8
+ }
9
+ get id() {
10
+ return this.data.id;
11
+ }
12
+ refresh() {
13
+ return new V2FilesClient(this.http).get(this.id);
14
+ }
15
+ async content() {
16
+ return new V2FilesClient(this.http).content(this.id);
17
+ }
18
+ async update(request) {
19
+ return new V2FilesClient(this.http).update(this.id, request);
20
+ }
21
+ delete() {
22
+ return new V2FilesClient(this.http).delete(this.id);
23
+ }
24
+ }
25
+ export class V2FilesClient {
26
+ http;
27
+ constructor(http) {
28
+ this.http = http;
29
+ }
30
+ list(query) {
31
+ return this.http.request('/files', { query });
32
+ }
33
+ iter(query) {
34
+ return iterateV2Pages(query, (pageQuery) => this.list(pageQuery));
35
+ }
36
+ async get(id) {
37
+ const file = await this.http.request(`/files/${encodeURIComponent(id)}`);
38
+ return new V2FileResource(this.http, file);
39
+ }
40
+ async update(id, request) {
41
+ const file = await this.http.request(`/files/${encodeURIComponent(id)}`, {
42
+ method: 'PATCH',
43
+ body: request,
44
+ });
45
+ return new V2FileResource(this.http, file);
46
+ }
47
+ content(id) {
48
+ return this.http.raw(`/files/${encodeURIComponent(id)}/content`);
49
+ }
50
+ delete(id) {
51
+ return this.http.request(`/files/${encodeURIComponent(id)}`, {
52
+ method: 'DELETE',
53
+ });
54
+ }
55
+ async upload(request) {
56
+ const form = new FormData();
57
+ if (request.name) {
58
+ form.set('file', request.file, request.name);
59
+ }
60
+ else {
61
+ form.set('file', request.file);
62
+ }
63
+ if (request.name)
64
+ form.set('name', request.name);
65
+ if (request.path)
66
+ form.set('path', request.path);
67
+ if (request.metadata)
68
+ form.set('metadata', JSON.stringify(request.metadata));
69
+ const file = await this.http.request('/files', {
70
+ method: 'POST',
71
+ query: { spaceId: request.spaceId },
72
+ body: form,
73
+ });
74
+ return new V2FileResource(this.http, file);
75
+ }
76
+ }
77
+ export class V2RunFilesClient {
78
+ http;
79
+ runId;
80
+ constructor(http, runId) {
81
+ this.http = http;
82
+ this.runId = runId;
83
+ }
84
+ list(query = {}) {
85
+ return this.http.request(`/runs/${encodeURIComponent(this.runId)}/files`, { query });
86
+ }
87
+ iter(query = {}) {
88
+ return iterateV2Pages(query, (pageQuery) => this.list(pageQuery));
89
+ }
90
+ async export(request) {
91
+ const file = await this.http.request(`/runs/${encodeURIComponent(this.runId)}/files/export`, {
92
+ method: 'POST',
93
+ body: request,
94
+ });
95
+ return new V2FileResource(this.http, file);
96
+ }
97
+ }
package/dist/http.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ export interface V2ClientOptions {
2
+ apiKey?: string;
3
+ baseUrl?: string;
4
+ }
5
+ export interface V2RequestOptions {
6
+ method?: 'GET' | 'POST' | 'PATCH' | 'DELETE';
7
+ query?: object;
8
+ body?: unknown;
9
+ headers?: Record<string, string>;
10
+ timeoutMs?: number;
11
+ }
12
+ export declare class V2HttpClient {
13
+ readonly baseUrl: string;
14
+ readonly apiKey: string;
15
+ constructor(options: V2ClientOptions);
16
+ request<T>(path: string, options?: V2RequestOptions): Promise<T>;
17
+ raw(path: string, options?: V2RequestOptions): Promise<Response>;
18
+ }
package/dist/http.js ADDED
@@ -0,0 +1,135 @@
1
+ import { BctrlNetworkError, createV2HttpError } from './errors.js';
2
+ import { BCTRL_PRODUCTION_ORIGIN, fetchWithTimeout, resolveApiKey, stripTrailingSlash, } from './utils.js';
3
+ import { SDK_VERSION } from './version.js';
4
+ const V2_PREFIX = '/v2';
5
+ function resolveV2ApiBaseUrl(baseUrl) {
6
+ const raw = stripTrailingSlash(baseUrl?.trim() || BCTRL_PRODUCTION_ORIGIN);
7
+ if (raw.endsWith(V2_PREFIX)) {
8
+ return raw;
9
+ }
10
+ if (raw.endsWith('/v1')) {
11
+ return `${raw.slice(0, -3)}${V2_PREFIX}`;
12
+ }
13
+ return `${raw}${V2_PREFIX}`;
14
+ }
15
+ function resolveV2ApiKey(apiKey) {
16
+ return resolveApiKey(apiKey ?? process.env.BCTRL_API_KEY ?? '');
17
+ }
18
+ function appendQuery(params, key, value) {
19
+ if (value === undefined) {
20
+ return;
21
+ }
22
+ if (Array.isArray(value)) {
23
+ for (const item of value) {
24
+ if (item !== undefined)
25
+ params.append(key, String(item));
26
+ }
27
+ return;
28
+ }
29
+ if (typeof value === 'object') {
30
+ return;
31
+ }
32
+ params.set(key, String(value));
33
+ }
34
+ function parseResponseBody(text) {
35
+ if (!text.trim()) {
36
+ return undefined;
37
+ }
38
+ try {
39
+ return JSON.parse(text);
40
+ }
41
+ catch {
42
+ return text;
43
+ }
44
+ }
45
+ function responseRequestId(response) {
46
+ return (response.headers.get('x-request-id') ??
47
+ response.headers.get('x-bctrl-request-id') ??
48
+ undefined);
49
+ }
50
+ function isRecord(value) {
51
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
52
+ }
53
+ function parseV2ErrorBody(parsed, fallbackText) {
54
+ if (isRecord(parsed) && typeof parsed.error === 'string') {
55
+ return {
56
+ error: parsed.error,
57
+ ...(typeof parsed.code === 'string' ? { code: parsed.code } : {}),
58
+ ...(typeof parsed.requestId === 'string' ? { requestId: parsed.requestId } : {}),
59
+ };
60
+ }
61
+ if (typeof parsed === 'string' && parsed.trim()) {
62
+ return { error: parsed.trim() };
63
+ }
64
+ return { error: fallbackText.trim() || 'Unknown error' };
65
+ }
66
+ function isBodyInit(value) {
67
+ return (typeof value === 'string' ||
68
+ value instanceof Blob ||
69
+ value instanceof FormData ||
70
+ value instanceof URLSearchParams ||
71
+ value instanceof ArrayBuffer);
72
+ }
73
+ export class V2HttpClient {
74
+ baseUrl;
75
+ apiKey;
76
+ constructor(options) {
77
+ this.baseUrl = resolveV2ApiBaseUrl(options.baseUrl);
78
+ this.apiKey = resolveV2ApiKey(options.apiKey);
79
+ }
80
+ async request(path, options = {}) {
81
+ const response = await this.raw(path, options);
82
+ const text = await response.text();
83
+ return parseResponseBody(text);
84
+ }
85
+ async raw(path, options = {}) {
86
+ const url = new URL(`${this.baseUrl}${path.startsWith('/') ? path : `/${path}`}`);
87
+ const query = options.query ?? {};
88
+ for (const [key, value] of Object.entries(query)) {
89
+ appendQuery(url.searchParams, key, value);
90
+ }
91
+ const headers = {
92
+ Accept: 'application/json',
93
+ Authorization: `Bearer ${this.apiKey}`,
94
+ 'x-sdk-version': SDK_VERSION,
95
+ 'User-Agent': `@bctrl/sdk/${SDK_VERSION} v2`,
96
+ ...options.headers,
97
+ };
98
+ const init = {
99
+ method: options.method ?? 'GET',
100
+ headers,
101
+ };
102
+ if (options.body !== undefined) {
103
+ if (isBodyInit(options.body)) {
104
+ init.body = options.body;
105
+ }
106
+ else {
107
+ headers['Content-Type'] = 'application/json';
108
+ init.body = JSON.stringify(options.body);
109
+ }
110
+ }
111
+ let response;
112
+ try {
113
+ response = await fetchWithTimeout(url.toString(), init, options.timeoutMs);
114
+ }
115
+ catch (error) {
116
+ if (error instanceof Error) {
117
+ throw new BctrlNetworkError(error.message, { cause: error });
118
+ }
119
+ throw new BctrlNetworkError('Network request failed');
120
+ }
121
+ if (!response.ok) {
122
+ const text = await response.text();
123
+ const parsed = parseResponseBody(text);
124
+ const errorBody = parseV2ErrorBody(parsed, text);
125
+ throw createV2HttpError({
126
+ status: response.status,
127
+ message: errorBody.error,
128
+ code: errorBody.code,
129
+ requestId: errorBody.requestId ?? responseRequestId(response),
130
+ body: parsed,
131
+ });
132
+ }
133
+ return response;
134
+ }
135
+ }
package/dist/index.d.ts CHANGED
@@ -1,12 +1,9 @@
1
- export { z } from 'zod';
2
- export type { ZodType } from 'zod';
3
- export { BctrlError, AutomationError, AutomationError as SdkAutomationError, SessionError, TimeoutError, AuthenticationError, fromErrorResponse, isBctrlError, isAutomationError, isSessionError, isTimeoutError, isAuthenticationError, getAutomationHint, } from './errors.js';
4
- export * from './storage/index.js';
5
- export * from './ai-credentials/index.js';
6
- export * from './browser-extensions/index.js';
7
- export * from './browser-profiles/index.js';
8
- export * from './vault/index.js';
9
- export * from './updates/index.js';
10
- export * from './workspaces/index.js';
11
- export type { BctrlOptions } from './bctrl.js';
12
- export { Bctrl } from './bctrl.js';
1
+ export { Bctrl, BctrlV2, type BctrlV2Options } from './bctrl.js';
2
+ export { BctrlError, BctrlApiError, BctrlAuthenticationError, BctrlConflictError, BctrlNetworkError, BctrlNotFoundError, BctrlNotReadyError, BctrlPermissionError, BctrlRateLimitError, BctrlUnsupportedError, BctrlValidationError, isControllerBusy, } from './errors.js';
3
+ export { V2BrowserResource, V2SpaceBrowsersClient } from './browsers.js';
4
+ export { V2FileResource, V2FilesClient, V2RunFilesClient } from './files.js';
5
+ export { V2InvocationsClient, V2InvocationResource, V2RuntimeInvocationsClient, } from './invocations.js';
6
+ export { V2RuntimeConnectionResource, V2RuntimeConnectionsClient, V2RuntimeFilesClient, V2RuntimeResource, V2RuntimeRunsClient, V2RuntimesClient, } from './runtimes.js';
7
+ export { V2RunCommandsClient, V2RunEventsClient, V2RunResource, V2RunsClient, } from './runs.js';
8
+ export { V2SpaceEnvironmentClient, V2SpaceResource, V2SpaceRuntimesClient, V2SpacesClient, } from './spaces.js';
9
+ export type * from './types.js';
package/dist/index.js CHANGED
@@ -1,23 +1,8 @@
1
- // ============================================================================
2
- // BCTRL SDK - Core Entry Point
3
- // ============================================================================
4
- //
5
- // Keep the root entrypoint lean.
6
- // Driver-specific classes and types are exposed via subpath exports:
7
- // - <package>/puppeteer
8
- // - <package>/playwright
9
- // - <package>/stagehand
10
- // - <package>/selenium
11
- //
12
- export { z } from 'zod';
13
- // Core errors
14
- export { BctrlError, AutomationError, AutomationError as SdkAutomationError, SessionError, TimeoutError, AuthenticationError, fromErrorResponse, isBctrlError, isAutomationError, isSessionError, isTimeoutError, isAuthenticationError, getAutomationHint, } from './errors.js';
15
- // Service clients
16
- export * from './storage/index.js';
17
- export * from './ai-credentials/index.js';
18
- export * from './browser-extensions/index.js';
19
- export * from './browser-profiles/index.js';
20
- export * from './vault/index.js';
21
- export * from './updates/index.js';
22
- export * from './workspaces/index.js';
23
- export { Bctrl } from './bctrl.js';
1
+ export { Bctrl, BctrlV2 } from './bctrl.js';
2
+ export { BctrlError, BctrlApiError, BctrlAuthenticationError, BctrlConflictError, BctrlNetworkError, BctrlNotFoundError, BctrlNotReadyError, BctrlPermissionError, BctrlRateLimitError, BctrlUnsupportedError, BctrlValidationError, isControllerBusy, } from './errors.js';
3
+ export { V2BrowserResource, V2SpaceBrowsersClient } from './browsers.js';
4
+ export { V2FileResource, V2FilesClient, V2RunFilesClient } from './files.js';
5
+ export { V2InvocationsClient, V2InvocationResource, V2RuntimeInvocationsClient, } from './invocations.js';
6
+ export { V2RuntimeConnectionResource, V2RuntimeConnectionsClient, V2RuntimeFilesClient, V2RuntimeResource, V2RuntimeRunsClient, V2RuntimesClient, } from './runtimes.js';
7
+ export { V2RunCommandsClient, V2RunEventsClient, V2RunResource, V2RunsClient, } from './runs.js';
8
+ export { V2SpaceEnvironmentClient, V2SpaceResource, V2SpaceRuntimesClient, V2SpacesClient, } from './spaces.js';
@@ -0,0 +1,24 @@
1
+ import type { V2HttpClient } from './http.js';
2
+ import type { V2Invocation, V2RuntimeInvocationCreateRequest, V2InvocationWaitRequest, V2InvocationWaitResponse } from './types.js';
3
+ export declare class V2InvocationResource {
4
+ private readonly http;
5
+ readonly data: V2Invocation;
6
+ constructor(http: V2HttpClient, data: V2Invocation);
7
+ get id(): string;
8
+ refresh(): Promise<V2Invocation>;
9
+ wait(request?: V2InvocationWaitRequest): Promise<V2InvocationWaitResponse>;
10
+ cancel(): Promise<V2Invocation>;
11
+ }
12
+ export declare class V2InvocationsClient {
13
+ private readonly http;
14
+ constructor(http: V2HttpClient);
15
+ get(id: string): Promise<V2InvocationResource>;
16
+ wait(id: string, request?: V2InvocationWaitRequest): Promise<V2InvocationWaitResponse>;
17
+ cancel(id: string): Promise<V2InvocationResource>;
18
+ }
19
+ export declare class V2RuntimeInvocationsClient {
20
+ private readonly http;
21
+ private readonly runtimeId;
22
+ constructor(http: V2HttpClient, runtimeId: string);
23
+ create(request: V2RuntimeInvocationCreateRequest): Promise<V2InvocationResource>;
24
+ }