@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.
- package/README.md +24 -29
- package/dist/bctrl.d.ts +22 -36
- package/dist/bctrl.js +40 -75
- package/dist/browsers.d.ts +24 -0
- package/dist/browsers.js +82 -0
- package/dist/errors.d.ts +49 -43
- package/dist/errors.js +83 -120
- package/dist/files.d.ts +31 -0
- package/dist/files.js +97 -0
- package/dist/http.d.ts +18 -0
- package/dist/http.js +135 -0
- package/dist/index.d.ts +9 -12
- package/dist/index.js +8 -23
- package/dist/invocations.d.ts +24 -0
- package/dist/invocations.js +66 -0
- package/dist/pagination.d.ts +2 -0
- package/dist/pagination.js +13 -0
- package/dist/runs.d.ts +38 -0
- package/dist/runs.js +99 -0
- package/dist/runtimes.d.ts +73 -0
- package/dist/runtimes.js +205 -0
- package/dist/spaces.d.ts +41 -0
- package/dist/spaces.js +96 -0
- package/dist/types.d.ts +386 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.js +27 -0
- package/dist/version.js +2 -2
- package/package.json +12 -31
- package/dist/agents/browser-use/index.d.ts +0 -1
- package/dist/agents/browser-use/index.js +0 -9
- package/dist/agents/browser-use/namespace.d.ts +0 -39
- package/dist/agents/browser-use/namespace.js +0 -93
- package/dist/agents/index.d.ts +0 -2
- package/dist/agents/index.js +0 -17
- package/dist/agents/stagehand/core.d.ts +0 -93
- package/dist/agents/stagehand/core.js +0 -144
- package/dist/agents/stagehand/index.d.ts +0 -3
- package/dist/agents/stagehand/index.js +0 -24
- package/dist/agents/stagehand/namespace.d.ts +0 -51
- package/dist/agents/stagehand/namespace.js +0 -65
- package/dist/ai-credentials/client.d.ts +0 -12
- package/dist/ai-credentials/client.js +0 -70
- package/dist/ai-credentials/index.d.ts +0 -1
- package/dist/ai-credentials/index.js +0 -1
- package/dist/base/event-binding.d.ts +0 -7
- package/dist/base/event-binding.js +0 -23
- package/dist/base/types.d.ts +0 -109
- package/dist/base/types.js +0 -4
- package/dist/browser-extensions/client.d.ts +0 -15
- package/dist/browser-extensions/client.js +0 -72
- package/dist/browser-extensions/index.d.ts +0 -2
- package/dist/browser-extensions/index.js +0 -1
- package/dist/browser-profiles/client.d.ts +0 -11
- package/dist/browser-profiles/client.js +0 -63
- package/dist/browser-profiles/index.d.ts +0 -1
- package/dist/browser-profiles/index.js +0 -1
- package/dist/captcha/index.d.ts +0 -1
- package/dist/captcha/index.js +0 -1
- package/dist/captcha/namespace.d.ts +0 -34
- package/dist/captcha/namespace.js +0 -41
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.js +0 -1
- package/dist/client/rpc.d.ts +0 -83
- package/dist/client/rpc.js +0 -354
- package/dist/config.d.ts +0 -5
- package/dist/config.js +0 -28
- package/dist/constants/browser.d.ts +0 -2
- package/dist/constants/browser.js +0 -1
- package/dist/contracts/agent-tools.d.ts +0 -45
- package/dist/contracts/agent-tools.js +0 -31
- package/dist/contracts/automation.d.ts +0 -265
- package/dist/contracts/automation.js +0 -109
- package/dist/contracts/browser-management.d.ts +0 -179
- package/dist/contracts/browser-management.js +0 -95
- package/dist/contracts/browser-use.d.ts +0 -136
- package/dist/contracts/browser-use.js +0 -93
- package/dist/contracts/captcha.d.ts +0 -114
- package/dist/contracts/captcha.js +0 -40
- package/dist/contracts/desktop.d.ts +0 -223
- package/dist/contracts/desktop.js +0 -121
- package/dist/contracts/drivers/playwright.d.ts +0 -2008
- package/dist/contracts/drivers/playwright.js +0 -2033
- package/dist/contracts/drivers/puppeteer.d.ts +0 -1221
- package/dist/contracts/drivers/puppeteer.js +0 -941
- package/dist/contracts/drivers/selenium.d.ts +0 -156
- package/dist/contracts/drivers/selenium.js +0 -61
- package/dist/contracts/drivers/stagehand.d.ts +0 -155
- package/dist/contracts/drivers/stagehand.js +0 -7
- package/dist/contracts/extensions.d.ts +0 -13
- package/dist/contracts/extensions.js +0 -9
- package/dist/contracts/index.d.ts +0 -13
- package/dist/contracts/index.js +0 -13
- package/dist/contracts/public-api.d.ts +0 -360
- package/dist/contracts/public-api.js +0 -17
- package/dist/contracts/runtime.d.ts +0 -81
- package/dist/contracts/runtime.js +0 -16
- package/dist/contracts/stagehand.d.ts +0 -253
- package/dist/contracts/stagehand.js +0 -145
- package/dist/contracts/storage.d.ts +0 -51
- package/dist/contracts/storage.js +0 -56
- package/dist/contracts/vault.d.ts +0 -119
- package/dist/contracts/vault.js +0 -112
- package/dist/contracts/version.d.ts +0 -3
- package/dist/contracts/version.js +0 -16
- package/dist/desktop.d.ts +0 -2
- package/dist/desktop.js +0 -3
- package/dist/drivers/desktop/index.d.ts +0 -65
- package/dist/drivers/desktop/index.js +0 -68
- package/dist/drivers/desktop/session.d.ts +0 -313
- package/dist/drivers/desktop/session.js +0 -432
- package/dist/drivers/playwright/event-emitter.d.ts +0 -160
- package/dist/drivers/playwright/event-emitter.js +0 -297
- package/dist/drivers/playwright/generated/api-request-context.d.ts +0 -137
- package/dist/drivers/playwright/generated/api-request-context.js +0 -154
- package/dist/drivers/playwright/generated/api-response.d.ts +0 -119
- package/dist/drivers/playwright/generated/api-response.js +0 -123
- package/dist/drivers/playwright/generated/browser-context.d.ts +0 -284
- package/dist/drivers/playwright/generated/browser-context.js +0 -458
- package/dist/drivers/playwright/generated/browser.d.ts +0 -120
- package/dist/drivers/playwright/generated/browser.js +0 -151
- package/dist/drivers/playwright/generated/clock.d.ts +0 -80
- package/dist/drivers/playwright/generated/clock.js +0 -94
- package/dist/drivers/playwright/generated/console-message.d.ts +0 -94
- package/dist/drivers/playwright/generated/console-message.js +0 -89
- package/dist/drivers/playwright/generated/coverage.d.ts +0 -57
- package/dist/drivers/playwright/generated/coverage.js +0 -66
- package/dist/drivers/playwright/generated/dialog.d.ts +0 -79
- package/dist/drivers/playwright/generated/dialog.js +0 -80
- package/dist/drivers/playwright/generated/element-handle.d.ts +0 -399
- package/dist/drivers/playwright/generated/element-handle.js +0 -501
- package/dist/drivers/playwright/generated/frame-locator.d.ts +0 -34
- package/dist/drivers/playwright/generated/frame-locator.js +0 -63
- package/dist/drivers/playwright/generated/frame.d.ts +0 -557
- package/dist/drivers/playwright/generated/frame.js +0 -634
- package/dist/drivers/playwright/generated/js-handle.d.ts +0 -72
- package/dist/drivers/playwright/generated/js-handle.js +0 -92
- package/dist/drivers/playwright/generated/keyboard.d.ts +0 -103
- package/dist/drivers/playwright/generated/keyboard.js +0 -113
- package/dist/drivers/playwright/generated/locator.d.ts +0 -795
- package/dist/drivers/playwright/generated/locator.js +0 -974
- package/dist/drivers/playwright/generated/mouse.d.ts +0 -97
- package/dist/drivers/playwright/generated/mouse.js +0 -109
- package/dist/drivers/playwright/generated/page.d.ts +0 -762
- package/dist/drivers/playwright/generated/page.js +0 -988
- package/dist/drivers/playwright/generated/touchscreen.d.ts +0 -34
- package/dist/drivers/playwright/generated/touchscreen.js +0 -37
- package/dist/drivers/playwright/generated/tracing.d.ts +0 -78
- package/dist/drivers/playwright/generated/tracing.js +0 -80
- package/dist/drivers/playwright/generated/worker.d.ts +0 -53
- package/dist/drivers/playwright/generated/worker.js +0 -59
- package/dist/drivers/playwright/index.d.ts +0 -19
- package/dist/drivers/playwright/index.js +0 -20
- package/dist/drivers/playwright/remote-base.d.ts +0 -62
- package/dist/drivers/playwright/remote-base.js +0 -86
- package/dist/drivers/playwright/types.d.ts +0 -148
- package/dist/drivers/playwright/types.js +0 -8
- package/dist/drivers/puppeteer/errors.d.ts +0 -50
- package/dist/drivers/puppeteer/errors.js +0 -71
- package/dist/drivers/puppeteer/event-emitter.d.ts +0 -145
- package/dist/drivers/puppeteer/event-emitter.js +0 -259
- package/dist/drivers/puppeteer/generated/accessibility.d.ts +0 -77
- package/dist/drivers/puppeteer/generated/accessibility.js +0 -74
- package/dist/drivers/puppeteer/generated/browser-context.d.ts +0 -116
- package/dist/drivers/puppeteer/generated/browser-context.js +0 -168
- package/dist/drivers/puppeteer/generated/browser.d.ts +0 -169
- package/dist/drivers/puppeteer/generated/browser.js +0 -246
- package/dist/drivers/puppeteer/generated/console-message.d.ts +0 -54
- package/dist/drivers/puppeteer/generated/console-message.js +0 -69
- package/dist/drivers/puppeteer/generated/coverage.d.ts +0 -49
- package/dist/drivers/puppeteer/generated/coverage.js +0 -57
- package/dist/drivers/puppeteer/generated/dialog.d.ts +0 -46
- package/dist/drivers/puppeteer/generated/dialog.js +0 -60
- package/dist/drivers/puppeteer/generated/element-handle.d.ts +0 -261
- package/dist/drivers/puppeteer/generated/element-handle.js +0 -341
- package/dist/drivers/puppeteer/generated/file-chooser.d.ts +0 -34
- package/dist/drivers/puppeteer/generated/file-chooser.js +0 -43
- package/dist/drivers/puppeteer/generated/frame.d.ts +0 -221
- package/dist/drivers/puppeteer/generated/frame.js +0 -302
- package/dist/drivers/puppeteer/generated/http-request.d.ts +0 -195
- package/dist/drivers/puppeteer/generated/http-request.js +0 -243
- package/dist/drivers/puppeteer/generated/http-response.d.ts +0 -142
- package/dist/drivers/puppeteer/generated/http-response.js +0 -169
- package/dist/drivers/puppeteer/generated/js-handle.d.ts +0 -104
- package/dist/drivers/puppeteer/generated/js-handle.js +0 -125
- package/dist/drivers/puppeteer/generated/keyboard.d.ts +0 -79
- package/dist/drivers/puppeteer/generated/keyboard.js +0 -89
- package/dist/drivers/puppeteer/generated/locator.d.ts +0 -141
- package/dist/drivers/puppeteer/generated/locator.js +0 -164
- package/dist/drivers/puppeteer/generated/mouse.d.ts +0 -74
- package/dist/drivers/puppeteer/generated/mouse.js +0 -94
- package/dist/drivers/puppeteer/generated/page.d.ts +0 -604
- package/dist/drivers/puppeteer/generated/page.js +0 -776
- package/dist/drivers/puppeteer/generated/target.d.ts +0 -105
- package/dist/drivers/puppeteer/generated/target.js +0 -123
- package/dist/drivers/puppeteer/generated/touchscreen.d.ts +0 -87
- package/dist/drivers/puppeteer/generated/touchscreen.js +0 -103
- package/dist/drivers/puppeteer/generated/tracing.d.ts +0 -38
- package/dist/drivers/puppeteer/generated/tracing.js +0 -43
- package/dist/drivers/puppeteer/generated/web-worker.d.ts +0 -63
- package/dist/drivers/puppeteer/generated/web-worker.js +0 -73
- package/dist/drivers/puppeteer/index.d.ts +0 -21
- package/dist/drivers/puppeteer/index.js +0 -23
- package/dist/drivers/puppeteer/remote-base.d.ts +0 -57
- package/dist/drivers/puppeteer/remote-base.js +0 -79
- package/dist/drivers/puppeteer/types.d.ts +0 -178
- package/dist/drivers/puppeteer/types.js +0 -8
- package/dist/drivers/selenium/driver.d.ts +0 -28
- package/dist/drivers/selenium/driver.js +0 -169
- package/dist/drivers/selenium/element.d.ts +0 -34
- package/dist/drivers/selenium/element.js +0 -73
- package/dist/drivers/selenium/index.d.ts +0 -3
- package/dist/drivers/selenium/index.js +0 -5
- package/dist/drivers/selenium/types.d.ts +0 -2
- package/dist/drivers/selenium/types.js +0 -12
- package/dist/drivers/stagehand/generated/context.d.ts +0 -127
- package/dist/drivers/stagehand/generated/context.js +0 -153
- package/dist/drivers/stagehand/generated/locator.d.ts +0 -324
- package/dist/drivers/stagehand/generated/locator.js +0 -368
- package/dist/drivers/stagehand/generated/page.d.ts +0 -377
- package/dist/drivers/stagehand/generated/page.js +0 -439
- package/dist/drivers/stagehand/generated/response.d.ts +0 -197
- package/dist/drivers/stagehand/generated/response.js +0 -232
- package/dist/drivers/stagehand/index.d.ts +0 -5
- package/dist/drivers/stagehand/index.js +0 -8
- package/dist/drivers/stagehand/types.d.ts +0 -1
- package/dist/drivers/stagehand/types.js +0 -7
- package/dist/extensions/client.d.ts +0 -47
- package/dist/extensions/client.js +0 -154
- package/dist/extensions/index.d.ts +0 -1
- package/dist/extensions/index.js +0 -1
- package/dist/internal/dev-client.d.ts +0 -5
- package/dist/internal/dev-client.js +0 -9
- package/dist/internal/rpc-targets.d.ts +0 -17
- package/dist/internal/rpc-targets.js +0 -58
- package/dist/internal/serialization.d.ts +0 -32
- package/dist/internal/serialization.js +0 -42
- package/dist/internal/transport.d.ts +0 -24
- package/dist/internal/transport.js +0 -29
- package/dist/playwright.d.ts +0 -1
- package/dist/playwright.js +0 -2
- package/dist/puppeteer.d.ts +0 -1
- package/dist/puppeteer.js +0 -2
- package/dist/selenium.d.ts +0 -1
- package/dist/selenium.js +0 -2
- package/dist/stagehand.d.ts +0 -1
- package/dist/stagehand.js +0 -2
- package/dist/storage/client.d.ts +0 -151
- package/dist/storage/client.js +0 -329
- package/dist/storage/index.d.ts +0 -2
- package/dist/storage/index.js +0 -4
- package/dist/telemetry.d.ts +0 -18
- package/dist/telemetry.js +0 -93
- package/dist/updates/client.d.ts +0 -8
- package/dist/updates/client.js +0 -128
- package/dist/updates/index.d.ts +0 -1
- package/dist/updates/index.js +0 -1
- package/dist/utils/http.d.ts +0 -39
- package/dist/utils/http.js +0 -88
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.js +0 -4
- package/dist/utils/logger.d.ts +0 -27
- package/dist/utils/logger.js +0 -74
- package/dist/utils/schema.d.ts +0 -17
- package/dist/utils/schema.js +0 -31
- package/dist/utils/url.d.ts +0 -5
- package/dist/utils/url.js +0 -7
- package/dist/vault/client.d.ts +0 -43
- package/dist/vault/client.js +0 -123
- package/dist/vault/index.d.ts +0 -1
- package/dist/vault/index.js +0 -1
- package/dist/workspaces/browser-runtime.d.ts +0 -251
- package/dist/workspaces/browser-runtime.js +0 -1025
- package/dist/workspaces/client.d.ts +0 -48
- package/dist/workspaces/client.js +0 -222
- package/dist/workspaces/index.d.ts +0 -2
- package/dist/workspaces/index.js +0 -2
- package/dist/workspaces/runtime-event-pump.d.ts +0 -65
- package/dist/workspaces/runtime-event-pump.js +0 -716
package/dist/updates/client.js
DELETED
|
@@ -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
|
-
}
|
package/dist/updates/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './client.js';
|
package/dist/updates/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './client.js';
|
package/dist/utils/http.d.ts
DELETED
|
@@ -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>;
|
package/dist/utils/http.js
DELETED
|
@@ -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
|
-
}
|
package/dist/utils/index.d.ts
DELETED
package/dist/utils/index.js
DELETED
package/dist/utils/logger.d.ts
DELETED
|
@@ -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
|
-
};
|
package/dist/utils/logger.js
DELETED
|
@@ -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
|
-
};
|
package/dist/utils/schema.d.ts
DELETED
|
@@ -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>;
|
package/dist/utils/schema.js
DELETED
|
@@ -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
|
-
}
|
package/dist/utils/url.d.ts
DELETED
package/dist/utils/url.js
DELETED
package/dist/vault/client.d.ts
DELETED
|
@@ -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 {};
|
package/dist/vault/client.js
DELETED
|
@@ -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
|
-
}
|
package/dist/vault/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { VaultClient } from './client.js';
|
package/dist/vault/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { VaultClient } from './client.js';
|