@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,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
- }