@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
@@ -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';