@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,29 +0,0 @@
1
- /**
2
- * Internal SDK transport and handle helpers.
3
- *
4
- * These are SDK implementation details used by sessions, namespaces, and
5
- * generated driver classes. They intentionally live inside the SDK so the
6
- * public package does not depend on shared schema helpers for its own runtime.
7
- */
8
- function hasHandleId(value) {
9
- return (value !== null &&
10
- typeof value === 'object' &&
11
- 'handleId' in value &&
12
- typeof value.handleId === 'string');
13
- }
14
- export function extractHandleId(value) {
15
- if (!value)
16
- return undefined;
17
- if (typeof value === 'string')
18
- return value;
19
- return value.handleId;
20
- }
21
- export function toHandleRef(value) {
22
- if (hasHandleId(value)) {
23
- return { __bctrl_handle_id: value.handleId };
24
- }
25
- return value;
26
- }
27
- export function serializeFunctionSource(value) {
28
- return typeof value === 'function' ? Function.prototype.toString.call(value) : value;
29
- }
@@ -1 +0,0 @@
1
- export * from './drivers/playwright/index.js';
@@ -1,2 +0,0 @@
1
- // Playwright driver entrypoint.
2
- export * from './drivers/playwright/index.js';
@@ -1 +0,0 @@
1
- export * from './drivers/puppeteer/index.js';
package/dist/puppeteer.js DELETED
@@ -1,2 +0,0 @@
1
- // Puppeteer driver entrypoint.
2
- export * from './drivers/puppeteer/index.js';
@@ -1 +0,0 @@
1
- export * from './drivers/selenium/index.js';
package/dist/selenium.js DELETED
@@ -1,2 +0,0 @@
1
- // Selenium driver entrypoint.
2
- export * from './drivers/selenium/index.js';
@@ -1 +0,0 @@
1
- export * from './drivers/stagehand/index.js';
package/dist/stagehand.js DELETED
@@ -1,2 +0,0 @@
1
- // Stagehand driver entrypoint.
2
- export * from './drivers/stagehand/index.js';
@@ -1,151 +0,0 @@
1
- import { type StorageBrowseResponse, type StorageReadResponse } from '../contracts/storage.js';
2
- export type StorageBrowseResult = StorageBrowseResponse;
3
- export type StorageBrowseFile = StorageBrowseResult['files'][number];
4
- export type StorageReadResult = StorageReadResponse;
5
- export interface UploadResult {
6
- success: boolean;
7
- key: string;
8
- filename: string;
9
- }
10
- export interface PresignedUrlResult {
11
- url: string;
12
- key?: string;
13
- expiresIn: number;
14
- }
15
- export interface StorageObject {
16
- id: string;
17
- workspace: string;
18
- runtimeId: string | null;
19
- source: string;
20
- driver: string | null;
21
- target: string | null;
22
- logicalPath: string;
23
- filename: string;
24
- contentType: string;
25
- sizeBytes: number;
26
- createdAt: string | null;
27
- expiresAt: string | null;
28
- metadata: Record<string, unknown> | null;
29
- }
30
- export interface ListObjectsOptions {
31
- workspace?: string;
32
- runtimeId?: string;
33
- source?: string;
34
- driver?: string;
35
- target?: string;
36
- pathPrefix?: string;
37
- limit?: number;
38
- offset?: number;
39
- }
40
- export interface ListObjectsResult {
41
- objects: StorageObject[];
42
- }
43
- export interface UploadObjectOptions {
44
- workspace?: string;
45
- path?: string;
46
- source?: string;
47
- runtimeId?: string;
48
- driver?: string;
49
- target?: string;
50
- filename?: string;
51
- }
52
- export interface UploadObjectResult {
53
- id: string;
54
- workspace: string;
55
- logicalPath: string;
56
- objectKey: string;
57
- filename: string;
58
- sizeBytes: number;
59
- contentType: string;
60
- expiresAt: string | null;
61
- }
62
- export interface StorageBrowseOptions {
63
- prefix?: string;
64
- cursor?: string;
65
- limit?: number;
66
- }
67
- /**
68
- * Client for interacting with workspace storage.
69
- */
70
- export declare class StorageClient {
71
- private readonly baseUrl;
72
- private readonly workspace;
73
- private readonly apiKey?;
74
- private readonly sessionId?;
75
- constructor(baseUrl: string, workspace: string, apiKey?: string | undefined, sessionId?: string | undefined);
76
- /**
77
- * Get headers for API requests.
78
- */
79
- private getHeaders;
80
- /**
81
- * Clone this client for another workspace while preserving auth/session binding.
82
- */
83
- forWorkspace(workspace: string): StorageClient;
84
- /**
85
- * Build URL for object-catalog endpoints.
86
- */
87
- private buildObjectsUrl;
88
- private resolveWorkspace;
89
- private encodePath;
90
- private buildWorkspaceUrl;
91
- private toBlob;
92
- /**
93
- * Upload a file to workspace storage.
94
- *
95
- * @param filePath - Logical path in storage (e.g., "uploads/document.pdf")
96
- * @param data - File data as Buffer, Uint8Array, or Blob
97
- * @param filename - Optional filename (defaults to last part of filePath)
98
- */
99
- upload(filePath: string, data: Buffer | Uint8Array | Blob, filename?: string): Promise<UploadResult>;
100
- /**
101
- * Upload a file and register it in the storage object catalog.
102
- *
103
- * @param data - File data as Buffer, Uint8Array, or Blob
104
- * @param options - Metadata and upload options
105
- */
106
- uploadObject(data: Buffer | Uint8Array | Blob, options?: UploadObjectOptions): Promise<UploadObjectResult>;
107
- /**
108
- * Get a file by logical path as raw bytes.
109
- */
110
- get(filePath: string): Promise<Buffer>;
111
- /**
112
- * Get a presigned URL for direct download by logical path.
113
- */
114
- getDownloadUrl(filePath: string): Promise<string>;
115
- /**
116
- * Browse files/folders by logical prefix (hierarchical listing with cursor pagination).
117
- */
118
- browse(options?: StorageBrowseOptions): Promise<StorageBrowseResult>;
119
- /**
120
- * Read a UTF-8 text preview by logical path.
121
- */
122
- read(filePath: string, maxBytes?: number): Promise<StorageReadResult>;
123
- /**
124
- * List object metadata from the storage catalog.
125
- */
126
- listObjects(options?: ListObjectsOptions): Promise<StorageObject[]>;
127
- /**
128
- * Download an object by catalog ID.
129
- */
130
- downloadObject(id: string): Promise<Buffer>;
131
- /**
132
- * Get a presigned URL for direct download by object ID.
133
- */
134
- getObjectDownloadUrl(id: string): Promise<string>;
135
- /**
136
- * Get all downloads as a ZIP file.
137
- */
138
- getDownloadsZip(): Promise<Buffer>;
139
- /**
140
- * Delete a file by logical path.
141
- */
142
- delete(filePath: string): Promise<void>;
143
- /**
144
- * Delete an object by catalog ID.
145
- */
146
- deleteObject(id: string): Promise<void>;
147
- /**
148
- * Delete all files for this workspace.
149
- */
150
- deleteAll(): Promise<number>;
151
- }
@@ -1,329 +0,0 @@
1
- // ============================================================================
2
- // Storage Client - SDK client for R2 storage operations
3
- // ============================================================================
4
- import { StorageBrowseResponseSchema, StorageReadResponseSchema, } from '../contracts/storage.js';
5
- import { SDK_VERSION } from '../version.js';
6
- import { fetchWithTimeout, parseJsonResponse, LONG_TIMEOUT_MS } from '../utils/http.js';
7
- import { stripTrailingSlash } from '../utils/url.js';
8
- // ============================================================================
9
- // Storage Client
10
- // ============================================================================
11
- /**
12
- * Client for interacting with workspace storage.
13
- */
14
- export class StorageClient {
15
- baseUrl;
16
- workspace;
17
- apiKey;
18
- sessionId;
19
- constructor(baseUrl, workspace, apiKey, sessionId) {
20
- this.baseUrl = baseUrl;
21
- this.workspace = workspace;
22
- this.apiKey = apiKey;
23
- this.sessionId = sessionId;
24
- }
25
- /**
26
- * Get headers for API requests.
27
- */
28
- getHeaders(contentType) {
29
- const headers = {
30
- 'x-sdk-version': SDK_VERSION,
31
- };
32
- if (this.apiKey) {
33
- headers['Authorization'] = `Bearer ${this.apiKey}`;
34
- }
35
- if (this.sessionId) {
36
- headers['x-session-id'] = this.sessionId;
37
- }
38
- if (contentType) {
39
- headers['Content-Type'] = contentType;
40
- }
41
- return headers;
42
- }
43
- /**
44
- * Clone this client for another workspace while preserving auth/session binding.
45
- */
46
- forWorkspace(workspace) {
47
- return new StorageClient(this.baseUrl, workspace, this.apiKey, this.sessionId);
48
- }
49
- /**
50
- * Build URL for object-catalog endpoints.
51
- */
52
- buildObjectsUrl(path = '') {
53
- const base = stripTrailingSlash(this.baseUrl);
54
- return `${base}/storage/objects${path}`;
55
- }
56
- resolveWorkspace(workspace) {
57
- const value = (workspace || this.workspace).trim();
58
- if (!value) {
59
- throw new Error('Workspace is required');
60
- }
61
- return value;
62
- }
63
- encodePath(filePath) {
64
- return filePath
65
- .split('/')
66
- .filter((segment) => segment.length > 0)
67
- .map((segment) => encodeURIComponent(segment))
68
- .join('/');
69
- }
70
- buildWorkspaceUrl(path, workspace, params = {}) {
71
- const query = new URLSearchParams({ workspace });
72
- for (const [key, value] of Object.entries(params)) {
73
- if (value === undefined || value === null || value === '')
74
- continue;
75
- query.set(key, String(value));
76
- }
77
- return this.buildObjectsUrl(`${path}?${query.toString()}`);
78
- }
79
- toBlob(data, contentType) {
80
- if (data instanceof Blob)
81
- return data;
82
- const copy = new Uint8Array(data);
83
- return new Blob([copy], contentType ? { type: contentType } : undefined);
84
- }
85
- /**
86
- * Upload a file to workspace storage.
87
- *
88
- * @param filePath - Logical path in storage (e.g., "uploads/document.pdf")
89
- * @param data - File data as Buffer, Uint8Array, or Blob
90
- * @param filename - Optional filename (defaults to last part of filePath)
91
- */
92
- async upload(filePath, data, filename) {
93
- const workspace = this.resolveWorkspace();
94
- const uploaded = await this.uploadObject(data, {
95
- workspace,
96
- path: filePath,
97
- source: 'upload',
98
- filename,
99
- });
100
- return {
101
- success: true,
102
- key: uploaded.objectKey,
103
- filename: uploaded.filename,
104
- };
105
- }
106
- /**
107
- * Upload a file and register it in the storage object catalog.
108
- *
109
- * @param data - File data as Buffer, Uint8Array, or Blob
110
- * @param options - Metadata and upload options
111
- */
112
- async uploadObject(data, options = {}) {
113
- const formData = new FormData();
114
- const workspace = this.resolveWorkspace(options.workspace);
115
- const logicalPath = options.path?.trim() || undefined;
116
- const source = options.source?.trim() || 'upload';
117
- const filename = options.filename?.trim() ||
118
- (logicalPath ? logicalPath.split('/').pop() : null) ||
119
- 'file';
120
- // Multipart parsing is sequential; send metadata fields before file.
121
- formData.append('workspace', workspace);
122
- formData.append('source', source);
123
- if (logicalPath)
124
- formData.append('path', logicalPath);
125
- if (options.runtimeId)
126
- formData.append('runtimeId', options.runtimeId);
127
- if (options.driver)
128
- formData.append('driver', options.driver);
129
- if (options.target)
130
- formData.append('target', options.target);
131
- formData.append('file', this.toBlob(data), filename);
132
- const response = await fetchWithTimeout(this.buildObjectsUrl(''), {
133
- method: 'POST',
134
- headers: this.getHeaders(),
135
- body: formData,
136
- }, LONG_TIMEOUT_MS);
137
- if (!response.ok) {
138
- const error = await response.json().catch(() => ({ error: response.statusText }));
139
- throw new Error(`Upload object failed: ${error.error || response.statusText}`);
140
- }
141
- return parseJsonResponse(response, 'Upload storage object');
142
- }
143
- /**
144
- * Get a file by logical path as raw bytes.
145
- */
146
- async get(filePath) {
147
- const workspace = this.resolveWorkspace();
148
- const encodedPath = this.encodePath(filePath);
149
- const response = await fetchWithTimeout(this.buildWorkspaceUrl(`/by-path/get/${encodedPath}`, workspace), {
150
- method: 'GET',
151
- headers: this.getHeaders(),
152
- }, LONG_TIMEOUT_MS);
153
- if (!response.ok) {
154
- throw new Error(`Get failed: ${response.statusText}`);
155
- }
156
- const arrayBuffer = await response.arrayBuffer();
157
- return Buffer.from(arrayBuffer);
158
- }
159
- /**
160
- * Get a presigned URL for direct download by logical path.
161
- */
162
- async getDownloadUrl(filePath) {
163
- const workspace = this.resolveWorkspace();
164
- const encodedPath = this.encodePath(filePath);
165
- const response = await fetchWithTimeout(this.buildWorkspaceUrl(`/by-path/presign-download/${encodedPath}`, workspace), {
166
- method: 'GET',
167
- headers: this.getHeaders(),
168
- });
169
- if (!response.ok) {
170
- throw new Error(`Failed to get download URL: ${response.statusText}`);
171
- }
172
- const { url } = await parseJsonResponse(response, 'Get download URL');
173
- return url;
174
- }
175
- /**
176
- * Browse files/folders by logical prefix (hierarchical listing with cursor pagination).
177
- */
178
- async browse(options = {}) {
179
- const workspace = this.resolveWorkspace();
180
- const response = await fetchWithTimeout(this.buildWorkspaceUrl('/by-path/browse', workspace, {
181
- prefix: options.prefix,
182
- cursor: options.cursor,
183
- limit: options.limit,
184
- }), {
185
- method: 'GET',
186
- headers: this.getHeaders(),
187
- });
188
- if (!response.ok) {
189
- throw new Error(`Browse failed: ${response.statusText}`);
190
- }
191
- const data = await parseJsonResponse(response, 'Browse files');
192
- return StorageBrowseResponseSchema.parse(data);
193
- }
194
- /**
195
- * Read a UTF-8 text preview by logical path.
196
- */
197
- async read(filePath, maxBytes) {
198
- const workspace = this.resolveWorkspace();
199
- const encodedPath = this.encodePath(filePath);
200
- const response = await fetchWithTimeout(this.buildWorkspaceUrl(`/by-path/read/${encodedPath}`, workspace, {
201
- maxBytes,
202
- }), {
203
- method: 'GET',
204
- headers: this.getHeaders(),
205
- });
206
- if (!response.ok) {
207
- throw new Error(`Read failed: ${response.statusText}`);
208
- }
209
- const data = await parseJsonResponse(response, 'Read file text preview');
210
- return StorageReadResponseSchema.parse(data);
211
- }
212
- /**
213
- * List object metadata from the storage catalog.
214
- */
215
- async listObjects(options = {}) {
216
- const workspace = this.resolveWorkspace(options.workspace);
217
- const params = new URLSearchParams({ workspace });
218
- if (options.runtimeId)
219
- params.set('runtimeId', options.runtimeId);
220
- if (options.source)
221
- params.set('source', options.source);
222
- if (options.driver)
223
- params.set('driver', options.driver);
224
- if (options.target)
225
- params.set('target', options.target);
226
- if (options.pathPrefix)
227
- params.set('pathPrefix', options.pathPrefix);
228
- if (typeof options.limit === 'number')
229
- params.set('limit', String(options.limit));
230
- if (typeof options.offset === 'number')
231
- params.set('offset', String(options.offset));
232
- const response = await fetchWithTimeout(this.buildObjectsUrl(`?${params.toString()}`), {
233
- method: 'GET',
234
- headers: this.getHeaders(),
235
- });
236
- if (!response.ok) {
237
- throw new Error(`List objects failed: ${response.statusText}`);
238
- }
239
- const { objects } = await parseJsonResponse(response, 'List storage objects');
240
- return objects;
241
- }
242
- /**
243
- * Download an object by catalog ID.
244
- */
245
- async downloadObject(id) {
246
- const response = await fetchWithTimeout(this.buildObjectsUrl(`/${encodeURIComponent(id)}/download`), {
247
- method: 'GET',
248
- headers: this.getHeaders(),
249
- }, LONG_TIMEOUT_MS);
250
- if (!response.ok) {
251
- throw new Error(`Object download failed: ${response.statusText}`);
252
- }
253
- const arrayBuffer = await response.arrayBuffer();
254
- return Buffer.from(arrayBuffer);
255
- }
256
- /**
257
- * Get a presigned URL for direct download by object ID.
258
- */
259
- async getObjectDownloadUrl(id) {
260
- const response = await fetchWithTimeout(this.buildObjectsUrl(`/${encodeURIComponent(id)}/presign-download`), {
261
- method: 'GET',
262
- headers: this.getHeaders(),
263
- });
264
- if (!response.ok) {
265
- throw new Error(`Failed to get object download URL: ${response.statusText}`);
266
- }
267
- const { url } = await parseJsonResponse(response, 'Get object download URL');
268
- return url;
269
- }
270
- /**
271
- * Get all downloads as a ZIP file.
272
- */
273
- async getDownloadsZip() {
274
- const workspace = this.resolveWorkspace();
275
- const response = await fetchWithTimeout(this.buildWorkspaceUrl('/downloads', workspace), {
276
- method: 'GET',
277
- headers: this.getHeaders(),
278
- }, LONG_TIMEOUT_MS);
279
- if (!response.ok) {
280
- if (response.status === 404) {
281
- throw new Error('No downloads found');
282
- }
283
- throw new Error(`Failed to get downloads: ${response.statusText}`);
284
- }
285
- const arrayBuffer = await response.arrayBuffer();
286
- return Buffer.from(arrayBuffer);
287
- }
288
- /**
289
- * Delete a file by logical path.
290
- */
291
- async delete(filePath) {
292
- const workspace = this.resolveWorkspace();
293
- const encodedPath = this.encodePath(filePath);
294
- const response = await fetchWithTimeout(this.buildWorkspaceUrl(`/by-path/${encodedPath}`, workspace), {
295
- method: 'DELETE',
296
- headers: this.getHeaders(),
297
- });
298
- if (!response.ok) {
299
- throw new Error(`Delete failed: ${response.statusText}`);
300
- }
301
- }
302
- /**
303
- * Delete an object by catalog ID.
304
- */
305
- async deleteObject(id) {
306
- const response = await fetchWithTimeout(this.buildObjectsUrl(`/${encodeURIComponent(id)}`), {
307
- method: 'DELETE',
308
- headers: this.getHeaders(),
309
- });
310
- if (!response.ok) {
311
- throw new Error(`Delete object failed: ${response.statusText}`);
312
- }
313
- }
314
- /**
315
- * Delete all files for this workspace.
316
- */
317
- async deleteAll() {
318
- const workspace = this.resolveWorkspace();
319
- const response = await fetchWithTimeout(this.buildWorkspaceUrl('', workspace), {
320
- method: 'DELETE',
321
- headers: this.getHeaders(),
322
- });
323
- if (!response.ok) {
324
- throw new Error(`Delete all failed: ${response.statusText}`);
325
- }
326
- const result = await parseJsonResponse(response, 'Delete all');
327
- return result.deletedCount;
328
- }
329
- }
@@ -1,2 +0,0 @@
1
- export { StorageClient } from './client.js';
2
- export type { StorageBrowseOptions, StorageBrowseFile, StorageBrowseResult, StorageReadResult, UploadResult, PresignedUrlResult, StorageObject, ListObjectsOptions, ListObjectsResult, UploadObjectOptions, UploadObjectResult, } from './client.js';
@@ -1,4 +0,0 @@
1
- // ============================================================================
2
- // Storage Module - SDK storage client exports
3
- // ============================================================================
4
- export { StorageClient } from './client.js';
@@ -1,18 +0,0 @@
1
- /**
2
- * Initialize the isolated Sentry client for SDK telemetry.
3
- * Idempotent — safe to call multiple times (e.g. from multiple Bctrl instances).
4
- * Uses a separate client instance to avoid conflicts with user's Sentry.
5
- */
6
- export declare function init(): void;
7
- /**
8
- * Disable telemetry. Once called, no events will be sent.
9
- */
10
- export declare function disable(): void;
11
- /**
12
- * Capture an error and send it to Sentry (if telemetry is enabled).
13
- */
14
- export declare function captureError(err: Error, context?: Record<string, unknown>): void;
15
- /**
16
- * Check if telemetry is currently enabled.
17
- */
18
- export declare function isEnabled(): boolean;
package/dist/telemetry.js DELETED
@@ -1,93 +0,0 @@
1
- // ============================================================================
2
- // SDK Telemetry - Isolated Sentry client for error tracking
3
- // ============================================================================
4
- //
5
- // Uses a dedicated Sentry client that won't conflict with the user's own Sentry.
6
- // Respects the `telemetry: false` opt-out in BctrlOptions.
7
- // Strips auth headers and sensitive data before sending events.
8
- // ============================================================================
9
- import { NodeClient, Scope, makeNodeTransport, defaultStackParser, } from '@sentry/node';
10
- import { SDK_VERSION } from './version.js';
11
- let sentryClient;
12
- let enabled = true;
13
- function isRemoteTelemetryEnabled() {
14
- return process.env.NODE_ENV !== 'development' || process.env.OBS_REMOTE === 'true';
15
- }
16
- /**
17
- * Initialize the isolated Sentry client for SDK telemetry.
18
- * Idempotent — safe to call multiple times (e.g. from multiple Bctrl instances).
19
- * Uses a separate client instance to avoid conflicts with user's Sentry.
20
- */
21
- export function init() {
22
- if (sentryClient)
23
- return;
24
- const dsn = process.env.SENTRY_DSN_SDK;
25
- if (!dsn || !enabled || !isRemoteTelemetryEnabled())
26
- return;
27
- sentryClient = new NodeClient({
28
- dsn,
29
- release: `bctrl-sdk@${SDK_VERSION}`,
30
- environment: process.env.NODE_ENV || 'production',
31
- transport: makeNodeTransport,
32
- stackParser: defaultStackParser,
33
- integrations: [],
34
- beforeSend(event) {
35
- // Strip sensitive headers and data
36
- if (event.request?.headers) {
37
- delete event.request.headers['authorization'];
38
- delete event.request.headers['x-internal-secret'];
39
- delete event.request.headers['cookie'];
40
- }
41
- // Strip any sensitive data from breadcrumbs
42
- if (event.breadcrumbs) {
43
- for (const breadcrumb of event.breadcrumbs) {
44
- if (breadcrumb.data) {
45
- delete breadcrumb.data['authorization'];
46
- delete breadcrumb.data['apiKey'];
47
- delete breadcrumb.data['password'];
48
- }
49
- }
50
- }
51
- // Tag every event with SDK version
52
- event.tags = { ...event.tags, sdkVersion: SDK_VERSION };
53
- return event;
54
- },
55
- });
56
- }
57
- /**
58
- * Disable telemetry. Once called, no events will be sent.
59
- */
60
- export function disable() {
61
- enabled = false;
62
- if (sentryClient) {
63
- sentryClient.close();
64
- sentryClient = undefined;
65
- }
66
- }
67
- /**
68
- * Capture an error and send it to Sentry (if telemetry is enabled).
69
- */
70
- export function captureError(err, context) {
71
- if (!enabled || !sentryClient)
72
- return;
73
- const scope = new Scope();
74
- scope.setClient(sentryClient);
75
- if (context) {
76
- scope.setContext('bctrl', context);
77
- if (context.endpoint)
78
- scope.setTag('endpoint', String(context.endpoint));
79
- if (context.method)
80
- scope.setTag('method', String(context.method));
81
- if (context.statusCode)
82
- scope.setTag('statusCode', String(context.statusCode));
83
- if (context.errorCode)
84
- scope.setTag('errorCode', String(context.errorCode));
85
- }
86
- scope.captureException(err);
87
- }
88
- /**
89
- * Check if telemetry is currently enabled.
90
- */
91
- export function isEnabled() {
92
- return enabled && sentryClient !== undefined;
93
- }
@@ -1,8 +0,0 @@
1
- import type { UpdateEvent } from '../contracts/public-api.js';
2
- export declare class UpdatesClient {
3
- private readonly baseUrl;
4
- private readonly apiKey;
5
- constructor(baseUrl: string, apiKey: string);
6
- stream(signal?: AbortSignal): AsyncGenerator<UpdateEvent, void, void>;
7
- private issueToken;
8
- }