@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
@@ -1,128 +0,0 @@
1
- import { UpdateEventSchema } from '../contracts/public-api.js';
2
- import { parseErrorDetails, parseJsonResponse } from '../utils/http.js';
3
- import { SDK_VERSION } from '../version.js';
4
- function buildHeaders(apiKey, accept) {
5
- const headers = {
6
- 'x-sdk-version': SDK_VERSION,
7
- Authorization: `Bearer ${apiKey}`,
8
- };
9
- if (accept) {
10
- headers.Accept = accept;
11
- }
12
- return headers;
13
- }
14
- export class UpdatesClient {
15
- baseUrl;
16
- apiKey;
17
- constructor(baseUrl, apiKey) {
18
- this.baseUrl = baseUrl;
19
- this.apiKey = apiKey;
20
- }
21
- async *stream(signal) {
22
- const token = await this.issueToken();
23
- const response = await fetch(`${this.baseUrl}/updates/stream?token=${encodeURIComponent(token)}`, {
24
- method: 'GET',
25
- headers: buildHeaders(this.apiKey, 'text/event-stream'),
26
- signal,
27
- });
28
- if (!response.ok) {
29
- const details = parseErrorDetails(await response.text().catch(() => ''));
30
- throw new Error(`Open updates stream: ${details.message}`);
31
- }
32
- const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
33
- if (!contentType.includes('text/event-stream')) {
34
- throw new Error(`Open updates stream: unsupported content type '${contentType || 'unknown'}'`);
35
- }
36
- if (!response.body) {
37
- throw new Error('Open updates stream: response did not include a body');
38
- }
39
- const reader = response.body.getReader();
40
- const decoder = new TextDecoder();
41
- let buffer = '';
42
- let eventName = 'message';
43
- const dataLines = [];
44
- const flushEvent = () => {
45
- if (dataLines.length === 0) {
46
- eventName = 'message';
47
- return null;
48
- }
49
- const raw = dataLines.join('\n');
50
- dataLines.length = 0;
51
- const currentEventName = eventName;
52
- eventName = 'message';
53
- let parsed;
54
- try {
55
- parsed = JSON.parse(raw);
56
- }
57
- catch {
58
- return null;
59
- }
60
- if (!parsed || typeof parsed !== 'object') {
61
- return null;
62
- }
63
- if (currentEventName === 'connected') {
64
- return null;
65
- }
66
- const normalized = UpdateEventSchema.safeParse(parsed);
67
- return normalized.success ? normalized.data : null;
68
- };
69
- try {
70
- while (!signal?.aborted) {
71
- const { done, value } = await reader.read();
72
- if (done)
73
- break;
74
- buffer += decoder.decode(value, { stream: true });
75
- while (true) {
76
- const newlineIndex = buffer.indexOf('\n');
77
- if (newlineIndex < 0)
78
- break;
79
- let line = buffer.slice(0, newlineIndex);
80
- buffer = buffer.slice(newlineIndex + 1);
81
- if (line.endsWith('\r')) {
82
- line = line.slice(0, -1);
83
- }
84
- if (line.length === 0) {
85
- const update = flushEvent();
86
- if (update) {
87
- yield update;
88
- }
89
- continue;
90
- }
91
- if (line.startsWith(':'))
92
- continue;
93
- const separator = line.indexOf(':');
94
- const field = separator >= 0 ? line.slice(0, separator) : line;
95
- const rawValue = separator >= 0 ? line.slice(separator + 1) : '';
96
- const valueText = rawValue.startsWith(' ') ? rawValue.slice(1) : rawValue;
97
- if (field === 'event') {
98
- eventName = valueText;
99
- continue;
100
- }
101
- if (field === 'data') {
102
- dataLines.push(valueText);
103
- }
104
- }
105
- }
106
- }
107
- finally {
108
- try {
109
- reader.releaseLock();
110
- }
111
- catch {
112
- // no-op
113
- }
114
- }
115
- }
116
- async issueToken() {
117
- const response = await fetch(`${this.baseUrl}/updates/token`, {
118
- method: 'POST',
119
- headers: buildHeaders(this.apiKey, 'application/json'),
120
- });
121
- if (!response.ok) {
122
- const details = parseErrorDetails(await response.text().catch(() => ''));
123
- throw new Error(`Create updates token: ${details.message}`);
124
- }
125
- const payload = await parseJsonResponse(response, 'Create updates token');
126
- return payload.token;
127
- }
128
- }
@@ -1 +0,0 @@
1
- export * from './client.js';
@@ -1 +0,0 @@
1
- export * from './client.js';
@@ -1,39 +0,0 @@
1
- export declare const DEFAULT_TIMEOUT_MS = 30000;
2
- export declare const LONG_TIMEOUT_MS = 120000;
3
- /**
4
- * Safely parse JSON response from a fetch Response.
5
- * Throws a descriptive error if parsing fails.
6
- *
7
- * @param response - The fetch Response object
8
- * @param context - Context string for error messages (e.g., "Create session", "RPC browser.newPage")
9
- * @returns Parsed JSON data
10
- * @throws Error if JSON parsing fails
11
- */
12
- export declare function parseJsonResponse<T>(response: Response, context: string): Promise<T>;
13
- /**
14
- * Extract a readable error message from an HTTP response body.
15
- * Supports plain text and common JSON payload shapes ({ error }, { message }).
16
- */
17
- export interface ParsedHttpError {
18
- message: string;
19
- code?: string;
20
- }
21
- /**
22
- * Parse a server error body into a normalized message + optional machine code.
23
- */
24
- export declare function parseErrorDetails(bodyText: string): ParsedHttpError;
25
- /**
26
- * Backward-compatible helper for call sites that only need the message text.
27
- */
28
- export declare function parseErrorMessage(bodyText: string): string;
29
- /**
30
- * Fetch with automatic timeout using AbortController.
31
- * Throws a descriptive error if the request times out.
32
- *
33
- * @param url - The URL to fetch
34
- * @param options - Standard fetch options (headers, method, body, etc.)
35
- * @param timeoutMs - Timeout in milliseconds (default: DEFAULT_TIMEOUT_MS)
36
- * @returns The fetch Response object
37
- * @throws Error if request times out or fails
38
- */
39
- export declare function fetchWithTimeout(url: string, options?: RequestInit, timeoutMs?: number): Promise<Response>;
@@ -1,88 +0,0 @@
1
- // ============================================================================
2
- // HTTP Utilities - Shared utilities for HTTP requests
3
- // ============================================================================
4
- import { TimeoutError } from '../errors.js';
5
- import * as telemetry from '../telemetry.js';
6
- // Default timeout for HTTP requests (30 seconds for normal, 120 seconds for long operations)
7
- export const DEFAULT_TIMEOUT_MS = 30000;
8
- export const LONG_TIMEOUT_MS = 120000;
9
- /**
10
- * Safely parse JSON response from a fetch Response.
11
- * Throws a descriptive error if parsing fails.
12
- *
13
- * @param response - The fetch Response object
14
- * @param context - Context string for error messages (e.g., "Create session", "RPC browser.newPage")
15
- * @returns Parsed JSON data
16
- * @throws Error if JSON parsing fails
17
- */
18
- export async function parseJsonResponse(response, context) {
19
- try {
20
- return (await response.json());
21
- }
22
- catch (err) {
23
- throw new Error(`${context}: Failed to parse response as JSON - ${err instanceof Error ? err.message : err}`);
24
- }
25
- }
26
- /**
27
- * Parse a server error body into a normalized message + optional machine code.
28
- */
29
- export function parseErrorDetails(bodyText) {
30
- const text = bodyText.trim();
31
- if (!text)
32
- return { message: 'Unknown error' };
33
- try {
34
- const parsed = JSON.parse(text);
35
- if (typeof parsed === 'string' && parsed.trim())
36
- return { message: parsed.trim() };
37
- if (parsed && typeof parsed === 'object') {
38
- const record = parsed;
39
- const message = (typeof record.error === 'string' && record.error.trim()) ||
40
- (typeof record.message === 'string' && record.message.trim()) ||
41
- text;
42
- const code = typeof record.code === 'string' && record.code.trim() ? record.code.trim() : undefined;
43
- return { message, code };
44
- }
45
- }
46
- catch {
47
- // Fall through to raw text if it's not JSON
48
- }
49
- return { message: text };
50
- }
51
- /**
52
- * Backward-compatible helper for call sites that only need the message text.
53
- */
54
- export function parseErrorMessage(bodyText) {
55
- return parseErrorDetails(bodyText).message;
56
- }
57
- /**
58
- * Fetch with automatic timeout using AbortController.
59
- * Throws a descriptive error if the request times out.
60
- *
61
- * @param url - The URL to fetch
62
- * @param options - Standard fetch options (headers, method, body, etc.)
63
- * @param timeoutMs - Timeout in milliseconds (default: DEFAULT_TIMEOUT_MS)
64
- * @returns The fetch Response object
65
- * @throws Error if request times out or fails
66
- */
67
- export async function fetchWithTimeout(url, options = {}, timeoutMs = DEFAULT_TIMEOUT_MS) {
68
- const controller = new AbortController();
69
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
70
- try {
71
- const response = await fetch(url, {
72
- ...options,
73
- signal: controller.signal,
74
- });
75
- return response;
76
- }
77
- catch (err) {
78
- if (err instanceof Error && err.name === 'AbortError') {
79
- const timeoutErr = new TimeoutError(`Request timed out after ${timeoutMs}ms`, { timeoutMs });
80
- telemetry.captureError(timeoutErr, { url, timeoutMs });
81
- throw timeoutErr;
82
- }
83
- throw err;
84
- }
85
- finally {
86
- clearTimeout(timeoutId);
87
- }
88
- }
@@ -1,4 +0,0 @@
1
- export * from './http.js';
2
- export * from './schema.js';
3
- export * from './logger.js';
4
- export * from './url.js';
@@ -1,4 +0,0 @@
1
- export * from './http.js';
2
- export * from './schema.js';
3
- export * from './logger.js';
4
- export * from './url.js';
@@ -1,27 +0,0 @@
1
- /**
2
- * Log levels for the SDK logger.
3
- */
4
- export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
5
- /**
6
- * Log handler function type.
7
- */
8
- export type LogHandler = (level: LogLevel, message: string, ...args: unknown[]) => void;
9
- /**
10
- * SDK Logger - call methods directly or configure via setLogLevel/setLogHandler.
11
- */
12
- export declare const logger: {
13
- debug: (message: string, ...args: unknown[]) => void;
14
- info: (message: string, ...args: unknown[]) => void;
15
- warn: (message: string, ...args: unknown[]) => void;
16
- error: (message: string, ...args: unknown[]) => void;
17
- /**
18
- * Set the minimum log level.
19
- * Levels: 'debug' | 'info' | 'warn' | 'error' | 'silent'
20
- */
21
- setLevel: (level: LogLevel) => void;
22
- /**
23
- * Set a custom log handler.
24
- * Useful for integrating with your application's logging system.
25
- */
26
- setHandler: (handler: LogHandler) => void;
27
- };
@@ -1,74 +0,0 @@
1
- // ============================================================================
2
- // SDK Logger - Lightweight logging for debugging
3
- // ============================================================================
4
- /**
5
- * Default log handler that uses console methods.
6
- */
7
- const defaultHandler = (level, message, ...args) => {
8
- if (level === 'silent')
9
- return;
10
- const prefix = `[bctrl-sdk]`;
11
- switch (level) {
12
- case 'debug':
13
- console.debug(prefix, message, ...args);
14
- break;
15
- case 'info':
16
- console.info(prefix, message, ...args);
17
- break;
18
- case 'warn':
19
- console.warn(prefix, message, ...args);
20
- break;
21
- case 'error':
22
- console.error(prefix, message, ...args);
23
- break;
24
- }
25
- };
26
- const config = {
27
- level: process.env.BCTRL_LOG_LEVEL || 'warn',
28
- handler: defaultHandler,
29
- };
30
- const levelOrder = {
31
- debug: 0,
32
- info: 1,
33
- warn: 2,
34
- error: 3,
35
- silent: 4,
36
- };
37
- function shouldLog(level) {
38
- return levelOrder[level] >= levelOrder[config.level];
39
- }
40
- /**
41
- * SDK Logger - call methods directly or configure via setLogLevel/setLogHandler.
42
- */
43
- export const logger = {
44
- debug: (message, ...args) => {
45
- if (shouldLog('debug'))
46
- config.handler('debug', message, ...args);
47
- },
48
- info: (message, ...args) => {
49
- if (shouldLog('info'))
50
- config.handler('info', message, ...args);
51
- },
52
- warn: (message, ...args) => {
53
- if (shouldLog('warn'))
54
- config.handler('warn', message, ...args);
55
- },
56
- error: (message, ...args) => {
57
- if (shouldLog('error'))
58
- config.handler('error', message, ...args);
59
- },
60
- /**
61
- * Set the minimum log level.
62
- * Levels: 'debug' | 'info' | 'warn' | 'error' | 'silent'
63
- */
64
- setLevel: (level) => {
65
- config.level = level;
66
- },
67
- /**
68
- * Set a custom log handler.
69
- * Useful for integrating with your application's logging system.
70
- */
71
- setHandler: (handler) => {
72
- config.handler = handler;
73
- },
74
- };
@@ -1,17 +0,0 @@
1
- /**
2
- * Schema utilities for converting Zod schemas to JSON Schema.
3
- * Allows SDK users to pass Zod schemas directly, which are converted
4
- * to JSON Schema for transmission over HTTP.
5
- */
6
- import type { ZodType } from 'zod';
7
- /**
8
- * Check if a value is a Zod schema.
9
- * Zod 4 schemas have _zod property and toJSONSchema method.
10
- */
11
- export declare function isZodSchema(value: unknown): value is ZodType;
12
- /**
13
- * Convert a schema (Zod or JSON Schema) to JSON Schema format.
14
- * If already a JSON Schema object, returns as-is.
15
- * If a Zod schema, converts using Zod 4's native toJSONSchema().
16
- */
17
- export declare function toJsonSchema(schema: unknown): Record<string, unknown>;
@@ -1,31 +0,0 @@
1
- /**
2
- * Schema utilities for converting Zod schemas to JSON Schema.
3
- * Allows SDK users to pass Zod schemas directly, which are converted
4
- * to JSON Schema for transmission over HTTP.
5
- */
6
- /**
7
- * Check if a value is a Zod schema.
8
- * Zod 4 schemas have _zod property and toJSONSchema method.
9
- */
10
- export function isZodSchema(value) {
11
- return (value !== null &&
12
- typeof value === 'object' &&
13
- '_zod' in value &&
14
- typeof value.toJSONSchema === 'function');
15
- }
16
- /**
17
- * Convert a schema (Zod or JSON Schema) to JSON Schema format.
18
- * If already a JSON Schema object, returns as-is.
19
- * If a Zod schema, converts using Zod 4's native toJSONSchema().
20
- */
21
- export function toJsonSchema(schema) {
22
- if (isZodSchema(schema)) {
23
- // Use Zod 4's native toJSONSchema method
24
- const result = schema.toJSONSchema();
25
- // Remove $schema wrapper if present
26
- const { $schema, ...jsonSchema } = result;
27
- return jsonSchema;
28
- }
29
- // Assume it's already a JSON Schema object
30
- return schema;
31
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Remove a single trailing slash from a URL-like string.
3
- * Preserves previous behavior of `.replace(/\/$/, '')`.
4
- */
5
- export declare function stripTrailingSlash(value: string): string;
package/dist/utils/url.js DELETED
@@ -1,7 +0,0 @@
1
- /**
2
- * Remove a single trailing slash from a URL-like string.
3
- * Preserves previous behavior of `.replace(/\/$/, '')`.
4
- */
5
- export function stripTrailingSlash(value) {
6
- return value.endsWith('/') ? value.slice(0, -1) : value;
7
- }
@@ -1,43 +0,0 @@
1
- import type { VaultCredential, VaultCredentialInput, VaultCredentialMeta } from '../contracts/vault.js';
2
- type VaultListKeyOptions = {
3
- prefix?: string;
4
- };
5
- type VaultListMetaOptions = {
6
- meta: true;
7
- prefix?: string;
8
- origin?: string;
9
- hasTotp?: boolean;
10
- limit?: number;
11
- };
12
- export declare class VaultClient {
13
- private readonly baseUrl;
14
- private readonly apiKey?;
15
- private readonly sessionId?;
16
- constructor(baseUrl: string, apiKey?: string | undefined, sessionId?: string | undefined);
17
- private headers;
18
- /**
19
- * Get a credential from the vault.
20
- * Returns null if not found.
21
- */
22
- get(key: string): Promise<VaultCredential | null>;
23
- /**
24
- * Set (create/update) a credential in the vault.
25
- */
26
- set(key: string, credential: VaultCredentialInput): Promise<void>;
27
- /**
28
- * Delete a credential from the vault.
29
- */
30
- delete(key: string): Promise<void>;
31
- /**
32
- * List credential keys with optional prefix.
33
- */
34
- list(): Promise<string[]>;
35
- list(prefix: string): Promise<string[]>;
36
- list(options: VaultListKeyOptions): Promise<string[]>;
37
- list(options: VaultListMetaOptions): Promise<VaultCredentialMeta[]>;
38
- /**
39
- * Get current TOTP code for a credential.
40
- */
41
- totp(key: string): Promise<string>;
42
- }
43
- export {};
@@ -1,123 +0,0 @@
1
- /**
2
- * VaultClient — SDK client for vault credential management.
3
- *
4
- * Thin HTTP client that mirrors the control plane vault API.
5
- * Same pattern as StorageClient.
6
- */
7
- import { fetchWithTimeout, parseJsonResponse } from '../utils/http.js';
8
- import { SDK_VERSION } from '../version.js';
9
- // ============================================================================
10
- // VaultClient
11
- // ============================================================================
12
- export class VaultClient {
13
- baseUrl;
14
- apiKey;
15
- sessionId;
16
- constructor(baseUrl, apiKey, sessionId) {
17
- this.baseUrl = baseUrl;
18
- this.apiKey = apiKey;
19
- this.sessionId = sessionId;
20
- }
21
- headers(withJsonBody = false) {
22
- const h = {
23
- 'x-sdk-version': SDK_VERSION,
24
- };
25
- if (withJsonBody)
26
- h['Content-Type'] = 'application/json';
27
- if (this.apiKey)
28
- h['Authorization'] = `Bearer ${this.apiKey}`;
29
- if (this.sessionId)
30
- h['x-session-id'] = this.sessionId;
31
- return h;
32
- }
33
- /**
34
- * Get a credential from the vault.
35
- * Returns null if not found.
36
- */
37
- async get(key) {
38
- const res = await fetchWithTimeout(`${this.baseUrl}/vault/${encodeVaultKey(key)}`, {
39
- headers: this.headers(),
40
- });
41
- if (res.status === 404)
42
- return null;
43
- if (!res.ok)
44
- throw new Error(`Vault get failed: ${await res.text()}`);
45
- return parseJsonResponse(res, 'Vault get');
46
- }
47
- /**
48
- * Set (create/update) a credential in the vault.
49
- */
50
- async set(key, credential) {
51
- const res = await fetchWithTimeout(`${this.baseUrl}/vault/${encodeVaultKey(key)}`, {
52
- method: 'PUT',
53
- headers: this.headers(true),
54
- body: JSON.stringify(credential),
55
- });
56
- if (!res.ok)
57
- throw new Error(`Vault set failed: ${await res.text()}`);
58
- }
59
- /**
60
- * Delete a credential from the vault.
61
- */
62
- async delete(key) {
63
- const res = await fetchWithTimeout(`${this.baseUrl}/vault/${encodeVaultKey(key)}`, {
64
- method: 'DELETE',
65
- headers: this.headers(),
66
- });
67
- if (!res.ok)
68
- throw new Error(`Vault delete failed: ${await res.text()}`);
69
- }
70
- async list(input) {
71
- const params = new URLSearchParams();
72
- if (typeof input === 'string') {
73
- params.set('prefix', input);
74
- }
75
- else if (input) {
76
- if ('meta' in input && input.meta === true) {
77
- params.set('meta', '1');
78
- if (input.prefix)
79
- params.set('prefix', input.prefix);
80
- if (input.origin)
81
- params.set('origin', input.origin);
82
- if (typeof input.hasTotp === 'boolean')
83
- params.set('hasTotp', String(input.hasTotp));
84
- if (typeof input.limit === 'number')
85
- params.set('limit', String(input.limit));
86
- }
87
- else if (input.prefix) {
88
- params.set('prefix', input.prefix);
89
- }
90
- }
91
- const query = params.toString();
92
- const suffix = query ? `?${query}` : '';
93
- const res = await fetchWithTimeout(`${this.baseUrl}/vault${suffix}`, {
94
- headers: this.headers(),
95
- });
96
- if (!res.ok)
97
- throw new Error(`Vault list failed: ${await res.text()}`);
98
- if (typeof input === 'object' && input && 'meta' in input && input.meta === true) {
99
- const data = await parseJsonResponse(res, 'Vault list (metadata)');
100
- return data.items;
101
- }
102
- const data = await parseJsonResponse(res, 'Vault list');
103
- return data.keys;
104
- }
105
- /**
106
- * Get current TOTP code for a credential.
107
- */
108
- async totp(key) {
109
- const res = await fetchWithTimeout(`${this.baseUrl}/vault/${encodeVaultKey(key)}/totp`, {
110
- headers: this.headers(),
111
- });
112
- if (!res.ok)
113
- throw new Error(`Vault TOTP failed: ${await res.text()}`);
114
- const data = await parseJsonResponse(res, 'Vault TOTP');
115
- return data.code;
116
- }
117
- }
118
- /**
119
- * Encode each segment of a slash-separated vault key.
120
- */
121
- function encodeVaultKey(key) {
122
- return key.split('/').map(encodeURIComponent).join('/');
123
- }
@@ -1 +0,0 @@
1
- export { VaultClient } from './client.js';
@@ -1 +0,0 @@
1
- export { VaultClient } from './client.js';