browser-use-sdk 3.3.2 → 3.4.0
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/dist/{chunk-I75IFZAL.js → chunk-6TSB5AIP.js} +3 -4
- package/dist/chunk-6TSB5AIP.js.map +1 -0
- package/dist/{chunk-RIRVOEIU.cjs → chunk-JT4IL3IZ.cjs} +3 -4
- package/dist/chunk-JT4IL3IZ.cjs.map +1 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +1 -1
- package/dist/v3.cjs +44 -7
- package/dist/v3.cjs.map +1 -1
- package/dist/v3.d.cts +16 -3
- package/dist/v3.d.ts +16 -3
- package/dist/v3.js +42 -5
- package/dist/v3.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-I75IFZAL.js.map +0 -1
- package/dist/chunk-RIRVOEIU.cjs.map +0 -1
|
@@ -68,9 +68,8 @@ var HttpClient = class {
|
|
|
68
68
|
errorBody = await response.json();
|
|
69
69
|
} catch {
|
|
70
70
|
}
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
) : `HTTP ${response.status}`;
|
|
71
|
+
const raw = typeof errorBody === "object" && errorBody !== null ? "message" in errorBody ? errorBody.message : "detail" in errorBody ? errorBody.detail : void 0 : void 0;
|
|
72
|
+
const message = raw === void 0 ? `HTTP ${response.status}` : typeof raw === "string" ? raw : JSON.stringify(raw);
|
|
74
73
|
throw new BrowserUseError(response.status, message, errorBody);
|
|
75
74
|
} catch (error) {
|
|
76
75
|
clearTimeout(timeoutId);
|
|
@@ -97,4 +96,4 @@ export {
|
|
|
97
96
|
BrowserUseError,
|
|
98
97
|
HttpClient
|
|
99
98
|
};
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-6TSB5AIP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/errors.ts","../src/core/http.ts"],"sourcesContent":["export class BrowserUseError extends Error {\n readonly statusCode: number;\n readonly detail: unknown;\n\n constructor(statusCode: number, message: string, detail?: unknown) {\n super(message);\n this.name = \"BrowserUseError\";\n this.statusCode = statusCode;\n this.detail = detail;\n }\n}\n","import { BrowserUseError } from \"./errors.js\";\n\nexport interface HttpClientOptions {\n apiKey: string;\n baseUrl: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly maxRetries: number;\n private readonly timeout: number;\n\n constructor(options: HttpClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.maxRetries = options.maxRetries ?? 3;\n this.timeout = options.timeout ?? 30_000;\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, unknown>;\n signal?: AbortSignal;\n },\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n \"X-Browser-Use-API-Key\": this.apiKey,\n };\n if (options?.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(1000 * 2 ** (attempt - 1), 10_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n const controller = new AbortController();\n const timeoutId = options?.signal\n ? undefined\n : setTimeout(() => controller.abort(), this.timeout);\n\n // Combine user signal with internal timeout when both are present\n const signal = options?.signal ?? controller.signal;\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n const shouldRetry =\n response.status === 429 &&\n attempt < this.maxRetries;\n\n if (shouldRetry) {\n continue;\n }\n\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n /* ignore parse errors */\n }\n const raw =\n typeof errorBody === \"object\" && errorBody !== null\n ? \"message\" in errorBody\n ? (errorBody as Record<string, unknown>).message\n : \"detail\" in errorBody\n ? (errorBody as Record<string, unknown>).detail\n : undefined\n : undefined;\n const message =\n raw === undefined\n ? `HTTP ${response.status}`\n : typeof raw === \"string\"\n ? raw\n : JSON.stringify(raw);\n throw new BrowserUseError(response.status, message, errorBody);\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n throw new Error(\"Unreachable: retry loop exhausted\");\n }\n\n get<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"GET\", path, { query });\n }\n\n post<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"POST\", path, { body, query });\n }\n\n patch<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body, query });\n }\n\n delete<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"DELETE\", path, { query });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -68,9 +68,8 @@ var HttpClient = class {
|
|
|
68
68
|
errorBody = await response.json();
|
|
69
69
|
} catch (e) {
|
|
70
70
|
}
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
) : `HTTP ${response.status}`;
|
|
71
|
+
const raw = typeof errorBody === "object" && errorBody !== null ? "message" in errorBody ? errorBody.message : "detail" in errorBody ? errorBody.detail : void 0 : void 0;
|
|
72
|
+
const message = raw === void 0 ? `HTTP ${response.status}` : typeof raw === "string" ? raw : JSON.stringify(raw);
|
|
74
73
|
throw new BrowserUseError(response.status, message, errorBody);
|
|
75
74
|
} catch (error) {
|
|
76
75
|
clearTimeout(timeoutId);
|
|
@@ -97,4 +96,4 @@ var HttpClient = class {
|
|
|
97
96
|
|
|
98
97
|
|
|
99
98
|
exports.BrowserUseError = BrowserUseError; exports.HttpClient = HttpClient;
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-JT4IL3IZ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/sauravpanda/Github/LLMs/Browser-Use/sdk/browser-use-node/dist/chunk-JT4IL3IZ.cjs","../src/core/errors.ts","../src/core/http.ts"],"names":[],"mappings":"AAAA;ACAO,IAAM,gBAAA,EAAN,MAAA,QAA8B,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EAET,WAAA,CAAY,UAAA,EAAoB,OAAA,EAAiB,MAAA,EAAkB;AACjE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,KAAA,EAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,WAAA,EAAa,UAAA;AAClB,IAAA,IAAA,CAAK,OAAA,EAAS,MAAA;AAAA,EAChB;AACF,CAAA;ADCA;AACA;AEHO,IAAM,WAAA,EAAN,MAAiB;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,WAAA,CAAY,OAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACjD,IAAA,IAAA,CAAK,WAAA,mBAAa,OAAA,CAAQ,UAAA,UAAc,GAAA;AACxC,IAAA,IAAA,CAAK,QAAA,mBAAU,OAAA,CAAQ,OAAA,UAAW,KAAA;AAAA,EACpC;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,EAKY;AACZ,IAAA,MAAM,IAAA,EAAM,IAAI,GAAA,CAAI,CAAA,EAAA;AACA,IAAA;AACD,MAAA;AACD,QAAA;AACR,UAAA;AACN,QAAA;AACF,MAAA;AACF,IAAA;AAEwC,IAAA;AACtC,MAAA;AACF,IAAA;AACa,IAAA;AACH,MAAA;AACV,IAAA;AAEmB,IAAA;AACA,MAAA;AACD,QAAA;AACJ,QAAA;AACZ,MAAA;AAEmB,MAAA;AACD,MAAA;AAKH,MAAA;AAEX,MAAA;AACe,QAAA;AACf,UAAA;AACA,UAAA;AACe,UAAA;AACf,UAAA;AACD,QAAA;AAEY,QAAA;AAEI,QAAA;AACF,UAAA;AACJ,YAAA;AACT,UAAA;AACc,UAAA;AAChB,QAAA;AAEM,QAAA;AAIW,QAAA;AACf,UAAA;AACF,QAAA;AAEI,QAAA;AACA,QAAA;AACU,UAAA;AACN,QAAA;AAER,QAAA;AAEE,QAAA;AAQA,QAAA;AAKQ,QAAA;AACI,MAAA;AACD,QAAA;AACP,QAAA;AACR,MAAA;AACF,IAAA;AAEgB,IAAA;AAClB,EAAA;AAEkE,EAAA;AACzC,IAAA;AACzB,EAAA;AAEsC,EAAA;AACb,IAAA;AACzB,EAAA;AAEuC,EAAA;AACd,IAAA;AACzB,EAAA;AAEqE,EAAA;AAC5C,IAAA;AACzB,EAAA;AACF;AFtCyB;AACA;AACA;AACA;AACA","file":"/Users/sauravpanda/Github/LLMs/Browser-Use/sdk/browser-use-node/dist/chunk-JT4IL3IZ.cjs","sourcesContent":[null,"export class BrowserUseError extends Error {\n readonly statusCode: number;\n readonly detail: unknown;\n\n constructor(statusCode: number, message: string, detail?: unknown) {\n super(message);\n this.name = \"BrowserUseError\";\n this.statusCode = statusCode;\n this.detail = detail;\n }\n}\n","import { BrowserUseError } from \"./errors.js\";\n\nexport interface HttpClientOptions {\n apiKey: string;\n baseUrl: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly maxRetries: number;\n private readonly timeout: number;\n\n constructor(options: HttpClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.maxRetries = options.maxRetries ?? 3;\n this.timeout = options.timeout ?? 30_000;\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, unknown>;\n signal?: AbortSignal;\n },\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n \"X-Browser-Use-API-Key\": this.apiKey,\n };\n if (options?.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(1000 * 2 ** (attempt - 1), 10_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n const controller = new AbortController();\n const timeoutId = options?.signal\n ? undefined\n : setTimeout(() => controller.abort(), this.timeout);\n\n // Combine user signal with internal timeout when both are present\n const signal = options?.signal ?? controller.signal;\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n const shouldRetry =\n response.status === 429 &&\n attempt < this.maxRetries;\n\n if (shouldRetry) {\n continue;\n }\n\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n /* ignore parse errors */\n }\n const raw =\n typeof errorBody === \"object\" && errorBody !== null\n ? \"message\" in errorBody\n ? (errorBody as Record<string, unknown>).message\n : \"detail\" in errorBody\n ? (errorBody as Record<string, unknown>).detail\n : undefined\n : undefined;\n const message =\n raw === undefined\n ? `HTTP ${response.status}`\n : typeof raw === \"string\"\n ? raw\n : JSON.stringify(raw);\n throw new BrowserUseError(response.status, message, errorBody);\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n throw new Error(\"Unreachable: retry loop exhausted\");\n }\n\n get<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"GET\", path, { query });\n }\n\n post<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"POST\", path, { body, query });\n }\n\n patch<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body, query });\n }\n\n delete<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"DELETE\", path, { query });\n }\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkJT4IL3IZcjs = require('./chunk-JT4IL3IZ.cjs');
|
|
5
5
|
|
|
6
6
|
// src/v2/client.ts
|
|
7
7
|
var _zod = require('zod');
|
|
@@ -391,7 +391,7 @@ var BrowserUse = class {
|
|
|
391
391
|
"No API key provided. Pass apiKey or set BROWSER_USE_API_KEY."
|
|
392
392
|
);
|
|
393
393
|
}
|
|
394
|
-
this.http = new (0,
|
|
394
|
+
this.http = new (0, _chunkJT4IL3IZcjs.HttpClient)({
|
|
395
395
|
apiKey,
|
|
396
396
|
baseUrl: _nullishCoalesce(options.baseUrl, () => ( DEFAULT_BASE_URL)),
|
|
397
397
|
maxRetries: options.maxRetries,
|
|
@@ -428,5 +428,5 @@ var BrowserUse = class {
|
|
|
428
428
|
|
|
429
429
|
|
|
430
430
|
|
|
431
|
-
exports.Billing = Billing; exports.BrowserUse = BrowserUse; exports.BrowserUseError =
|
|
431
|
+
exports.Billing = Billing; exports.BrowserUse = BrowserUse; exports.BrowserUseError = _chunkJT4IL3IZcjs.BrowserUseError; exports.Browsers = Browsers; exports.Files = Files; exports.Marketplace = Marketplace; exports.Profiles = Profiles; exports.Sessions = Sessions; exports.Skills = Skills; exports.TaskRun = TaskRun; exports.Tasks = Tasks;
|
|
432
432
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
package/dist/v3.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkJT4IL3IZcjs = require('./chunk-JT4IL3IZ.cjs');
|
|
5
5
|
|
|
6
6
|
// src/v3/client.ts
|
|
7
7
|
var _zod = require('zod');
|
|
@@ -23,7 +23,10 @@ var Browsers = class {
|
|
|
23
23
|
this.http = http;
|
|
24
24
|
}
|
|
25
25
|
/** Create a standalone browser session. */
|
|
26
|
-
create(body) {
|
|
26
|
+
create(body = {}) {
|
|
27
|
+
if (body.proxyCountryCode) {
|
|
28
|
+
body = { ...body, proxyCountryCode: body.proxyCountryCode.toLowerCase() };
|
|
29
|
+
}
|
|
27
30
|
return this.http.post("/browsers", body);
|
|
28
31
|
}
|
|
29
32
|
/** List browser sessions for the authenticated project. */
|
|
@@ -229,15 +232,28 @@ var Workspaces = class {
|
|
|
229
232
|
*
|
|
230
233
|
* ```ts
|
|
231
234
|
* await client.workspaces.upload(wsId, "data.csv", "config.json");
|
|
235
|
+
* await client.workspaces.upload(wsId, "data.csv", { prefix: "uploads/" });
|
|
232
236
|
* ```
|
|
233
237
|
*/
|
|
234
|
-
async upload(workspaceId, ...
|
|
238
|
+
async upload(workspaceId, ...args) {
|
|
239
|
+
let prefix;
|
|
240
|
+
const paths = [];
|
|
241
|
+
for (const arg of args) {
|
|
242
|
+
if (typeof arg === "string") {
|
|
243
|
+
paths.push(arg);
|
|
244
|
+
} else if (typeof arg === "object" && arg !== null) {
|
|
245
|
+
prefix = arg.prefix;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (paths.length === 0) {
|
|
249
|
+
throw new Error("At least one file path is required");
|
|
250
|
+
}
|
|
235
251
|
const items = paths.map((p) => ({
|
|
236
252
|
name: _path.basename.call(void 0, p),
|
|
237
253
|
contentType: guessContentType(p),
|
|
238
254
|
size: _fs.statSync.call(void 0, p).size
|
|
239
255
|
}));
|
|
240
|
-
const resp = await this.uploadFiles(workspaceId, { files: items });
|
|
256
|
+
const resp = await this.uploadFiles(workspaceId, { files: items }, prefix ? { prefix } : void 0);
|
|
241
257
|
for (let i = 0; i < paths.length; i++) {
|
|
242
258
|
const body = _fs.readFileSync.call(void 0, paths[i]);
|
|
243
259
|
const res = await fetch(resp.files[i].uploadUrl, {
|
|
@@ -307,6 +323,7 @@ var SessionRun = (_class = class {
|
|
|
307
323
|
|
|
308
324
|
|
|
309
325
|
|
|
326
|
+
|
|
310
327
|
__init() {this._sessionId = null}
|
|
311
328
|
__init2() {this._result = null}
|
|
312
329
|
constructor(createPromise, sessions, schema, options) {;_class.prototype.__init.call(this);_class.prototype.__init2.call(this);
|
|
@@ -315,6 +332,7 @@ var SessionRun = (_class = class {
|
|
|
315
332
|
this._schema = schema;
|
|
316
333
|
this._timeout = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _11 => _11.timeout]), () => ( 144e5));
|
|
317
334
|
this._interval = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _12 => _12.interval]), () => ( 2e3));
|
|
335
|
+
this._options = options;
|
|
318
336
|
}
|
|
319
337
|
/** The session ID, available after task creation resolves. */
|
|
320
338
|
get sessionId() {
|
|
@@ -362,7 +380,7 @@ var SessionRun = (_class = class {
|
|
|
362
380
|
*/
|
|
363
381
|
async *[Symbol.asyncIterator]() {
|
|
364
382
|
const sessionId = await this._ensureSessionId();
|
|
365
|
-
let cursor;
|
|
383
|
+
let cursor = _optionalChain([this, 'access', _13 => _13._options, 'optionalAccess', _14 => _14._startCursor]);
|
|
366
384
|
const deadline = Date.now() + this._timeout;
|
|
367
385
|
while (Date.now() < deadline) {
|
|
368
386
|
const resp = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });
|
|
@@ -414,7 +432,7 @@ var BrowserUse = class {
|
|
|
414
432
|
"No API key provided. Pass apiKey or set BROWSER_USE_API_KEY."
|
|
415
433
|
);
|
|
416
434
|
}
|
|
417
|
-
this.http = new (0,
|
|
435
|
+
this.http = new (0, _chunkJT4IL3IZcjs.HttpClient)({
|
|
418
436
|
apiKey,
|
|
419
437
|
baseUrl: _nullishCoalesce(options.baseUrl, () => ( DEFAULT_BASE_URL)),
|
|
420
438
|
maxRetries: options.maxRetries,
|
|
@@ -429,12 +447,31 @@ var BrowserUse = class {
|
|
|
429
447
|
run(task, options) {
|
|
430
448
|
const { schema, timeout, interval, ...rest } = _nullishCoalesce(options, () => ( {}));
|
|
431
449
|
const body = { task, ...rest };
|
|
450
|
+
if (body.proxyCountryCode) {
|
|
451
|
+
body.proxyCountryCode = body.proxyCountryCode.toLowerCase();
|
|
452
|
+
}
|
|
432
453
|
if (schema) {
|
|
433
454
|
body.outputSchema = _zod.z.toJSONSchema(schema);
|
|
434
455
|
}
|
|
435
456
|
if (body.sessionId && body.keepAlive === void 0) {
|
|
436
457
|
body.keepAlive = true;
|
|
437
458
|
}
|
|
459
|
+
if (body.sessionId) {
|
|
460
|
+
const sid = body.sessionId;
|
|
461
|
+
const sessions = this.sessions;
|
|
462
|
+
let startCursor;
|
|
463
|
+
const promise2 = sessions.messages(sid, { limit: 1 }).then((resp) => {
|
|
464
|
+
const last = resp.messages[resp.messages.length - 1];
|
|
465
|
+
startCursor = _optionalChain([last, 'optionalAccess', _15 => _15.id]);
|
|
466
|
+
}).then(() => sessions.create(body));
|
|
467
|
+
return new SessionRun(promise2, this.sessions, schema, {
|
|
468
|
+
timeout,
|
|
469
|
+
interval,
|
|
470
|
+
get _startCursor() {
|
|
471
|
+
return startCursor;
|
|
472
|
+
}
|
|
473
|
+
});
|
|
474
|
+
}
|
|
438
475
|
const promise = this.sessions.create(body);
|
|
439
476
|
return new SessionRun(promise, this.sessions, schema, { timeout, interval });
|
|
440
477
|
}
|
|
@@ -448,5 +485,5 @@ var BrowserUse = class {
|
|
|
448
485
|
|
|
449
486
|
|
|
450
487
|
|
|
451
|
-
exports.Billing = Billing; exports.BrowserUse = BrowserUse; exports.BrowserUseError =
|
|
488
|
+
exports.Billing = Billing; exports.BrowserUse = BrowserUse; exports.BrowserUseError = _chunkJT4IL3IZcjs.BrowserUseError; exports.Browsers = Browsers; exports.Profiles = Profiles; exports.SessionRun = SessionRun; exports.Sessions = Sessions; exports.Workspaces = Workspaces;
|
|
452
489
|
//# sourceMappingURL=v3.cjs.map
|
package/dist/v3.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/sauravpanda/Github/LLMs/Browser-Use/sdk/browser-use-node/dist/v3.cjs","../src/v3/client.ts","../src/v3/resources/billing.ts","../src/v3/resources/browsers.ts","../src/v3/resources/profiles.ts","../src/v3/resources/sessions.ts","../src/v3/resources/workspaces.ts","../src/v3/helpers.ts"],"names":[],"mappings":"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","file":"/Users/sauravpanda/Github/LLMs/Browser-Use/sdk/browser-use-node/dist/v3.cjs","sourcesContent":[null,"import { z } from \"zod\";\nimport { HttpClient } from \"../core/http.js\";\nimport { Billing } from \"./resources/billing.js\";\nimport { Browsers } from \"./resources/browsers.js\";\nimport { Profiles } from \"./resources/profiles.js\";\nimport { Sessions } from \"./resources/sessions.js\";\nimport { Workspaces } from \"./resources/workspaces.js\";\nimport { SessionRun } from \"./helpers.js\";\nimport type { components } from \"../generated/v3/types.js\";\nimport type { RunOptions } from \"./helpers.js\";\n\ntype RunTaskRequest = components[\"schemas\"][\"RunTaskRequest\"];\n\nconst DEFAULT_BASE_URL = \"https://api.browser-use.com/api/v3\";\n\nexport interface BrowserUseOptions {\n apiKey?: string;\n baseUrl?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport type RunSessionOptions = Partial<Omit<RunTaskRequest, \"task\">> &\n RunOptions & { schema?: z.ZodType };\n\nexport class BrowserUse {\n readonly billing: Billing;\n readonly browsers: Browsers;\n readonly profiles: Profiles;\n readonly sessions: Sessions;\n readonly workspaces: Workspaces;\n\n private readonly http: HttpClient;\n\n constructor(options: BrowserUseOptions = {}) {\n const apiKey =\n options.apiKey ?? process.env.BROWSER_USE_API_KEY ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"No API key provided. Pass apiKey or set BROWSER_USE_API_KEY.\",\n );\n }\n this.http = new HttpClient({\n apiKey,\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n maxRetries: options.maxRetries,\n timeout: options.timeout,\n });\n\n this.billing = new Billing(this.http);\n this.browsers = new Browsers(this.http);\n this.profiles = new Profiles(this.http);\n this.sessions = new Sessions(this.http);\n this.workspaces = new Workspaces(this.http);\n }\n\n /**\n * Create a session and run a task. `await` the result for a typed SessionResult.\n *\n * ```ts\n * // Simple — just get the output\n * const result = await client.run(\"Find the top HN post\");\n * console.log(result.output);\n *\n * // Structured output (Zod)\n * const result = await client.run(\"Find product info\", { schema: ProductSchema });\n * console.log(result.output.name); // fully typed\n * ```\n */\n run(task: string, options?: Omit<RunSessionOptions, \"schema\">): SessionRun<string>;\n run<T extends z.ZodType>(task: string, options: RunSessionOptions & { schema: T }): SessionRun<z.output<T>>;\n run(task: string, options?: RunSessionOptions): SessionRun<any> {\n const { schema, timeout, interval, ...rest } = options ?? {};\n const body = { task, ...rest } as RunTaskRequest;\n if (schema) {\n body.outputSchema = z.toJSONSchema(schema) as Record<string, unknown>;\n }\n // Auto keep_alive when dispatching to an existing session\n if (body.sessionId && body.keepAlive === undefined) {\n body.keepAlive = true;\n }\n const promise = this.sessions.create(body);\n return new SessionRun(promise, this.sessions, schema, { timeout, interval });\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype AccountView = components[\"schemas\"][\"AccountView\"];\n\nexport class Billing {\n constructor(private readonly http: HttpClient) {}\n\n /** Get account billing information. */\n account(): Promise<AccountView> {\n return this.http.get<AccountView>(\"/billing/account\");\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype CreateBrowserSessionRequest = components[\"schemas\"][\"CreateBrowserSessionRequest\"];\ntype BrowserSessionItemView = components[\"schemas\"][\"BrowserSessionItemView\"];\ntype BrowserSessionView = components[\"schemas\"][\"BrowserSessionView\"];\ntype BrowserSessionListResponse = components[\"schemas\"][\"BrowserSessionListResponse\"];\ntype UpdateBrowserSessionRequest = components[\"schemas\"][\"UpdateBrowserSessionRequest\"];\n\nexport interface BrowserListParams {\n page?: number;\n page_size?: number;\n}\n\nexport class Browsers {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a standalone browser session. */\n create(body?: CreateBrowserSessionRequest): Promise<BrowserSessionItemView> {\n return this.http.post<BrowserSessionItemView>(\"/browsers\", body);\n }\n\n /** List browser sessions for the authenticated project. */\n list(params?: BrowserListParams): Promise<BrowserSessionListResponse> {\n return this.http.get<BrowserSessionListResponse>(\"/browsers\", params as Record<string, unknown>);\n }\n\n /** Get browser session details. */\n get(sessionId: string): Promise<BrowserSessionView> {\n return this.http.get<BrowserSessionView>(`/browsers/${sessionId}`);\n }\n\n /** Update a browser session (e.g. stop it). */\n update(sessionId: string, body: UpdateBrowserSessionRequest): Promise<BrowserSessionView> {\n return this.http.patch<BrowserSessionView>(`/browsers/${sessionId}`, body);\n }\n\n /** Stop a browser session. Convenience wrapper around update. */\n stop(sessionId: string): Promise<BrowserSessionView> {\n return this.update(sessionId, { action: \"stop\" });\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype ProfileView = components[\"schemas\"][\"ProfileView\"];\ntype ProfileListResponse = components[\"schemas\"][\"ProfileListResponse\"];\ntype ProfileCreateRequest = components[\"schemas\"][\"ProfileCreateRequest\"];\ntype ProfileUpdateRequest = components[\"schemas\"][\"ProfileUpdateRequest\"];\n\nexport interface ProfileListParams {\n query?: string;\n page?: number;\n page_size?: number;\n}\n\nexport class Profiles {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a browser profile. */\n create(body?: ProfileCreateRequest): Promise<ProfileView> {\n return this.http.post<ProfileView>(\"/profiles\", body);\n }\n\n /** List profiles for the authenticated project. */\n list(params?: ProfileListParams): Promise<ProfileListResponse> {\n return this.http.get<ProfileListResponse>(\"/profiles\", params as Record<string, unknown>);\n }\n\n /** Get profile details. */\n get(profileId: string): Promise<ProfileView> {\n return this.http.get<ProfileView>(`/profiles/${profileId}`);\n }\n\n /** Update a profile. */\n update(profileId: string, body: ProfileUpdateRequest): Promise<ProfileView> {\n return this.http.patch<ProfileView>(`/profiles/${profileId}`, body);\n }\n\n /** Delete a profile. */\n delete(profileId: string): Promise<void> {\n return this.http.delete<void>(`/profiles/${profileId}`);\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype RunTaskRequest = components[\"schemas\"][\"RunTaskRequest\"];\n/** All fields optional — omit `task` to create an idle session. */\nexport type CreateSessionBody = Partial<RunTaskRequest>;\ntype SessionResponse = components[\"schemas\"][\"SessionResponse\"];\ntype SessionListResponse = components[\"schemas\"][\"SessionListResponse\"];\ntype FileListResponse = components[\"schemas\"][\"FileListResponse\"];\ntype StopSessionRequest = components[\"schemas\"][\"StopSessionRequest\"];\ntype FileUploadRequest = components[\"schemas\"][\"FileUploadRequest\"];\ntype FileUploadResponse = components[\"schemas\"][\"FileUploadResponse\"];\ntype MessageListResponse = components[\"schemas\"][\"MessageListResponse\"];\n\nexport interface SessionListParams {\n page?: number;\n page_size?: number;\n}\n\nexport interface SessionFilesParams {\n prefix?: string;\n limit?: number;\n cursor?: string | null;\n includeUrls?: boolean;\n shallow?: boolean;\n}\n\nexport interface SessionMessagesParams {\n after?: string | null;\n before?: string | null;\n limit?: number;\n}\n\nexport class Sessions {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a session and optionally dispatch a task. */\n create(body?: CreateSessionBody): Promise<SessionResponse> {\n return this.http.post<SessionResponse>(\"/sessions\", body ?? {});\n }\n\n /** List sessions for the authenticated project. */\n list(params?: SessionListParams): Promise<SessionListResponse> {\n return this.http.get<SessionListResponse>(\"/sessions\", params as Record<string, unknown>);\n }\n\n /** Get session details. */\n get(sessionId: string): Promise<SessionResponse> {\n return this.http.get<SessionResponse>(`/sessions/${sessionId}`);\n }\n\n /** Stop a session or the running task. */\n stop(sessionId: string, body?: StopSessionRequest): Promise<SessionResponse> {\n return this.http.post<SessionResponse>(`/sessions/${sessionId}/stop`, body);\n }\n\n /** Soft-delete a session. */\n delete(sessionId: string): Promise<void> {\n return this.http.delete<void>(`/sessions/${sessionId}`);\n }\n\n /** Get presigned upload URLs for session files. */\n uploadFiles(sessionId: string, body: FileUploadRequest): Promise<FileUploadResponse> {\n return this.http.post<FileUploadResponse>(`/sessions/${sessionId}/files/upload`, body);\n }\n\n /** List files in a session's workspace. */\n files(sessionId: string, params?: SessionFilesParams): Promise<FileListResponse> {\n return this.http.get<FileListResponse>(\n `/sessions/${sessionId}/files`,\n params as Record<string, unknown>,\n );\n }\n\n /** List messages for a session with cursor-based pagination. */\n messages(sessionId: string, params?: SessionMessagesParams): Promise<MessageListResponse> {\n return this.http.get<MessageListResponse>(\n `/sessions/${sessionId}/messages`,\n params as Record<string, unknown>,\n );\n }\n\n /**\n * Poll until recording URLs are available. Returns presigned MP4 URLs.\n *\n * Returns an empty array if no recording was produced (e.g. the agent\n * answered without opening a browser, or recording was not enabled).\n */\n async waitForRecording(\n sessionId: string,\n options?: { timeout?: number; interval?: number },\n ): Promise<string[]> {\n const timeout = options?.timeout ?? 15_000;\n const interval = options?.interval ?? 2_000;\n const deadline = Date.now() + timeout;\n while (Date.now() < deadline) {\n const session = await this.get(sessionId);\n if (session.recordingUrls?.length) return session.recordingUrls;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) => setTimeout(r, Math.min(interval, remaining)));\n }\n return [];\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, statSync } from \"fs\";\nimport { basename, dirname, extname, join, resolve } from \"path\";\nimport type { HttpClient } from \"../../core/http.js\";\n\nfunction safeJoin(base: string, untrusted: string): string {\n const baseResolved = resolve(base) + \"/\";\n const resolved = resolve(base, untrusted);\n if (resolved !== resolve(base) && !resolved.startsWith(baseResolved)) {\n throw new Error(`Path traversal detected: ${untrusted}`);\n }\n return resolved;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n \".csv\": \"text/csv\",\n \".json\": \"application/json\",\n \".txt\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".html\": \"text/html\",\n \".xml\": \"application/xml\",\n \".yaml\": \"application/yaml\",\n \".yml\": \"application/yaml\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".xls\": \"application/vnd.ms-excel\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".doc\": \"application/msword\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n};\n\nfunction guessContentType(path: string): string {\n return MIME_TYPES[extname(path).toLowerCase()] ?? \"application/octet-stream\";\n}\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype WorkspaceView = components[\"schemas\"][\"WorkspaceView\"];\ntype WorkspaceListResponse = components[\"schemas\"][\"WorkspaceListResponse\"];\ntype WorkspaceCreateRequest = components[\"schemas\"][\"WorkspaceCreateRequest\"];\ntype WorkspaceUpdateRequest = components[\"schemas\"][\"WorkspaceUpdateRequest\"];\ntype FileListResponse = components[\"schemas\"][\"FileListResponse\"];\ntype FileUploadRequest = components[\"schemas\"][\"FileUploadRequest\"];\ntype FileUploadResponse = components[\"schemas\"][\"FileUploadResponse\"];\n\nexport interface WorkspaceListParams {\n pageSize?: number;\n pageNumber?: number;\n}\n\nexport interface WorkspaceFilesParams {\n prefix?: string;\n limit?: number;\n cursor?: string | null;\n includeUrls?: boolean;\n shallow?: boolean;\n}\n\nexport class Workspaces {\n constructor(private readonly http: HttpClient) {}\n\n /** List workspaces for the authenticated project. */\n list(params?: WorkspaceListParams): Promise<WorkspaceListResponse> {\n return this.http.get<WorkspaceListResponse>(\"/workspaces\", params as Record<string, unknown>);\n }\n\n /** Create a new workspace. */\n create(body?: WorkspaceCreateRequest): Promise<WorkspaceView> {\n return this.http.post<WorkspaceView>(\"/workspaces\", body);\n }\n\n /** Get workspace details. */\n get(workspaceId: string): Promise<WorkspaceView> {\n return this.http.get<WorkspaceView>(`/workspaces/${workspaceId}`);\n }\n\n /** Update a workspace. */\n update(workspaceId: string, body: WorkspaceUpdateRequest): Promise<WorkspaceView> {\n return this.http.patch<WorkspaceView>(`/workspaces/${workspaceId}`, body);\n }\n\n /** Delete a workspace and its data. */\n delete(workspaceId: string): Promise<void> {\n return this.http.delete<void>(`/workspaces/${workspaceId}`);\n }\n\n /** List files in a workspace. */\n files(workspaceId: string, params?: WorkspaceFilesParams): Promise<FileListResponse> {\n return this.http.get<FileListResponse>(\n `/workspaces/${workspaceId}/files`,\n params as Record<string, unknown>,\n );\n }\n\n /** Get presigned upload URLs for workspace files. */\n uploadFiles(workspaceId: string, body: FileUploadRequest, query?: { prefix?: string }): Promise<FileUploadResponse> {\n return this.http.post<FileUploadResponse>(\n `/workspaces/${workspaceId}/files/upload`,\n body,\n query as Record<string, unknown>,\n );\n }\n\n /** Delete a file from a workspace. */\n deleteFile(workspaceId: string, path: string): Promise<void> {\n return this.http.delete<void>(`/workspaces/${workspaceId}/files`, { path });\n }\n\n /** Get storage usage for a workspace. */\n size(workspaceId: string): Promise<unknown> {\n return this.http.get<unknown>(`/workspaces/${workspaceId}/size`);\n }\n\n /**\n * Upload local files to a workspace. Returns the list of remote paths.\n *\n * ```ts\n * await client.workspaces.upload(wsId, \"data.csv\", \"config.json\");\n * ```\n */\n async upload(workspaceId: string, ...paths: string[]): Promise<string[]> {\n const items = paths.map((p) => ({\n name: basename(p),\n contentType: guessContentType(p),\n size: statSync(p).size,\n }));\n const resp = await this.uploadFiles(workspaceId, { files: items });\n for (let i = 0; i < paths.length; i++) {\n const body = readFileSync(paths[i]);\n const res = await fetch(resp.files[i].uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": items[i].contentType },\n body,\n });\n if (!res.ok) throw new Error(`Upload failed: ${res.status} ${res.statusText}`);\n }\n return resp.files.map((f) => f.path);\n }\n\n /**\n * Download a single file from a workspace. Returns the local path.\n *\n * ```ts\n * const local = await client.workspaces.download(wsId, \"uploads/data.csv\", { to: \"./data.csv\" });\n * ```\n */\n async download(workspaceId: string, path: string, options?: { to?: string }): Promise<string> {\n const fileList = await this.files(workspaceId, { prefix: path, includeUrls: true });\n const match = fileList.files?.find((f) => f.path === path);\n if (!match) throw new Error(`File not found in workspace: ${path}`);\n const dest = options?.to ?? basename(match.path);\n mkdirSync(dirname(dest), { recursive: true });\n const resp = await fetch(match.url!);\n if (!resp.ok) throw new Error(`Download failed: ${resp.status}`);\n writeFileSync(dest, Buffer.from(await resp.arrayBuffer()));\n return dest;\n }\n\n /**\n * Download all files from a workspace. Returns list of local paths.\n *\n * ```ts\n * const paths = await client.workspaces.downloadAll(wsId, { to: \"./output\" });\n * ```\n */\n async downloadAll(workspaceId: string, options?: { to?: string; prefix?: string }): Promise<string[]> {\n const destDir = options?.to ?? \".\";\n mkdirSync(destDir, { recursive: true });\n const results: string[] = [];\n let cursor: string | undefined;\n do {\n const fileList = await this.files(workspaceId, {\n prefix: options?.prefix,\n includeUrls: true,\n cursor,\n });\n for (const f of fileList.files ?? []) {\n const local = safeJoin(destDir, f.path);\n mkdirSync(dirname(local), { recursive: true });\n const resp = await fetch(f.url!);\n if (!resp.ok) throw new Error(`Download failed for ${f.path}: ${resp.status}`);\n writeFileSync(local, Buffer.from(await resp.arrayBuffer()));\n results.push(local);\n }\n cursor = fileList.hasMore ? (fileList.nextCursor ?? undefined) : undefined;\n } while (cursor);\n return results;\n }\n}\n","import type { z } from \"zod\";\nimport type { components } from \"../generated/v3/types.js\";\nimport type { Sessions } from \"./resources/sessions.js\";\n\ntype SessionResponse = components[\"schemas\"][\"SessionResponse\"];\ntype MessageResponse = components[\"schemas\"][\"MessageResponse\"];\n\nconst TERMINAL_STATUSES = new Set([\"idle\", \"stopped\", \"timed_out\", \"error\"]);\n\nexport interface RunOptions {\n /** Maximum time to wait in milliseconds. Default: 14_400_000 (4 hours). */\n timeout?: number;\n /** Polling interval in milliseconds. Default: 2_000. */\n interval?: number;\n}\n\n/** Session result with typed output. All SessionResponse fields are directly accessible. */\nexport type SessionResult<T = string | null> = Omit<SessionResponse, \"output\"> & { output: T };\n\n/**\n * Dual-purpose session handle: `await` it for a typed SessionResult,\n * or access `.result` for the full SessionResult after resolution.\n */\nexport class SessionRun<T = string> implements PromiseLike<SessionResult<T>> {\n private readonly _createPromise: Promise<SessionResponse>;\n private readonly _sessions: Sessions;\n private readonly _schema?: z.ZodType<T>;\n private readonly _timeout: number;\n private readonly _interval: number;\n private _sessionId: string | null = null;\n private _result: SessionResult<T> | null = null;\n\n constructor(\n createPromise: Promise<SessionResponse>,\n sessions: Sessions,\n schema?: z.ZodType<T>,\n options?: RunOptions,\n ) {\n this._createPromise = createPromise;\n this._sessions = sessions;\n this._schema = schema;\n this._timeout = options?.timeout ?? 14_400_000;\n this._interval = options?.interval ?? 2_000;\n }\n\n /** The session ID, available after task creation resolves. */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /** The full SessionResult, available after polling completes. */\n get result(): SessionResult<T> | null {\n return this._result;\n }\n\n /** Enable `await client.run(...)` — polls until terminal, returns SessionResult. */\n then<R1 = SessionResult<T>, R2 = never>(\n onFulfilled?:\n | ((value: SessionResult<T>) => R1 | PromiseLike<R1>)\n | null,\n onRejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null,\n ): Promise<R1 | R2> {\n return this._waitForOutput().then(onFulfilled, onRejected);\n }\n\n private async _ensureSessionId(): Promise<string> {\n if (this._sessionId) return this._sessionId;\n const created = await this._createPromise;\n this._sessionId = created.id;\n return this._sessionId;\n }\n\n /** Poll session until terminal, return SessionResult. */\n private async _waitForOutput(): Promise<SessionResult<T>> {\n const sessionId = await this._ensureSessionId();\n const deadline = Date.now() + this._timeout;\n\n while (Date.now() < deadline) {\n const session = await this._sessions.get(sessionId);\n if (TERMINAL_STATUSES.has(session.status)) {\n const { output, ...rest } = session;\n const parsed = this._parseOutput(output);\n this._result = { ...rest, output: parsed } as SessionResult<T>;\n return this._result;\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) =>\n setTimeout(r, Math.min(this._interval, remaining)),\n );\n }\n\n throw new Error(\n `Session ${sessionId} did not complete within ${this._timeout}ms`,\n );\n }\n\n /**\n * Enable `for await (const msg of client.run(...))` — yields messages as they appear.\n * After iteration, `.result` contains the final SessionResult.\n */\n async *[Symbol.asyncIterator](): AsyncGenerator<MessageResponse> {\n const sessionId = await this._ensureSessionId();\n let cursor: string | undefined;\n const deadline = Date.now() + this._timeout;\n\n while (Date.now() < deadline) {\n const resp = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });\n for (const msg of resp.messages) {\n yield msg;\n cursor = msg.id;\n }\n\n const session = await this._sessions.get(sessionId);\n if (TERMINAL_STATUSES.has(session.status)) {\n // Drain all remaining messages (may be multiple pages)\n while (true) {\n const page = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });\n if (!page.messages.length) break;\n for (const msg of page.messages) {\n yield msg;\n cursor = msg.id;\n }\n }\n const { output, ...rest } = session;\n this._result = { ...rest, output: this._parseOutput(output) } as SessionResult<T>;\n return;\n }\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) => setTimeout(r, Math.min(this._interval, remaining)));\n }\n\n throw new Error(`Session ${sessionId} did not complete within ${this._timeout}ms`);\n }\n\n private _parseOutput(output: unknown): T {\n if (output == null) return null as T;\n if (!this._schema) return output as unknown as T;\n const raw = typeof output === \"string\" ? JSON.parse(output) : output;\n return this._schema.parse(raw);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/sauravpanda/Github/LLMs/Browser-Use/sdk/browser-use-node/dist/v3.cjs","../src/v3/client.ts","../src/v3/resources/billing.ts","../src/v3/resources/browsers.ts","../src/v3/resources/profiles.ts","../src/v3/resources/sessions.ts","../src/v3/resources/workspaces.ts","../src/v3/helpers.ts"],"names":[],"mappings":"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","file":"/Users/sauravpanda/Github/LLMs/Browser-Use/sdk/browser-use-node/dist/v3.cjs","sourcesContent":[null,"import { z } from \"zod\";\nimport { HttpClient } from \"../core/http.js\";\nimport { Billing } from \"./resources/billing.js\";\nimport { Browsers } from \"./resources/browsers.js\";\nimport { Profiles } from \"./resources/profiles.js\";\nimport { Sessions } from \"./resources/sessions.js\";\nimport { Workspaces } from \"./resources/workspaces.js\";\nimport { SessionRun } from \"./helpers.js\";\nimport type { components } from \"../generated/v3/types.js\";\nimport type { RunOptions } from \"./helpers.js\";\n\ntype RunTaskRequest = components[\"schemas\"][\"RunTaskRequest\"];\n\nconst DEFAULT_BASE_URL = \"https://api.browser-use.com/api/v3\";\n\nexport interface BrowserUseOptions {\n apiKey?: string;\n baseUrl?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport type RunSessionOptions = Partial<Omit<RunTaskRequest, \"task\">> &\n RunOptions & { schema?: z.ZodType };\n\nexport class BrowserUse {\n readonly billing: Billing;\n readonly browsers: Browsers;\n readonly profiles: Profiles;\n readonly sessions: Sessions;\n readonly workspaces: Workspaces;\n\n private readonly http: HttpClient;\n\n constructor(options: BrowserUseOptions = {}) {\n const apiKey =\n options.apiKey ?? process.env.BROWSER_USE_API_KEY ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"No API key provided. Pass apiKey or set BROWSER_USE_API_KEY.\",\n );\n }\n this.http = new HttpClient({\n apiKey,\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n maxRetries: options.maxRetries,\n timeout: options.timeout,\n });\n\n this.billing = new Billing(this.http);\n this.browsers = new Browsers(this.http);\n this.profiles = new Profiles(this.http);\n this.sessions = new Sessions(this.http);\n this.workspaces = new Workspaces(this.http);\n }\n\n /**\n * Create a session and run a task. `await` the result for a typed SessionResult.\n *\n * ```ts\n * // Simple — just get the output\n * const result = await client.run(\"Find the top HN post\");\n * console.log(result.output);\n *\n * // Structured output (Zod)\n * const result = await client.run(\"Find product info\", { schema: ProductSchema });\n * console.log(result.output.name); // fully typed\n * ```\n */\n run(task: string, options?: Omit<RunSessionOptions, \"schema\">): SessionRun<string>;\n run<T extends z.ZodType>(task: string, options: RunSessionOptions & { schema: T }): SessionRun<z.output<T>>;\n run(task: string, options?: RunSessionOptions): SessionRun<any> {\n const { schema, timeout, interval, ...rest } = options ?? {};\n const body = { task, ...rest } as RunTaskRequest;\n if (body.proxyCountryCode) {\n body.proxyCountryCode = body.proxyCountryCode.toLowerCase() as any;\n }\n if (schema) {\n body.outputSchema = z.toJSONSchema(schema) as Record<string, unknown>;\n }\n // Auto keep_alive when dispatching to an existing session\n if (body.sessionId && body.keepAlive === undefined) {\n body.keepAlive = true;\n }\n // For follow-up runs on an existing session, snapshot the latest message\n // cursor before creating the new task so the iterator skips old messages.\n if (body.sessionId) {\n const sid = body.sessionId;\n const sessions = this.sessions;\n let startCursor: string | undefined;\n const promise = sessions\n .messages(sid, { limit: 1 })\n .then((resp) => {\n const last = resp.messages[resp.messages.length - 1];\n startCursor = last?.id;\n })\n .then(() => sessions.create(body));\n // startCursor is set before createPromise resolves, so the iterator\n // (which awaits _ensureSessionId first) will see the correct value.\n return new SessionRun(promise, this.sessions, schema, {\n timeout,\n interval,\n get _startCursor() { return startCursor; },\n });\n }\n const promise = this.sessions.create(body);\n return new SessionRun(promise, this.sessions, schema, { timeout, interval });\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype AccountView = components[\"schemas\"][\"AccountView\"];\n\nexport class Billing {\n constructor(private readonly http: HttpClient) {}\n\n /** Get account billing information. */\n account(): Promise<AccountView> {\n return this.http.get<AccountView>(\"/billing/account\");\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype CreateBrowserSessionRequest = components[\"schemas\"][\"CreateBrowserSessionRequest\"];\ntype BrowserSessionItemView = components[\"schemas\"][\"BrowserSessionItemView\"];\ntype BrowserSessionView = components[\"schemas\"][\"BrowserSessionView\"];\ntype BrowserSessionListResponse = components[\"schemas\"][\"BrowserSessionListResponse\"];\ntype UpdateBrowserSessionRequest = components[\"schemas\"][\"UpdateBrowserSessionRequest\"];\n\nexport interface BrowserListParams {\n page?: number;\n page_size?: number;\n}\n\nexport class Browsers {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a standalone browser session. */\n create(body: Partial<CreateBrowserSessionRequest> = {}): Promise<BrowserSessionItemView> {\n if (body.proxyCountryCode) {\n body = { ...body, proxyCountryCode: body.proxyCountryCode.toLowerCase() as any };\n }\n return this.http.post<BrowserSessionItemView>(\"/browsers\", body);\n }\n\n /** List browser sessions for the authenticated project. */\n list(params?: BrowserListParams): Promise<BrowserSessionListResponse> {\n return this.http.get<BrowserSessionListResponse>(\"/browsers\", params as Record<string, unknown>);\n }\n\n /** Get browser session details. */\n get(sessionId: string): Promise<BrowserSessionView> {\n return this.http.get<BrowserSessionView>(`/browsers/${sessionId}`);\n }\n\n /** Update a browser session (e.g. stop it). */\n update(sessionId: string, body: UpdateBrowserSessionRequest): Promise<BrowserSessionView> {\n return this.http.patch<BrowserSessionView>(`/browsers/${sessionId}`, body);\n }\n\n /** Stop a browser session. Convenience wrapper around update. */\n stop(sessionId: string): Promise<BrowserSessionView> {\n return this.update(sessionId, { action: \"stop\" });\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype ProfileView = components[\"schemas\"][\"ProfileView\"];\ntype ProfileListResponse = components[\"schemas\"][\"ProfileListResponse\"];\ntype ProfileCreateRequest = components[\"schemas\"][\"ProfileCreateRequest\"];\ntype ProfileUpdateRequest = components[\"schemas\"][\"ProfileUpdateRequest\"];\n\nexport interface ProfileListParams {\n query?: string;\n page?: number;\n page_size?: number;\n}\n\nexport class Profiles {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a browser profile. */\n create(body?: ProfileCreateRequest): Promise<ProfileView> {\n return this.http.post<ProfileView>(\"/profiles\", body);\n }\n\n /** List profiles for the authenticated project. */\n list(params?: ProfileListParams): Promise<ProfileListResponse> {\n return this.http.get<ProfileListResponse>(\"/profiles\", params as Record<string, unknown>);\n }\n\n /** Get profile details. */\n get(profileId: string): Promise<ProfileView> {\n return this.http.get<ProfileView>(`/profiles/${profileId}`);\n }\n\n /** Update a profile. */\n update(profileId: string, body: ProfileUpdateRequest): Promise<ProfileView> {\n return this.http.patch<ProfileView>(`/profiles/${profileId}`, body);\n }\n\n /** Delete a profile. */\n delete(profileId: string): Promise<void> {\n return this.http.delete<void>(`/profiles/${profileId}`);\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype RunTaskRequest = components[\"schemas\"][\"RunTaskRequest\"];\n/** All fields optional — omit `task` to create an idle session. */\nexport type CreateSessionBody = Partial<RunTaskRequest>;\ntype SessionResponse = components[\"schemas\"][\"SessionResponse\"];\ntype SessionListResponse = components[\"schemas\"][\"SessionListResponse\"];\ntype FileListResponse = components[\"schemas\"][\"FileListResponse\"];\ntype StopSessionRequest = components[\"schemas\"][\"StopSessionRequest\"];\ntype FileUploadRequest = components[\"schemas\"][\"FileUploadRequest\"];\ntype FileUploadResponse = components[\"schemas\"][\"FileUploadResponse\"];\ntype MessageListResponse = components[\"schemas\"][\"MessageListResponse\"];\n\nexport interface SessionListParams {\n page?: number;\n page_size?: number;\n}\n\nexport interface SessionFilesParams {\n prefix?: string;\n limit?: number;\n cursor?: string | null;\n includeUrls?: boolean;\n shallow?: boolean;\n}\n\nexport interface SessionMessagesParams {\n after?: string | null;\n before?: string | null;\n limit?: number;\n}\n\nexport class Sessions {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a session and optionally dispatch a task. */\n create(body?: CreateSessionBody): Promise<SessionResponse> {\n return this.http.post<SessionResponse>(\"/sessions\", body ?? {});\n }\n\n /** List sessions for the authenticated project. */\n list(params?: SessionListParams): Promise<SessionListResponse> {\n return this.http.get<SessionListResponse>(\"/sessions\", params as Record<string, unknown>);\n }\n\n /** Get session details. */\n get(sessionId: string): Promise<SessionResponse> {\n return this.http.get<SessionResponse>(`/sessions/${sessionId}`);\n }\n\n /** Stop a session or the running task. */\n stop(sessionId: string, body?: StopSessionRequest): Promise<SessionResponse> {\n return this.http.post<SessionResponse>(`/sessions/${sessionId}/stop`, body);\n }\n\n /** Soft-delete a session. */\n delete(sessionId: string): Promise<void> {\n return this.http.delete<void>(`/sessions/${sessionId}`);\n }\n\n /** Get presigned upload URLs for session files. */\n uploadFiles(sessionId: string, body: FileUploadRequest): Promise<FileUploadResponse> {\n return this.http.post<FileUploadResponse>(`/sessions/${sessionId}/files/upload`, body);\n }\n\n /** List files in a session's workspace. */\n files(sessionId: string, params?: SessionFilesParams): Promise<FileListResponse> {\n return this.http.get<FileListResponse>(\n `/sessions/${sessionId}/files`,\n params as Record<string, unknown>,\n );\n }\n\n /** List messages for a session with cursor-based pagination. */\n messages(sessionId: string, params?: SessionMessagesParams): Promise<MessageListResponse> {\n return this.http.get<MessageListResponse>(\n `/sessions/${sessionId}/messages`,\n params as Record<string, unknown>,\n );\n }\n\n /**\n * Poll until recording URLs are available. Returns presigned MP4 URLs.\n *\n * Returns an empty array if no recording was produced (e.g. the agent\n * answered without opening a browser, or recording was not enabled).\n */\n async waitForRecording(\n sessionId: string,\n options?: { timeout?: number; interval?: number },\n ): Promise<string[]> {\n const timeout = options?.timeout ?? 15_000;\n const interval = options?.interval ?? 2_000;\n const deadline = Date.now() + timeout;\n while (Date.now() < deadline) {\n const session = await this.get(sessionId);\n if (session.recordingUrls?.length) return session.recordingUrls;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) => setTimeout(r, Math.min(interval, remaining)));\n }\n return [];\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, statSync } from \"fs\";\nimport { basename, dirname, extname, join, resolve } from \"path\";\nimport type { HttpClient } from \"../../core/http.js\";\n\nfunction safeJoin(base: string, untrusted: string): string {\n const baseResolved = resolve(base) + \"/\";\n const resolved = resolve(base, untrusted);\n if (resolved !== resolve(base) && !resolved.startsWith(baseResolved)) {\n throw new Error(`Path traversal detected: ${untrusted}`);\n }\n return resolved;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n \".csv\": \"text/csv\",\n \".json\": \"application/json\",\n \".txt\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".html\": \"text/html\",\n \".xml\": \"application/xml\",\n \".yaml\": \"application/yaml\",\n \".yml\": \"application/yaml\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".xls\": \"application/vnd.ms-excel\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".doc\": \"application/msword\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n};\n\nfunction guessContentType(path: string): string {\n return MIME_TYPES[extname(path).toLowerCase()] ?? \"application/octet-stream\";\n}\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype WorkspaceView = components[\"schemas\"][\"WorkspaceView\"];\ntype WorkspaceListResponse = components[\"schemas\"][\"WorkspaceListResponse\"];\ntype WorkspaceCreateRequest = components[\"schemas\"][\"WorkspaceCreateRequest\"];\ntype WorkspaceUpdateRequest = components[\"schemas\"][\"WorkspaceUpdateRequest\"];\ntype FileListResponse = components[\"schemas\"][\"FileListResponse\"];\ntype FileUploadRequest = components[\"schemas\"][\"FileUploadRequest\"];\ntype FileUploadResponse = components[\"schemas\"][\"FileUploadResponse\"];\n\nexport interface WorkspaceListParams {\n pageSize?: number;\n pageNumber?: number;\n}\n\nexport interface WorkspaceFilesParams {\n prefix?: string;\n limit?: number;\n cursor?: string | null;\n includeUrls?: boolean;\n shallow?: boolean;\n}\n\nexport class Workspaces {\n constructor(private readonly http: HttpClient) {}\n\n /** List workspaces for the authenticated project. */\n list(params?: WorkspaceListParams): Promise<WorkspaceListResponse> {\n return this.http.get<WorkspaceListResponse>(\"/workspaces\", params as Record<string, unknown>);\n }\n\n /** Create a new workspace. */\n create(body?: WorkspaceCreateRequest): Promise<WorkspaceView> {\n return this.http.post<WorkspaceView>(\"/workspaces\", body);\n }\n\n /** Get workspace details. */\n get(workspaceId: string): Promise<WorkspaceView> {\n return this.http.get<WorkspaceView>(`/workspaces/${workspaceId}`);\n }\n\n /** Update a workspace. */\n update(workspaceId: string, body: WorkspaceUpdateRequest): Promise<WorkspaceView> {\n return this.http.patch<WorkspaceView>(`/workspaces/${workspaceId}`, body);\n }\n\n /** Delete a workspace and its data. */\n delete(workspaceId: string): Promise<void> {\n return this.http.delete<void>(`/workspaces/${workspaceId}`);\n }\n\n /** List files in a workspace. */\n files(workspaceId: string, params?: WorkspaceFilesParams): Promise<FileListResponse> {\n return this.http.get<FileListResponse>(\n `/workspaces/${workspaceId}/files`,\n params as Record<string, unknown>,\n );\n }\n\n /** Get presigned upload URLs for workspace files. */\n uploadFiles(workspaceId: string, body: FileUploadRequest, query?: { prefix?: string }): Promise<FileUploadResponse> {\n return this.http.post<FileUploadResponse>(\n `/workspaces/${workspaceId}/files/upload`,\n body,\n query as Record<string, unknown>,\n );\n }\n\n /** Delete a file from a workspace. */\n deleteFile(workspaceId: string, path: string): Promise<void> {\n return this.http.delete<void>(`/workspaces/${workspaceId}/files`, { path });\n }\n\n /** Get storage usage for a workspace. */\n size(workspaceId: string): Promise<unknown> {\n return this.http.get<unknown>(`/workspaces/${workspaceId}/size`);\n }\n\n /**\n * Upload local files to a workspace. Returns the list of remote paths.\n *\n * ```ts\n * await client.workspaces.upload(wsId, \"data.csv\", \"config.json\");\n * await client.workspaces.upload(wsId, \"data.csv\", { prefix: \"uploads/\" });\n * ```\n */\n async upload(workspaceId: string, ...args: (string | { prefix?: string })[]): Promise<string[]> {\n let prefix: string | undefined;\n const paths: string[] = [];\n for (const arg of args) {\n if (typeof arg === \"string\") {\n paths.push(arg);\n } else if (typeof arg === \"object\" && arg !== null) {\n prefix = arg.prefix;\n }\n }\n if (paths.length === 0) {\n throw new Error(\"At least one file path is required\");\n }\n const items = paths.map((p) => ({\n name: basename(p),\n contentType: guessContentType(p),\n size: statSync(p).size,\n }));\n const resp = await this.uploadFiles(workspaceId, { files: items }, prefix ? { prefix } : undefined);\n for (let i = 0; i < paths.length; i++) {\n const body = readFileSync(paths[i]);\n const res = await fetch(resp.files[i].uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": items[i].contentType },\n body,\n });\n if (!res.ok) throw new Error(`Upload failed: ${res.status} ${res.statusText}`);\n }\n return resp.files.map((f) => f.path);\n }\n\n /**\n * Download a single file from a workspace. Returns the local path.\n *\n * ```ts\n * const local = await client.workspaces.download(wsId, \"uploads/data.csv\", { to: \"./data.csv\" });\n * ```\n */\n async download(workspaceId: string, path: string, options?: { to?: string }): Promise<string> {\n const fileList = await this.files(workspaceId, { prefix: path, includeUrls: true });\n const match = fileList.files?.find((f) => f.path === path);\n if (!match) throw new Error(`File not found in workspace: ${path}`);\n const dest = options?.to ?? basename(match.path);\n mkdirSync(dirname(dest), { recursive: true });\n const resp = await fetch(match.url!);\n if (!resp.ok) throw new Error(`Download failed: ${resp.status}`);\n writeFileSync(dest, Buffer.from(await resp.arrayBuffer()));\n return dest;\n }\n\n /**\n * Download all files from a workspace. Returns list of local paths.\n *\n * ```ts\n * const paths = await client.workspaces.downloadAll(wsId, { to: \"./output\" });\n * ```\n */\n async downloadAll(workspaceId: string, options?: { to?: string; prefix?: string }): Promise<string[]> {\n const destDir = options?.to ?? \".\";\n mkdirSync(destDir, { recursive: true });\n const results: string[] = [];\n let cursor: string | undefined;\n do {\n const fileList = await this.files(workspaceId, {\n prefix: options?.prefix,\n includeUrls: true,\n cursor,\n });\n for (const f of fileList.files ?? []) {\n const local = safeJoin(destDir, f.path);\n mkdirSync(dirname(local), { recursive: true });\n const resp = await fetch(f.url!);\n if (!resp.ok) throw new Error(`Download failed for ${f.path}: ${resp.status}`);\n writeFileSync(local, Buffer.from(await resp.arrayBuffer()));\n results.push(local);\n }\n cursor = fileList.hasMore ? (fileList.nextCursor ?? undefined) : undefined;\n } while (cursor);\n return results;\n }\n}\n","import type { z } from \"zod\";\nimport type { components } from \"../generated/v3/types.js\";\nimport type { Sessions } from \"./resources/sessions.js\";\n\ntype SessionResponse = components[\"schemas\"][\"SessionResponse\"];\ntype MessageResponse = components[\"schemas\"][\"MessageResponse\"];\n\nconst TERMINAL_STATUSES = new Set([\"idle\", \"stopped\", \"timed_out\", \"error\"]);\n\nexport interface RunOptions {\n /** Maximum time to wait in milliseconds. Default: 14_400_000 (4 hours). */\n timeout?: number;\n /** Polling interval in milliseconds. Default: 2_000. */\n interval?: number;\n /** @internal Starting message cursor for follow-up runs on an existing session. */\n _startCursor?: string;\n}\n\n/** Session result with typed output. All SessionResponse fields are directly accessible. */\nexport type SessionResult<T = string | null> = Omit<SessionResponse, \"output\"> & { output: T };\n\n/**\n * Dual-purpose session handle: `await` it for a typed SessionResult,\n * or access `.result` for the full SessionResult after resolution.\n */\nexport class SessionRun<T = string> implements PromiseLike<SessionResult<T>> {\n private readonly _createPromise: Promise<SessionResponse>;\n private readonly _sessions: Sessions;\n private readonly _schema?: z.ZodType<T>;\n private readonly _timeout: number;\n private readonly _interval: number;\n private readonly _options?: RunOptions;\n private _sessionId: string | null = null;\n private _result: SessionResult<T> | null = null;\n\n constructor(\n createPromise: Promise<SessionResponse>,\n sessions: Sessions,\n schema?: z.ZodType<T>,\n options?: RunOptions,\n ) {\n this._createPromise = createPromise;\n this._sessions = sessions;\n this._schema = schema;\n this._timeout = options?.timeout ?? 14_400_000;\n this._interval = options?.interval ?? 2_000;\n this._options = options;\n }\n\n /** The session ID, available after task creation resolves. */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /** The full SessionResult, available after polling completes. */\n get result(): SessionResult<T> | null {\n return this._result;\n }\n\n /** Enable `await client.run(...)` — polls until terminal, returns SessionResult. */\n then<R1 = SessionResult<T>, R2 = never>(\n onFulfilled?:\n | ((value: SessionResult<T>) => R1 | PromiseLike<R1>)\n | null,\n onRejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null,\n ): Promise<R1 | R2> {\n return this._waitForOutput().then(onFulfilled, onRejected);\n }\n\n private async _ensureSessionId(): Promise<string> {\n if (this._sessionId) return this._sessionId;\n const created = await this._createPromise;\n this._sessionId = created.id;\n return this._sessionId;\n }\n\n /** Poll session until terminal, return SessionResult. */\n private async _waitForOutput(): Promise<SessionResult<T>> {\n const sessionId = await this._ensureSessionId();\n const deadline = Date.now() + this._timeout;\n\n while (Date.now() < deadline) {\n const session = await this._sessions.get(sessionId);\n if (TERMINAL_STATUSES.has(session.status)) {\n const { output, ...rest } = session;\n const parsed = this._parseOutput(output);\n this._result = { ...rest, output: parsed } as SessionResult<T>;\n return this._result;\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) =>\n setTimeout(r, Math.min(this._interval, remaining)),\n );\n }\n\n throw new Error(\n `Session ${sessionId} did not complete within ${this._timeout}ms`,\n );\n }\n\n /**\n * Enable `for await (const msg of client.run(...))` — yields messages as they appear.\n * After iteration, `.result` contains the final SessionResult.\n */\n async *[Symbol.asyncIterator](): AsyncGenerator<MessageResponse> {\n const sessionId = await this._ensureSessionId();\n let cursor: string | undefined = this._options?._startCursor;\n const deadline = Date.now() + this._timeout;\n\n while (Date.now() < deadline) {\n const resp = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });\n for (const msg of resp.messages) {\n yield msg;\n cursor = msg.id;\n }\n\n const session = await this._sessions.get(sessionId);\n if (TERMINAL_STATUSES.has(session.status)) {\n // Drain all remaining messages (may be multiple pages)\n while (true) {\n const page = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });\n if (!page.messages.length) break;\n for (const msg of page.messages) {\n yield msg;\n cursor = msg.id;\n }\n }\n const { output, ...rest } = session;\n this._result = { ...rest, output: this._parseOutput(output) } as SessionResult<T>;\n return;\n }\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) => setTimeout(r, Math.min(this._interval, remaining)));\n }\n\n throw new Error(`Session ${sessionId} did not complete within ${this._timeout}ms`);\n }\n\n private _parseOutput(output: unknown): T {\n if (output == null) return null as T;\n if (!this._schema) return output as unknown as T;\n const raw = typeof output === \"string\" ? JSON.parse(output) : output;\n return this._schema.parse(raw);\n }\n}\n"]}
|
package/dist/v3.d.cts
CHANGED
|
@@ -475,6 +475,12 @@ interface components {
|
|
|
475
475
|
summary: string;
|
|
476
476
|
/** Screenshoturl */
|
|
477
477
|
screenshotUrl?: string | null;
|
|
478
|
+
/**
|
|
479
|
+
* Hidden
|
|
480
|
+
* @description Whether this message should be hidden from the user in a chat UI.
|
|
481
|
+
* @default false
|
|
482
|
+
*/
|
|
483
|
+
hidden: boolean;
|
|
478
484
|
/**
|
|
479
485
|
* Createdat
|
|
480
486
|
* Format: date-time
|
|
@@ -717,7 +723,8 @@ interface components {
|
|
|
717
723
|
*/
|
|
718
724
|
id: string;
|
|
719
725
|
status: components["schemas"]["BuAgentSessionStatus"];
|
|
720
|
-
model
|
|
726
|
+
/** The model used. May be a BuModel alias or a resolved model name. */
|
|
727
|
+
model: string;
|
|
721
728
|
/** Title */
|
|
722
729
|
title?: string | null;
|
|
723
730
|
/** Output */
|
|
@@ -957,7 +964,7 @@ declare class Browsers {
|
|
|
957
964
|
private readonly http;
|
|
958
965
|
constructor(http: HttpClient);
|
|
959
966
|
/** Create a standalone browser session. */
|
|
960
|
-
create(body?: CreateBrowserSessionRequest$1): Promise<BrowserSessionItemView$1>;
|
|
967
|
+
create(body?: Partial<CreateBrowserSessionRequest$1>): Promise<BrowserSessionItemView$1>;
|
|
961
968
|
/** List browser sessions for the authenticated project. */
|
|
962
969
|
list(params?: BrowserListParams): Promise<BrowserSessionListResponse$1>;
|
|
963
970
|
/** Get browser session details. */
|
|
@@ -1095,9 +1102,12 @@ declare class Workspaces {
|
|
|
1095
1102
|
*
|
|
1096
1103
|
* ```ts
|
|
1097
1104
|
* await client.workspaces.upload(wsId, "data.csv", "config.json");
|
|
1105
|
+
* await client.workspaces.upload(wsId, "data.csv", { prefix: "uploads/" });
|
|
1098
1106
|
* ```
|
|
1099
1107
|
*/
|
|
1100
|
-
upload(workspaceId: string, ...
|
|
1108
|
+
upload(workspaceId: string, ...args: (string | {
|
|
1109
|
+
prefix?: string;
|
|
1110
|
+
})[]): Promise<string[]>;
|
|
1101
1111
|
/**
|
|
1102
1112
|
* Download a single file from a workspace. Returns the local path.
|
|
1103
1113
|
*
|
|
@@ -1128,6 +1138,8 @@ interface RunOptions {
|
|
|
1128
1138
|
timeout?: number;
|
|
1129
1139
|
/** Polling interval in milliseconds. Default: 2_000. */
|
|
1130
1140
|
interval?: number;
|
|
1141
|
+
/** @internal Starting message cursor for follow-up runs on an existing session. */
|
|
1142
|
+
_startCursor?: string;
|
|
1131
1143
|
}
|
|
1132
1144
|
/** Session result with typed output. All SessionResponse fields are directly accessible. */
|
|
1133
1145
|
type SessionResult<T = string | null> = Omit<SessionResponse$1, "output"> & {
|
|
@@ -1143,6 +1155,7 @@ declare class SessionRun<T = string> implements PromiseLike<SessionResult<T>> {
|
|
|
1143
1155
|
private readonly _schema?;
|
|
1144
1156
|
private readonly _timeout;
|
|
1145
1157
|
private readonly _interval;
|
|
1158
|
+
private readonly _options?;
|
|
1146
1159
|
private _sessionId;
|
|
1147
1160
|
private _result;
|
|
1148
1161
|
constructor(createPromise: Promise<SessionResponse$1>, sessions: Sessions, schema?: z.ZodType<T>, options?: RunOptions);
|
package/dist/v3.d.ts
CHANGED
|
@@ -475,6 +475,12 @@ interface components {
|
|
|
475
475
|
summary: string;
|
|
476
476
|
/** Screenshoturl */
|
|
477
477
|
screenshotUrl?: string | null;
|
|
478
|
+
/**
|
|
479
|
+
* Hidden
|
|
480
|
+
* @description Whether this message should be hidden from the user in a chat UI.
|
|
481
|
+
* @default false
|
|
482
|
+
*/
|
|
483
|
+
hidden: boolean;
|
|
478
484
|
/**
|
|
479
485
|
* Createdat
|
|
480
486
|
* Format: date-time
|
|
@@ -717,7 +723,8 @@ interface components {
|
|
|
717
723
|
*/
|
|
718
724
|
id: string;
|
|
719
725
|
status: components["schemas"]["BuAgentSessionStatus"];
|
|
720
|
-
model
|
|
726
|
+
/** The model used. May be a BuModel alias or a resolved model name. */
|
|
727
|
+
model: string;
|
|
721
728
|
/** Title */
|
|
722
729
|
title?: string | null;
|
|
723
730
|
/** Output */
|
|
@@ -957,7 +964,7 @@ declare class Browsers {
|
|
|
957
964
|
private readonly http;
|
|
958
965
|
constructor(http: HttpClient);
|
|
959
966
|
/** Create a standalone browser session. */
|
|
960
|
-
create(body?: CreateBrowserSessionRequest$1): Promise<BrowserSessionItemView$1>;
|
|
967
|
+
create(body?: Partial<CreateBrowserSessionRequest$1>): Promise<BrowserSessionItemView$1>;
|
|
961
968
|
/** List browser sessions for the authenticated project. */
|
|
962
969
|
list(params?: BrowserListParams): Promise<BrowserSessionListResponse$1>;
|
|
963
970
|
/** Get browser session details. */
|
|
@@ -1095,9 +1102,12 @@ declare class Workspaces {
|
|
|
1095
1102
|
*
|
|
1096
1103
|
* ```ts
|
|
1097
1104
|
* await client.workspaces.upload(wsId, "data.csv", "config.json");
|
|
1105
|
+
* await client.workspaces.upload(wsId, "data.csv", { prefix: "uploads/" });
|
|
1098
1106
|
* ```
|
|
1099
1107
|
*/
|
|
1100
|
-
upload(workspaceId: string, ...
|
|
1108
|
+
upload(workspaceId: string, ...args: (string | {
|
|
1109
|
+
prefix?: string;
|
|
1110
|
+
})[]): Promise<string[]>;
|
|
1101
1111
|
/**
|
|
1102
1112
|
* Download a single file from a workspace. Returns the local path.
|
|
1103
1113
|
*
|
|
@@ -1128,6 +1138,8 @@ interface RunOptions {
|
|
|
1128
1138
|
timeout?: number;
|
|
1129
1139
|
/** Polling interval in milliseconds. Default: 2_000. */
|
|
1130
1140
|
interval?: number;
|
|
1141
|
+
/** @internal Starting message cursor for follow-up runs on an existing session. */
|
|
1142
|
+
_startCursor?: string;
|
|
1131
1143
|
}
|
|
1132
1144
|
/** Session result with typed output. All SessionResponse fields are directly accessible. */
|
|
1133
1145
|
type SessionResult<T = string | null> = Omit<SessionResponse$1, "output"> & {
|
|
@@ -1143,6 +1155,7 @@ declare class SessionRun<T = string> implements PromiseLike<SessionResult<T>> {
|
|
|
1143
1155
|
private readonly _schema?;
|
|
1144
1156
|
private readonly _timeout;
|
|
1145
1157
|
private readonly _interval;
|
|
1158
|
+
private readonly _options?;
|
|
1146
1159
|
private _sessionId;
|
|
1147
1160
|
private _result;
|
|
1148
1161
|
constructor(createPromise: Promise<SessionResponse$1>, sessions: Sessions, schema?: z.ZodType<T>, options?: RunOptions);
|
package/dist/v3.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BrowserUseError,
|
|
3
3
|
HttpClient
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6TSB5AIP.js";
|
|
5
5
|
|
|
6
6
|
// src/v3/client.ts
|
|
7
7
|
import { z } from "zod";
|
|
@@ -23,7 +23,10 @@ var Browsers = class {
|
|
|
23
23
|
this.http = http;
|
|
24
24
|
}
|
|
25
25
|
/** Create a standalone browser session. */
|
|
26
|
-
create(body) {
|
|
26
|
+
create(body = {}) {
|
|
27
|
+
if (body.proxyCountryCode) {
|
|
28
|
+
body = { ...body, proxyCountryCode: body.proxyCountryCode.toLowerCase() };
|
|
29
|
+
}
|
|
27
30
|
return this.http.post("/browsers", body);
|
|
28
31
|
}
|
|
29
32
|
/** List browser sessions for the authenticated project. */
|
|
@@ -229,15 +232,28 @@ var Workspaces = class {
|
|
|
229
232
|
*
|
|
230
233
|
* ```ts
|
|
231
234
|
* await client.workspaces.upload(wsId, "data.csv", "config.json");
|
|
235
|
+
* await client.workspaces.upload(wsId, "data.csv", { prefix: "uploads/" });
|
|
232
236
|
* ```
|
|
233
237
|
*/
|
|
234
|
-
async upload(workspaceId, ...
|
|
238
|
+
async upload(workspaceId, ...args) {
|
|
239
|
+
let prefix;
|
|
240
|
+
const paths = [];
|
|
241
|
+
for (const arg of args) {
|
|
242
|
+
if (typeof arg === "string") {
|
|
243
|
+
paths.push(arg);
|
|
244
|
+
} else if (typeof arg === "object" && arg !== null) {
|
|
245
|
+
prefix = arg.prefix;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (paths.length === 0) {
|
|
249
|
+
throw new Error("At least one file path is required");
|
|
250
|
+
}
|
|
235
251
|
const items = paths.map((p) => ({
|
|
236
252
|
name: basename(p),
|
|
237
253
|
contentType: guessContentType(p),
|
|
238
254
|
size: statSync(p).size
|
|
239
255
|
}));
|
|
240
|
-
const resp = await this.uploadFiles(workspaceId, { files: items });
|
|
256
|
+
const resp = await this.uploadFiles(workspaceId, { files: items }, prefix ? { prefix } : void 0);
|
|
241
257
|
for (let i = 0; i < paths.length; i++) {
|
|
242
258
|
const body = readFileSync(paths[i]);
|
|
243
259
|
const res = await fetch(resp.files[i].uploadUrl, {
|
|
@@ -307,6 +323,7 @@ var SessionRun = class {
|
|
|
307
323
|
_schema;
|
|
308
324
|
_timeout;
|
|
309
325
|
_interval;
|
|
326
|
+
_options;
|
|
310
327
|
_sessionId = null;
|
|
311
328
|
_result = null;
|
|
312
329
|
constructor(createPromise, sessions, schema, options) {
|
|
@@ -315,6 +332,7 @@ var SessionRun = class {
|
|
|
315
332
|
this._schema = schema;
|
|
316
333
|
this._timeout = options?.timeout ?? 144e5;
|
|
317
334
|
this._interval = options?.interval ?? 2e3;
|
|
335
|
+
this._options = options;
|
|
318
336
|
}
|
|
319
337
|
/** The session ID, available after task creation resolves. */
|
|
320
338
|
get sessionId() {
|
|
@@ -362,7 +380,7 @@ var SessionRun = class {
|
|
|
362
380
|
*/
|
|
363
381
|
async *[Symbol.asyncIterator]() {
|
|
364
382
|
const sessionId = await this._ensureSessionId();
|
|
365
|
-
let cursor;
|
|
383
|
+
let cursor = this._options?._startCursor;
|
|
366
384
|
const deadline = Date.now() + this._timeout;
|
|
367
385
|
while (Date.now() < deadline) {
|
|
368
386
|
const resp = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });
|
|
@@ -429,12 +447,31 @@ var BrowserUse = class {
|
|
|
429
447
|
run(task, options) {
|
|
430
448
|
const { schema, timeout, interval, ...rest } = options ?? {};
|
|
431
449
|
const body = { task, ...rest };
|
|
450
|
+
if (body.proxyCountryCode) {
|
|
451
|
+
body.proxyCountryCode = body.proxyCountryCode.toLowerCase();
|
|
452
|
+
}
|
|
432
453
|
if (schema) {
|
|
433
454
|
body.outputSchema = z.toJSONSchema(schema);
|
|
434
455
|
}
|
|
435
456
|
if (body.sessionId && body.keepAlive === void 0) {
|
|
436
457
|
body.keepAlive = true;
|
|
437
458
|
}
|
|
459
|
+
if (body.sessionId) {
|
|
460
|
+
const sid = body.sessionId;
|
|
461
|
+
const sessions = this.sessions;
|
|
462
|
+
let startCursor;
|
|
463
|
+
const promise2 = sessions.messages(sid, { limit: 1 }).then((resp) => {
|
|
464
|
+
const last = resp.messages[resp.messages.length - 1];
|
|
465
|
+
startCursor = last?.id;
|
|
466
|
+
}).then(() => sessions.create(body));
|
|
467
|
+
return new SessionRun(promise2, this.sessions, schema, {
|
|
468
|
+
timeout,
|
|
469
|
+
interval,
|
|
470
|
+
get _startCursor() {
|
|
471
|
+
return startCursor;
|
|
472
|
+
}
|
|
473
|
+
});
|
|
474
|
+
}
|
|
438
475
|
const promise = this.sessions.create(body);
|
|
439
476
|
return new SessionRun(promise, this.sessions, schema, { timeout, interval });
|
|
440
477
|
}
|
package/dist/v3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/v3/client.ts","../src/v3/resources/billing.ts","../src/v3/resources/browsers.ts","../src/v3/resources/profiles.ts","../src/v3/resources/sessions.ts","../src/v3/resources/workspaces.ts","../src/v3/helpers.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { HttpClient } from \"../core/http.js\";\nimport { Billing } from \"./resources/billing.js\";\nimport { Browsers } from \"./resources/browsers.js\";\nimport { Profiles } from \"./resources/profiles.js\";\nimport { Sessions } from \"./resources/sessions.js\";\nimport { Workspaces } from \"./resources/workspaces.js\";\nimport { SessionRun } from \"./helpers.js\";\nimport type { components } from \"../generated/v3/types.js\";\nimport type { RunOptions } from \"./helpers.js\";\n\ntype RunTaskRequest = components[\"schemas\"][\"RunTaskRequest\"];\n\nconst DEFAULT_BASE_URL = \"https://api.browser-use.com/api/v3\";\n\nexport interface BrowserUseOptions {\n apiKey?: string;\n baseUrl?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport type RunSessionOptions = Partial<Omit<RunTaskRequest, \"task\">> &\n RunOptions & { schema?: z.ZodType };\n\nexport class BrowserUse {\n readonly billing: Billing;\n readonly browsers: Browsers;\n readonly profiles: Profiles;\n readonly sessions: Sessions;\n readonly workspaces: Workspaces;\n\n private readonly http: HttpClient;\n\n constructor(options: BrowserUseOptions = {}) {\n const apiKey =\n options.apiKey ?? process.env.BROWSER_USE_API_KEY ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"No API key provided. Pass apiKey or set BROWSER_USE_API_KEY.\",\n );\n }\n this.http = new HttpClient({\n apiKey,\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n maxRetries: options.maxRetries,\n timeout: options.timeout,\n });\n\n this.billing = new Billing(this.http);\n this.browsers = new Browsers(this.http);\n this.profiles = new Profiles(this.http);\n this.sessions = new Sessions(this.http);\n this.workspaces = new Workspaces(this.http);\n }\n\n /**\n * Create a session and run a task. `await` the result for a typed SessionResult.\n *\n * ```ts\n * // Simple — just get the output\n * const result = await client.run(\"Find the top HN post\");\n * console.log(result.output);\n *\n * // Structured output (Zod)\n * const result = await client.run(\"Find product info\", { schema: ProductSchema });\n * console.log(result.output.name); // fully typed\n * ```\n */\n run(task: string, options?: Omit<RunSessionOptions, \"schema\">): SessionRun<string>;\n run<T extends z.ZodType>(task: string, options: RunSessionOptions & { schema: T }): SessionRun<z.output<T>>;\n run(task: string, options?: RunSessionOptions): SessionRun<any> {\n const { schema, timeout, interval, ...rest } = options ?? {};\n const body = { task, ...rest } as RunTaskRequest;\n if (schema) {\n body.outputSchema = z.toJSONSchema(schema) as Record<string, unknown>;\n }\n // Auto keep_alive when dispatching to an existing session\n if (body.sessionId && body.keepAlive === undefined) {\n body.keepAlive = true;\n }\n const promise = this.sessions.create(body);\n return new SessionRun(promise, this.sessions, schema, { timeout, interval });\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype AccountView = components[\"schemas\"][\"AccountView\"];\n\nexport class Billing {\n constructor(private readonly http: HttpClient) {}\n\n /** Get account billing information. */\n account(): Promise<AccountView> {\n return this.http.get<AccountView>(\"/billing/account\");\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype CreateBrowserSessionRequest = components[\"schemas\"][\"CreateBrowserSessionRequest\"];\ntype BrowserSessionItemView = components[\"schemas\"][\"BrowserSessionItemView\"];\ntype BrowserSessionView = components[\"schemas\"][\"BrowserSessionView\"];\ntype BrowserSessionListResponse = components[\"schemas\"][\"BrowserSessionListResponse\"];\ntype UpdateBrowserSessionRequest = components[\"schemas\"][\"UpdateBrowserSessionRequest\"];\n\nexport interface BrowserListParams {\n page?: number;\n page_size?: number;\n}\n\nexport class Browsers {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a standalone browser session. */\n create(body?: CreateBrowserSessionRequest): Promise<BrowserSessionItemView> {\n return this.http.post<BrowserSessionItemView>(\"/browsers\", body);\n }\n\n /** List browser sessions for the authenticated project. */\n list(params?: BrowserListParams): Promise<BrowserSessionListResponse> {\n return this.http.get<BrowserSessionListResponse>(\"/browsers\", params as Record<string, unknown>);\n }\n\n /** Get browser session details. */\n get(sessionId: string): Promise<BrowserSessionView> {\n return this.http.get<BrowserSessionView>(`/browsers/${sessionId}`);\n }\n\n /** Update a browser session (e.g. stop it). */\n update(sessionId: string, body: UpdateBrowserSessionRequest): Promise<BrowserSessionView> {\n return this.http.patch<BrowserSessionView>(`/browsers/${sessionId}`, body);\n }\n\n /** Stop a browser session. Convenience wrapper around update. */\n stop(sessionId: string): Promise<BrowserSessionView> {\n return this.update(sessionId, { action: \"stop\" });\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype ProfileView = components[\"schemas\"][\"ProfileView\"];\ntype ProfileListResponse = components[\"schemas\"][\"ProfileListResponse\"];\ntype ProfileCreateRequest = components[\"schemas\"][\"ProfileCreateRequest\"];\ntype ProfileUpdateRequest = components[\"schemas\"][\"ProfileUpdateRequest\"];\n\nexport interface ProfileListParams {\n query?: string;\n page?: number;\n page_size?: number;\n}\n\nexport class Profiles {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a browser profile. */\n create(body?: ProfileCreateRequest): Promise<ProfileView> {\n return this.http.post<ProfileView>(\"/profiles\", body);\n }\n\n /** List profiles for the authenticated project. */\n list(params?: ProfileListParams): Promise<ProfileListResponse> {\n return this.http.get<ProfileListResponse>(\"/profiles\", params as Record<string, unknown>);\n }\n\n /** Get profile details. */\n get(profileId: string): Promise<ProfileView> {\n return this.http.get<ProfileView>(`/profiles/${profileId}`);\n }\n\n /** Update a profile. */\n update(profileId: string, body: ProfileUpdateRequest): Promise<ProfileView> {\n return this.http.patch<ProfileView>(`/profiles/${profileId}`, body);\n }\n\n /** Delete a profile. */\n delete(profileId: string): Promise<void> {\n return this.http.delete<void>(`/profiles/${profileId}`);\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype RunTaskRequest = components[\"schemas\"][\"RunTaskRequest\"];\n/** All fields optional — omit `task` to create an idle session. */\nexport type CreateSessionBody = Partial<RunTaskRequest>;\ntype SessionResponse = components[\"schemas\"][\"SessionResponse\"];\ntype SessionListResponse = components[\"schemas\"][\"SessionListResponse\"];\ntype FileListResponse = components[\"schemas\"][\"FileListResponse\"];\ntype StopSessionRequest = components[\"schemas\"][\"StopSessionRequest\"];\ntype FileUploadRequest = components[\"schemas\"][\"FileUploadRequest\"];\ntype FileUploadResponse = components[\"schemas\"][\"FileUploadResponse\"];\ntype MessageListResponse = components[\"schemas\"][\"MessageListResponse\"];\n\nexport interface SessionListParams {\n page?: number;\n page_size?: number;\n}\n\nexport interface SessionFilesParams {\n prefix?: string;\n limit?: number;\n cursor?: string | null;\n includeUrls?: boolean;\n shallow?: boolean;\n}\n\nexport interface SessionMessagesParams {\n after?: string | null;\n before?: string | null;\n limit?: number;\n}\n\nexport class Sessions {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a session and optionally dispatch a task. */\n create(body?: CreateSessionBody): Promise<SessionResponse> {\n return this.http.post<SessionResponse>(\"/sessions\", body ?? {});\n }\n\n /** List sessions for the authenticated project. */\n list(params?: SessionListParams): Promise<SessionListResponse> {\n return this.http.get<SessionListResponse>(\"/sessions\", params as Record<string, unknown>);\n }\n\n /** Get session details. */\n get(sessionId: string): Promise<SessionResponse> {\n return this.http.get<SessionResponse>(`/sessions/${sessionId}`);\n }\n\n /** Stop a session or the running task. */\n stop(sessionId: string, body?: StopSessionRequest): Promise<SessionResponse> {\n return this.http.post<SessionResponse>(`/sessions/${sessionId}/stop`, body);\n }\n\n /** Soft-delete a session. */\n delete(sessionId: string): Promise<void> {\n return this.http.delete<void>(`/sessions/${sessionId}`);\n }\n\n /** Get presigned upload URLs for session files. */\n uploadFiles(sessionId: string, body: FileUploadRequest): Promise<FileUploadResponse> {\n return this.http.post<FileUploadResponse>(`/sessions/${sessionId}/files/upload`, body);\n }\n\n /** List files in a session's workspace. */\n files(sessionId: string, params?: SessionFilesParams): Promise<FileListResponse> {\n return this.http.get<FileListResponse>(\n `/sessions/${sessionId}/files`,\n params as Record<string, unknown>,\n );\n }\n\n /** List messages for a session with cursor-based pagination. */\n messages(sessionId: string, params?: SessionMessagesParams): Promise<MessageListResponse> {\n return this.http.get<MessageListResponse>(\n `/sessions/${sessionId}/messages`,\n params as Record<string, unknown>,\n );\n }\n\n /**\n * Poll until recording URLs are available. Returns presigned MP4 URLs.\n *\n * Returns an empty array if no recording was produced (e.g. the agent\n * answered without opening a browser, or recording was not enabled).\n */\n async waitForRecording(\n sessionId: string,\n options?: { timeout?: number; interval?: number },\n ): Promise<string[]> {\n const timeout = options?.timeout ?? 15_000;\n const interval = options?.interval ?? 2_000;\n const deadline = Date.now() + timeout;\n while (Date.now() < deadline) {\n const session = await this.get(sessionId);\n if (session.recordingUrls?.length) return session.recordingUrls;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) => setTimeout(r, Math.min(interval, remaining)));\n }\n return [];\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, statSync } from \"fs\";\nimport { basename, dirname, extname, join, resolve } from \"path\";\nimport type { HttpClient } from \"../../core/http.js\";\n\nfunction safeJoin(base: string, untrusted: string): string {\n const baseResolved = resolve(base) + \"/\";\n const resolved = resolve(base, untrusted);\n if (resolved !== resolve(base) && !resolved.startsWith(baseResolved)) {\n throw new Error(`Path traversal detected: ${untrusted}`);\n }\n return resolved;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n \".csv\": \"text/csv\",\n \".json\": \"application/json\",\n \".txt\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".html\": \"text/html\",\n \".xml\": \"application/xml\",\n \".yaml\": \"application/yaml\",\n \".yml\": \"application/yaml\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".xls\": \"application/vnd.ms-excel\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".doc\": \"application/msword\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n};\n\nfunction guessContentType(path: string): string {\n return MIME_TYPES[extname(path).toLowerCase()] ?? \"application/octet-stream\";\n}\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype WorkspaceView = components[\"schemas\"][\"WorkspaceView\"];\ntype WorkspaceListResponse = components[\"schemas\"][\"WorkspaceListResponse\"];\ntype WorkspaceCreateRequest = components[\"schemas\"][\"WorkspaceCreateRequest\"];\ntype WorkspaceUpdateRequest = components[\"schemas\"][\"WorkspaceUpdateRequest\"];\ntype FileListResponse = components[\"schemas\"][\"FileListResponse\"];\ntype FileUploadRequest = components[\"schemas\"][\"FileUploadRequest\"];\ntype FileUploadResponse = components[\"schemas\"][\"FileUploadResponse\"];\n\nexport interface WorkspaceListParams {\n pageSize?: number;\n pageNumber?: number;\n}\n\nexport interface WorkspaceFilesParams {\n prefix?: string;\n limit?: number;\n cursor?: string | null;\n includeUrls?: boolean;\n shallow?: boolean;\n}\n\nexport class Workspaces {\n constructor(private readonly http: HttpClient) {}\n\n /** List workspaces for the authenticated project. */\n list(params?: WorkspaceListParams): Promise<WorkspaceListResponse> {\n return this.http.get<WorkspaceListResponse>(\"/workspaces\", params as Record<string, unknown>);\n }\n\n /** Create a new workspace. */\n create(body?: WorkspaceCreateRequest): Promise<WorkspaceView> {\n return this.http.post<WorkspaceView>(\"/workspaces\", body);\n }\n\n /** Get workspace details. */\n get(workspaceId: string): Promise<WorkspaceView> {\n return this.http.get<WorkspaceView>(`/workspaces/${workspaceId}`);\n }\n\n /** Update a workspace. */\n update(workspaceId: string, body: WorkspaceUpdateRequest): Promise<WorkspaceView> {\n return this.http.patch<WorkspaceView>(`/workspaces/${workspaceId}`, body);\n }\n\n /** Delete a workspace and its data. */\n delete(workspaceId: string): Promise<void> {\n return this.http.delete<void>(`/workspaces/${workspaceId}`);\n }\n\n /** List files in a workspace. */\n files(workspaceId: string, params?: WorkspaceFilesParams): Promise<FileListResponse> {\n return this.http.get<FileListResponse>(\n `/workspaces/${workspaceId}/files`,\n params as Record<string, unknown>,\n );\n }\n\n /** Get presigned upload URLs for workspace files. */\n uploadFiles(workspaceId: string, body: FileUploadRequest, query?: { prefix?: string }): Promise<FileUploadResponse> {\n return this.http.post<FileUploadResponse>(\n `/workspaces/${workspaceId}/files/upload`,\n body,\n query as Record<string, unknown>,\n );\n }\n\n /** Delete a file from a workspace. */\n deleteFile(workspaceId: string, path: string): Promise<void> {\n return this.http.delete<void>(`/workspaces/${workspaceId}/files`, { path });\n }\n\n /** Get storage usage for a workspace. */\n size(workspaceId: string): Promise<unknown> {\n return this.http.get<unknown>(`/workspaces/${workspaceId}/size`);\n }\n\n /**\n * Upload local files to a workspace. Returns the list of remote paths.\n *\n * ```ts\n * await client.workspaces.upload(wsId, \"data.csv\", \"config.json\");\n * ```\n */\n async upload(workspaceId: string, ...paths: string[]): Promise<string[]> {\n const items = paths.map((p) => ({\n name: basename(p),\n contentType: guessContentType(p),\n size: statSync(p).size,\n }));\n const resp = await this.uploadFiles(workspaceId, { files: items });\n for (let i = 0; i < paths.length; i++) {\n const body = readFileSync(paths[i]);\n const res = await fetch(resp.files[i].uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": items[i].contentType },\n body,\n });\n if (!res.ok) throw new Error(`Upload failed: ${res.status} ${res.statusText}`);\n }\n return resp.files.map((f) => f.path);\n }\n\n /**\n * Download a single file from a workspace. Returns the local path.\n *\n * ```ts\n * const local = await client.workspaces.download(wsId, \"uploads/data.csv\", { to: \"./data.csv\" });\n * ```\n */\n async download(workspaceId: string, path: string, options?: { to?: string }): Promise<string> {\n const fileList = await this.files(workspaceId, { prefix: path, includeUrls: true });\n const match = fileList.files?.find((f) => f.path === path);\n if (!match) throw new Error(`File not found in workspace: ${path}`);\n const dest = options?.to ?? basename(match.path);\n mkdirSync(dirname(dest), { recursive: true });\n const resp = await fetch(match.url!);\n if (!resp.ok) throw new Error(`Download failed: ${resp.status}`);\n writeFileSync(dest, Buffer.from(await resp.arrayBuffer()));\n return dest;\n }\n\n /**\n * Download all files from a workspace. Returns list of local paths.\n *\n * ```ts\n * const paths = await client.workspaces.downloadAll(wsId, { to: \"./output\" });\n * ```\n */\n async downloadAll(workspaceId: string, options?: { to?: string; prefix?: string }): Promise<string[]> {\n const destDir = options?.to ?? \".\";\n mkdirSync(destDir, { recursive: true });\n const results: string[] = [];\n let cursor: string | undefined;\n do {\n const fileList = await this.files(workspaceId, {\n prefix: options?.prefix,\n includeUrls: true,\n cursor,\n });\n for (const f of fileList.files ?? []) {\n const local = safeJoin(destDir, f.path);\n mkdirSync(dirname(local), { recursive: true });\n const resp = await fetch(f.url!);\n if (!resp.ok) throw new Error(`Download failed for ${f.path}: ${resp.status}`);\n writeFileSync(local, Buffer.from(await resp.arrayBuffer()));\n results.push(local);\n }\n cursor = fileList.hasMore ? (fileList.nextCursor ?? undefined) : undefined;\n } while (cursor);\n return results;\n }\n}\n","import type { z } from \"zod\";\nimport type { components } from \"../generated/v3/types.js\";\nimport type { Sessions } from \"./resources/sessions.js\";\n\ntype SessionResponse = components[\"schemas\"][\"SessionResponse\"];\ntype MessageResponse = components[\"schemas\"][\"MessageResponse\"];\n\nconst TERMINAL_STATUSES = new Set([\"idle\", \"stopped\", \"timed_out\", \"error\"]);\n\nexport interface RunOptions {\n /** Maximum time to wait in milliseconds. Default: 14_400_000 (4 hours). */\n timeout?: number;\n /** Polling interval in milliseconds. Default: 2_000. */\n interval?: number;\n}\n\n/** Session result with typed output. All SessionResponse fields are directly accessible. */\nexport type SessionResult<T = string | null> = Omit<SessionResponse, \"output\"> & { output: T };\n\n/**\n * Dual-purpose session handle: `await` it for a typed SessionResult,\n * or access `.result` for the full SessionResult after resolution.\n */\nexport class SessionRun<T = string> implements PromiseLike<SessionResult<T>> {\n private readonly _createPromise: Promise<SessionResponse>;\n private readonly _sessions: Sessions;\n private readonly _schema?: z.ZodType<T>;\n private readonly _timeout: number;\n private readonly _interval: number;\n private _sessionId: string | null = null;\n private _result: SessionResult<T> | null = null;\n\n constructor(\n createPromise: Promise<SessionResponse>,\n sessions: Sessions,\n schema?: z.ZodType<T>,\n options?: RunOptions,\n ) {\n this._createPromise = createPromise;\n this._sessions = sessions;\n this._schema = schema;\n this._timeout = options?.timeout ?? 14_400_000;\n this._interval = options?.interval ?? 2_000;\n }\n\n /** The session ID, available after task creation resolves. */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /** The full SessionResult, available after polling completes. */\n get result(): SessionResult<T> | null {\n return this._result;\n }\n\n /** Enable `await client.run(...)` — polls until terminal, returns SessionResult. */\n then<R1 = SessionResult<T>, R2 = never>(\n onFulfilled?:\n | ((value: SessionResult<T>) => R1 | PromiseLike<R1>)\n | null,\n onRejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null,\n ): Promise<R1 | R2> {\n return this._waitForOutput().then(onFulfilled, onRejected);\n }\n\n private async _ensureSessionId(): Promise<string> {\n if (this._sessionId) return this._sessionId;\n const created = await this._createPromise;\n this._sessionId = created.id;\n return this._sessionId;\n }\n\n /** Poll session until terminal, return SessionResult. */\n private async _waitForOutput(): Promise<SessionResult<T>> {\n const sessionId = await this._ensureSessionId();\n const deadline = Date.now() + this._timeout;\n\n while (Date.now() < deadline) {\n const session = await this._sessions.get(sessionId);\n if (TERMINAL_STATUSES.has(session.status)) {\n const { output, ...rest } = session;\n const parsed = this._parseOutput(output);\n this._result = { ...rest, output: parsed } as SessionResult<T>;\n return this._result;\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) =>\n setTimeout(r, Math.min(this._interval, remaining)),\n );\n }\n\n throw new Error(\n `Session ${sessionId} did not complete within ${this._timeout}ms`,\n );\n }\n\n /**\n * Enable `for await (const msg of client.run(...))` — yields messages as they appear.\n * After iteration, `.result` contains the final SessionResult.\n */\n async *[Symbol.asyncIterator](): AsyncGenerator<MessageResponse> {\n const sessionId = await this._ensureSessionId();\n let cursor: string | undefined;\n const deadline = Date.now() + this._timeout;\n\n while (Date.now() < deadline) {\n const resp = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });\n for (const msg of resp.messages) {\n yield msg;\n cursor = msg.id;\n }\n\n const session = await this._sessions.get(sessionId);\n if (TERMINAL_STATUSES.has(session.status)) {\n // Drain all remaining messages (may be multiple pages)\n while (true) {\n const page = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });\n if (!page.messages.length) break;\n for (const msg of page.messages) {\n yield msg;\n cursor = msg.id;\n }\n }\n const { output, ...rest } = session;\n this._result = { ...rest, output: this._parseOutput(output) } as SessionResult<T>;\n return;\n }\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) => setTimeout(r, Math.min(this._interval, remaining)));\n }\n\n throw new Error(`Session ${sessionId} did not complete within ${this._timeout}ms`);\n }\n\n private _parseOutput(output: unknown): T {\n if (output == null) return null as T;\n if (!this._schema) return output as unknown as T;\n const raw = typeof output === \"string\" ? JSON.parse(output) : output;\n return this._schema.parse(raw);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/v3/client.ts","../src/v3/resources/billing.ts","../src/v3/resources/browsers.ts","../src/v3/resources/profiles.ts","../src/v3/resources/sessions.ts","../src/v3/resources/workspaces.ts","../src/v3/helpers.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { HttpClient } from \"../core/http.js\";\nimport { Billing } from \"./resources/billing.js\";\nimport { Browsers } from \"./resources/browsers.js\";\nimport { Profiles } from \"./resources/profiles.js\";\nimport { Sessions } from \"./resources/sessions.js\";\nimport { Workspaces } from \"./resources/workspaces.js\";\nimport { SessionRun } from \"./helpers.js\";\nimport type { components } from \"../generated/v3/types.js\";\nimport type { RunOptions } from \"./helpers.js\";\n\ntype RunTaskRequest = components[\"schemas\"][\"RunTaskRequest\"];\n\nconst DEFAULT_BASE_URL = \"https://api.browser-use.com/api/v3\";\n\nexport interface BrowserUseOptions {\n apiKey?: string;\n baseUrl?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport type RunSessionOptions = Partial<Omit<RunTaskRequest, \"task\">> &\n RunOptions & { schema?: z.ZodType };\n\nexport class BrowserUse {\n readonly billing: Billing;\n readonly browsers: Browsers;\n readonly profiles: Profiles;\n readonly sessions: Sessions;\n readonly workspaces: Workspaces;\n\n private readonly http: HttpClient;\n\n constructor(options: BrowserUseOptions = {}) {\n const apiKey =\n options.apiKey ?? process.env.BROWSER_USE_API_KEY ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"No API key provided. Pass apiKey or set BROWSER_USE_API_KEY.\",\n );\n }\n this.http = new HttpClient({\n apiKey,\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n maxRetries: options.maxRetries,\n timeout: options.timeout,\n });\n\n this.billing = new Billing(this.http);\n this.browsers = new Browsers(this.http);\n this.profiles = new Profiles(this.http);\n this.sessions = new Sessions(this.http);\n this.workspaces = new Workspaces(this.http);\n }\n\n /**\n * Create a session and run a task. `await` the result for a typed SessionResult.\n *\n * ```ts\n * // Simple — just get the output\n * const result = await client.run(\"Find the top HN post\");\n * console.log(result.output);\n *\n * // Structured output (Zod)\n * const result = await client.run(\"Find product info\", { schema: ProductSchema });\n * console.log(result.output.name); // fully typed\n * ```\n */\n run(task: string, options?: Omit<RunSessionOptions, \"schema\">): SessionRun<string>;\n run<T extends z.ZodType>(task: string, options: RunSessionOptions & { schema: T }): SessionRun<z.output<T>>;\n run(task: string, options?: RunSessionOptions): SessionRun<any> {\n const { schema, timeout, interval, ...rest } = options ?? {};\n const body = { task, ...rest } as RunTaskRequest;\n if (body.proxyCountryCode) {\n body.proxyCountryCode = body.proxyCountryCode.toLowerCase() as any;\n }\n if (schema) {\n body.outputSchema = z.toJSONSchema(schema) as Record<string, unknown>;\n }\n // Auto keep_alive when dispatching to an existing session\n if (body.sessionId && body.keepAlive === undefined) {\n body.keepAlive = true;\n }\n // For follow-up runs on an existing session, snapshot the latest message\n // cursor before creating the new task so the iterator skips old messages.\n if (body.sessionId) {\n const sid = body.sessionId;\n const sessions = this.sessions;\n let startCursor: string | undefined;\n const promise = sessions\n .messages(sid, { limit: 1 })\n .then((resp) => {\n const last = resp.messages[resp.messages.length - 1];\n startCursor = last?.id;\n })\n .then(() => sessions.create(body));\n // startCursor is set before createPromise resolves, so the iterator\n // (which awaits _ensureSessionId first) will see the correct value.\n return new SessionRun(promise, this.sessions, schema, {\n timeout,\n interval,\n get _startCursor() { return startCursor; },\n });\n }\n const promise = this.sessions.create(body);\n return new SessionRun(promise, this.sessions, schema, { timeout, interval });\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype AccountView = components[\"schemas\"][\"AccountView\"];\n\nexport class Billing {\n constructor(private readonly http: HttpClient) {}\n\n /** Get account billing information. */\n account(): Promise<AccountView> {\n return this.http.get<AccountView>(\"/billing/account\");\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype CreateBrowserSessionRequest = components[\"schemas\"][\"CreateBrowserSessionRequest\"];\ntype BrowserSessionItemView = components[\"schemas\"][\"BrowserSessionItemView\"];\ntype BrowserSessionView = components[\"schemas\"][\"BrowserSessionView\"];\ntype BrowserSessionListResponse = components[\"schemas\"][\"BrowserSessionListResponse\"];\ntype UpdateBrowserSessionRequest = components[\"schemas\"][\"UpdateBrowserSessionRequest\"];\n\nexport interface BrowserListParams {\n page?: number;\n page_size?: number;\n}\n\nexport class Browsers {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a standalone browser session. */\n create(body: Partial<CreateBrowserSessionRequest> = {}): Promise<BrowserSessionItemView> {\n if (body.proxyCountryCode) {\n body = { ...body, proxyCountryCode: body.proxyCountryCode.toLowerCase() as any };\n }\n return this.http.post<BrowserSessionItemView>(\"/browsers\", body);\n }\n\n /** List browser sessions for the authenticated project. */\n list(params?: BrowserListParams): Promise<BrowserSessionListResponse> {\n return this.http.get<BrowserSessionListResponse>(\"/browsers\", params as Record<string, unknown>);\n }\n\n /** Get browser session details. */\n get(sessionId: string): Promise<BrowserSessionView> {\n return this.http.get<BrowserSessionView>(`/browsers/${sessionId}`);\n }\n\n /** Update a browser session (e.g. stop it). */\n update(sessionId: string, body: UpdateBrowserSessionRequest): Promise<BrowserSessionView> {\n return this.http.patch<BrowserSessionView>(`/browsers/${sessionId}`, body);\n }\n\n /** Stop a browser session. Convenience wrapper around update. */\n stop(sessionId: string): Promise<BrowserSessionView> {\n return this.update(sessionId, { action: \"stop\" });\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype ProfileView = components[\"schemas\"][\"ProfileView\"];\ntype ProfileListResponse = components[\"schemas\"][\"ProfileListResponse\"];\ntype ProfileCreateRequest = components[\"schemas\"][\"ProfileCreateRequest\"];\ntype ProfileUpdateRequest = components[\"schemas\"][\"ProfileUpdateRequest\"];\n\nexport interface ProfileListParams {\n query?: string;\n page?: number;\n page_size?: number;\n}\n\nexport class Profiles {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a browser profile. */\n create(body?: ProfileCreateRequest): Promise<ProfileView> {\n return this.http.post<ProfileView>(\"/profiles\", body);\n }\n\n /** List profiles for the authenticated project. */\n list(params?: ProfileListParams): Promise<ProfileListResponse> {\n return this.http.get<ProfileListResponse>(\"/profiles\", params as Record<string, unknown>);\n }\n\n /** Get profile details. */\n get(profileId: string): Promise<ProfileView> {\n return this.http.get<ProfileView>(`/profiles/${profileId}`);\n }\n\n /** Update a profile. */\n update(profileId: string, body: ProfileUpdateRequest): Promise<ProfileView> {\n return this.http.patch<ProfileView>(`/profiles/${profileId}`, body);\n }\n\n /** Delete a profile. */\n delete(profileId: string): Promise<void> {\n return this.http.delete<void>(`/profiles/${profileId}`);\n }\n}\n","import type { HttpClient } from \"../../core/http.js\";\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype RunTaskRequest = components[\"schemas\"][\"RunTaskRequest\"];\n/** All fields optional — omit `task` to create an idle session. */\nexport type CreateSessionBody = Partial<RunTaskRequest>;\ntype SessionResponse = components[\"schemas\"][\"SessionResponse\"];\ntype SessionListResponse = components[\"schemas\"][\"SessionListResponse\"];\ntype FileListResponse = components[\"schemas\"][\"FileListResponse\"];\ntype StopSessionRequest = components[\"schemas\"][\"StopSessionRequest\"];\ntype FileUploadRequest = components[\"schemas\"][\"FileUploadRequest\"];\ntype FileUploadResponse = components[\"schemas\"][\"FileUploadResponse\"];\ntype MessageListResponse = components[\"schemas\"][\"MessageListResponse\"];\n\nexport interface SessionListParams {\n page?: number;\n page_size?: number;\n}\n\nexport interface SessionFilesParams {\n prefix?: string;\n limit?: number;\n cursor?: string | null;\n includeUrls?: boolean;\n shallow?: boolean;\n}\n\nexport interface SessionMessagesParams {\n after?: string | null;\n before?: string | null;\n limit?: number;\n}\n\nexport class Sessions {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a session and optionally dispatch a task. */\n create(body?: CreateSessionBody): Promise<SessionResponse> {\n return this.http.post<SessionResponse>(\"/sessions\", body ?? {});\n }\n\n /** List sessions for the authenticated project. */\n list(params?: SessionListParams): Promise<SessionListResponse> {\n return this.http.get<SessionListResponse>(\"/sessions\", params as Record<string, unknown>);\n }\n\n /** Get session details. */\n get(sessionId: string): Promise<SessionResponse> {\n return this.http.get<SessionResponse>(`/sessions/${sessionId}`);\n }\n\n /** Stop a session or the running task. */\n stop(sessionId: string, body?: StopSessionRequest): Promise<SessionResponse> {\n return this.http.post<SessionResponse>(`/sessions/${sessionId}/stop`, body);\n }\n\n /** Soft-delete a session. */\n delete(sessionId: string): Promise<void> {\n return this.http.delete<void>(`/sessions/${sessionId}`);\n }\n\n /** Get presigned upload URLs for session files. */\n uploadFiles(sessionId: string, body: FileUploadRequest): Promise<FileUploadResponse> {\n return this.http.post<FileUploadResponse>(`/sessions/${sessionId}/files/upload`, body);\n }\n\n /** List files in a session's workspace. */\n files(sessionId: string, params?: SessionFilesParams): Promise<FileListResponse> {\n return this.http.get<FileListResponse>(\n `/sessions/${sessionId}/files`,\n params as Record<string, unknown>,\n );\n }\n\n /** List messages for a session with cursor-based pagination. */\n messages(sessionId: string, params?: SessionMessagesParams): Promise<MessageListResponse> {\n return this.http.get<MessageListResponse>(\n `/sessions/${sessionId}/messages`,\n params as Record<string, unknown>,\n );\n }\n\n /**\n * Poll until recording URLs are available. Returns presigned MP4 URLs.\n *\n * Returns an empty array if no recording was produced (e.g. the agent\n * answered without opening a browser, or recording was not enabled).\n */\n async waitForRecording(\n sessionId: string,\n options?: { timeout?: number; interval?: number },\n ): Promise<string[]> {\n const timeout = options?.timeout ?? 15_000;\n const interval = options?.interval ?? 2_000;\n const deadline = Date.now() + timeout;\n while (Date.now() < deadline) {\n const session = await this.get(sessionId);\n if (session.recordingUrls?.length) return session.recordingUrls;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) => setTimeout(r, Math.min(interval, remaining)));\n }\n return [];\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, statSync } from \"fs\";\nimport { basename, dirname, extname, join, resolve } from \"path\";\nimport type { HttpClient } from \"../../core/http.js\";\n\nfunction safeJoin(base: string, untrusted: string): string {\n const baseResolved = resolve(base) + \"/\";\n const resolved = resolve(base, untrusted);\n if (resolved !== resolve(base) && !resolved.startsWith(baseResolved)) {\n throw new Error(`Path traversal detected: ${untrusted}`);\n }\n return resolved;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n \".csv\": \"text/csv\",\n \".json\": \"application/json\",\n \".txt\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".html\": \"text/html\",\n \".xml\": \"application/xml\",\n \".yaml\": \"application/yaml\",\n \".yml\": \"application/yaml\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".xls\": \"application/vnd.ms-excel\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".doc\": \"application/msword\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n};\n\nfunction guessContentType(path: string): string {\n return MIME_TYPES[extname(path).toLowerCase()] ?? \"application/octet-stream\";\n}\nimport type { components } from \"../../generated/v3/types.js\";\n\ntype WorkspaceView = components[\"schemas\"][\"WorkspaceView\"];\ntype WorkspaceListResponse = components[\"schemas\"][\"WorkspaceListResponse\"];\ntype WorkspaceCreateRequest = components[\"schemas\"][\"WorkspaceCreateRequest\"];\ntype WorkspaceUpdateRequest = components[\"schemas\"][\"WorkspaceUpdateRequest\"];\ntype FileListResponse = components[\"schemas\"][\"FileListResponse\"];\ntype FileUploadRequest = components[\"schemas\"][\"FileUploadRequest\"];\ntype FileUploadResponse = components[\"schemas\"][\"FileUploadResponse\"];\n\nexport interface WorkspaceListParams {\n pageSize?: number;\n pageNumber?: number;\n}\n\nexport interface WorkspaceFilesParams {\n prefix?: string;\n limit?: number;\n cursor?: string | null;\n includeUrls?: boolean;\n shallow?: boolean;\n}\n\nexport class Workspaces {\n constructor(private readonly http: HttpClient) {}\n\n /** List workspaces for the authenticated project. */\n list(params?: WorkspaceListParams): Promise<WorkspaceListResponse> {\n return this.http.get<WorkspaceListResponse>(\"/workspaces\", params as Record<string, unknown>);\n }\n\n /** Create a new workspace. */\n create(body?: WorkspaceCreateRequest): Promise<WorkspaceView> {\n return this.http.post<WorkspaceView>(\"/workspaces\", body);\n }\n\n /** Get workspace details. */\n get(workspaceId: string): Promise<WorkspaceView> {\n return this.http.get<WorkspaceView>(`/workspaces/${workspaceId}`);\n }\n\n /** Update a workspace. */\n update(workspaceId: string, body: WorkspaceUpdateRequest): Promise<WorkspaceView> {\n return this.http.patch<WorkspaceView>(`/workspaces/${workspaceId}`, body);\n }\n\n /** Delete a workspace and its data. */\n delete(workspaceId: string): Promise<void> {\n return this.http.delete<void>(`/workspaces/${workspaceId}`);\n }\n\n /** List files in a workspace. */\n files(workspaceId: string, params?: WorkspaceFilesParams): Promise<FileListResponse> {\n return this.http.get<FileListResponse>(\n `/workspaces/${workspaceId}/files`,\n params as Record<string, unknown>,\n );\n }\n\n /** Get presigned upload URLs for workspace files. */\n uploadFiles(workspaceId: string, body: FileUploadRequest, query?: { prefix?: string }): Promise<FileUploadResponse> {\n return this.http.post<FileUploadResponse>(\n `/workspaces/${workspaceId}/files/upload`,\n body,\n query as Record<string, unknown>,\n );\n }\n\n /** Delete a file from a workspace. */\n deleteFile(workspaceId: string, path: string): Promise<void> {\n return this.http.delete<void>(`/workspaces/${workspaceId}/files`, { path });\n }\n\n /** Get storage usage for a workspace. */\n size(workspaceId: string): Promise<unknown> {\n return this.http.get<unknown>(`/workspaces/${workspaceId}/size`);\n }\n\n /**\n * Upload local files to a workspace. Returns the list of remote paths.\n *\n * ```ts\n * await client.workspaces.upload(wsId, \"data.csv\", \"config.json\");\n * await client.workspaces.upload(wsId, \"data.csv\", { prefix: \"uploads/\" });\n * ```\n */\n async upload(workspaceId: string, ...args: (string | { prefix?: string })[]): Promise<string[]> {\n let prefix: string | undefined;\n const paths: string[] = [];\n for (const arg of args) {\n if (typeof arg === \"string\") {\n paths.push(arg);\n } else if (typeof arg === \"object\" && arg !== null) {\n prefix = arg.prefix;\n }\n }\n if (paths.length === 0) {\n throw new Error(\"At least one file path is required\");\n }\n const items = paths.map((p) => ({\n name: basename(p),\n contentType: guessContentType(p),\n size: statSync(p).size,\n }));\n const resp = await this.uploadFiles(workspaceId, { files: items }, prefix ? { prefix } : undefined);\n for (let i = 0; i < paths.length; i++) {\n const body = readFileSync(paths[i]);\n const res = await fetch(resp.files[i].uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": items[i].contentType },\n body,\n });\n if (!res.ok) throw new Error(`Upload failed: ${res.status} ${res.statusText}`);\n }\n return resp.files.map((f) => f.path);\n }\n\n /**\n * Download a single file from a workspace. Returns the local path.\n *\n * ```ts\n * const local = await client.workspaces.download(wsId, \"uploads/data.csv\", { to: \"./data.csv\" });\n * ```\n */\n async download(workspaceId: string, path: string, options?: { to?: string }): Promise<string> {\n const fileList = await this.files(workspaceId, { prefix: path, includeUrls: true });\n const match = fileList.files?.find((f) => f.path === path);\n if (!match) throw new Error(`File not found in workspace: ${path}`);\n const dest = options?.to ?? basename(match.path);\n mkdirSync(dirname(dest), { recursive: true });\n const resp = await fetch(match.url!);\n if (!resp.ok) throw new Error(`Download failed: ${resp.status}`);\n writeFileSync(dest, Buffer.from(await resp.arrayBuffer()));\n return dest;\n }\n\n /**\n * Download all files from a workspace. Returns list of local paths.\n *\n * ```ts\n * const paths = await client.workspaces.downloadAll(wsId, { to: \"./output\" });\n * ```\n */\n async downloadAll(workspaceId: string, options?: { to?: string; prefix?: string }): Promise<string[]> {\n const destDir = options?.to ?? \".\";\n mkdirSync(destDir, { recursive: true });\n const results: string[] = [];\n let cursor: string | undefined;\n do {\n const fileList = await this.files(workspaceId, {\n prefix: options?.prefix,\n includeUrls: true,\n cursor,\n });\n for (const f of fileList.files ?? []) {\n const local = safeJoin(destDir, f.path);\n mkdirSync(dirname(local), { recursive: true });\n const resp = await fetch(f.url!);\n if (!resp.ok) throw new Error(`Download failed for ${f.path}: ${resp.status}`);\n writeFileSync(local, Buffer.from(await resp.arrayBuffer()));\n results.push(local);\n }\n cursor = fileList.hasMore ? (fileList.nextCursor ?? undefined) : undefined;\n } while (cursor);\n return results;\n }\n}\n","import type { z } from \"zod\";\nimport type { components } from \"../generated/v3/types.js\";\nimport type { Sessions } from \"./resources/sessions.js\";\n\ntype SessionResponse = components[\"schemas\"][\"SessionResponse\"];\ntype MessageResponse = components[\"schemas\"][\"MessageResponse\"];\n\nconst TERMINAL_STATUSES = new Set([\"idle\", \"stopped\", \"timed_out\", \"error\"]);\n\nexport interface RunOptions {\n /** Maximum time to wait in milliseconds. Default: 14_400_000 (4 hours). */\n timeout?: number;\n /** Polling interval in milliseconds. Default: 2_000. */\n interval?: number;\n /** @internal Starting message cursor for follow-up runs on an existing session. */\n _startCursor?: string;\n}\n\n/** Session result with typed output. All SessionResponse fields are directly accessible. */\nexport type SessionResult<T = string | null> = Omit<SessionResponse, \"output\"> & { output: T };\n\n/**\n * Dual-purpose session handle: `await` it for a typed SessionResult,\n * or access `.result` for the full SessionResult after resolution.\n */\nexport class SessionRun<T = string> implements PromiseLike<SessionResult<T>> {\n private readonly _createPromise: Promise<SessionResponse>;\n private readonly _sessions: Sessions;\n private readonly _schema?: z.ZodType<T>;\n private readonly _timeout: number;\n private readonly _interval: number;\n private readonly _options?: RunOptions;\n private _sessionId: string | null = null;\n private _result: SessionResult<T> | null = null;\n\n constructor(\n createPromise: Promise<SessionResponse>,\n sessions: Sessions,\n schema?: z.ZodType<T>,\n options?: RunOptions,\n ) {\n this._createPromise = createPromise;\n this._sessions = sessions;\n this._schema = schema;\n this._timeout = options?.timeout ?? 14_400_000;\n this._interval = options?.interval ?? 2_000;\n this._options = options;\n }\n\n /** The session ID, available after task creation resolves. */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /** The full SessionResult, available after polling completes. */\n get result(): SessionResult<T> | null {\n return this._result;\n }\n\n /** Enable `await client.run(...)` — polls until terminal, returns SessionResult. */\n then<R1 = SessionResult<T>, R2 = never>(\n onFulfilled?:\n | ((value: SessionResult<T>) => R1 | PromiseLike<R1>)\n | null,\n onRejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null,\n ): Promise<R1 | R2> {\n return this._waitForOutput().then(onFulfilled, onRejected);\n }\n\n private async _ensureSessionId(): Promise<string> {\n if (this._sessionId) return this._sessionId;\n const created = await this._createPromise;\n this._sessionId = created.id;\n return this._sessionId;\n }\n\n /** Poll session until terminal, return SessionResult. */\n private async _waitForOutput(): Promise<SessionResult<T>> {\n const sessionId = await this._ensureSessionId();\n const deadline = Date.now() + this._timeout;\n\n while (Date.now() < deadline) {\n const session = await this._sessions.get(sessionId);\n if (TERMINAL_STATUSES.has(session.status)) {\n const { output, ...rest } = session;\n const parsed = this._parseOutput(output);\n this._result = { ...rest, output: parsed } as SessionResult<T>;\n return this._result;\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) =>\n setTimeout(r, Math.min(this._interval, remaining)),\n );\n }\n\n throw new Error(\n `Session ${sessionId} did not complete within ${this._timeout}ms`,\n );\n }\n\n /**\n * Enable `for await (const msg of client.run(...))` — yields messages as they appear.\n * After iteration, `.result` contains the final SessionResult.\n */\n async *[Symbol.asyncIterator](): AsyncGenerator<MessageResponse> {\n const sessionId = await this._ensureSessionId();\n let cursor: string | undefined = this._options?._startCursor;\n const deadline = Date.now() + this._timeout;\n\n while (Date.now() < deadline) {\n const resp = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });\n for (const msg of resp.messages) {\n yield msg;\n cursor = msg.id;\n }\n\n const session = await this._sessions.get(sessionId);\n if (TERMINAL_STATUSES.has(session.status)) {\n // Drain all remaining messages (may be multiple pages)\n while (true) {\n const page = await this._sessions.messages(sessionId, { after: cursor, limit: 100 });\n if (!page.messages.length) break;\n for (const msg of page.messages) {\n yield msg;\n cursor = msg.id;\n }\n }\n const { output, ...rest } = session;\n this._result = { ...rest, output: this._parseOutput(output) } as SessionResult<T>;\n return;\n }\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise((r) => setTimeout(r, Math.min(this._interval, remaining)));\n }\n\n throw new Error(`Session ${sessionId} did not complete within ${this._timeout}ms`);\n }\n\n private _parseOutput(output: unknown): T {\n if (output == null) return null as T;\n if (!this._schema) return output as unknown as T;\n const raw = typeof output === \"string\" ? JSON.parse(output) : output;\n return this._schema.parse(raw);\n }\n}\n"],"mappings":"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","names":["promise"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/errors.ts","../src/core/http.ts"],"sourcesContent":["export class BrowserUseError extends Error {\n readonly statusCode: number;\n readonly detail: unknown;\n\n constructor(statusCode: number, message: string, detail?: unknown) {\n super(message);\n this.name = \"BrowserUseError\";\n this.statusCode = statusCode;\n this.detail = detail;\n }\n}\n","import { BrowserUseError } from \"./errors.js\";\n\nexport interface HttpClientOptions {\n apiKey: string;\n baseUrl: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly maxRetries: number;\n private readonly timeout: number;\n\n constructor(options: HttpClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.maxRetries = options.maxRetries ?? 3;\n this.timeout = options.timeout ?? 30_000;\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, unknown>;\n signal?: AbortSignal;\n },\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n \"X-Browser-Use-API-Key\": this.apiKey,\n };\n if (options?.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(1000 * 2 ** (attempt - 1), 10_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n const controller = new AbortController();\n const timeoutId = options?.signal\n ? undefined\n : setTimeout(() => controller.abort(), this.timeout);\n\n // Combine user signal with internal timeout when both are present\n const signal = options?.signal ?? controller.signal;\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n const shouldRetry =\n response.status === 429 &&\n attempt < this.maxRetries;\n\n if (shouldRetry) {\n continue;\n }\n\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n /* ignore parse errors */\n }\n const message =\n typeof errorBody === \"object\" && errorBody !== null\n ? String(\n \"message\" in errorBody\n ? (errorBody as Record<string, unknown>).message\n : \"detail\" in errorBody\n ? (errorBody as Record<string, unknown>).detail\n : `HTTP ${response.status}`,\n )\n : `HTTP ${response.status}`;\n throw new BrowserUseError(response.status, message, errorBody);\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n throw new Error(\"Unreachable: retry loop exhausted\");\n }\n\n get<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"GET\", path, { query });\n }\n\n post<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"POST\", path, { body, query });\n }\n\n patch<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body, query });\n }\n\n delete<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"DELETE\", path, { query });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/sauravpanda/Github/LLMs/Browser-Use/sdk/browser-use-node/dist/chunk-RIRVOEIU.cjs","../src/core/errors.ts","../src/core/http.ts"],"names":[],"mappings":"AAAA;ACAO,IAAM,gBAAA,EAAN,MAAA,QAA8B,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EAET,WAAA,CAAY,UAAA,EAAoB,OAAA,EAAiB,MAAA,EAAkB;AACjE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,KAAA,EAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,WAAA,EAAa,UAAA;AAClB,IAAA,IAAA,CAAK,OAAA,EAAS,MAAA;AAAA,EAChB;AACF,CAAA;ADCA;AACA;AEHO,IAAM,WAAA,EAAN,MAAiB;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,WAAA,CAAY,OAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACjD,IAAA,IAAA,CAAK,WAAA,mBAAa,OAAA,CAAQ,UAAA,UAAc,GAAA;AACxC,IAAA,IAAA,CAAK,QAAA,mBAAU,OAAA,CAAQ,OAAA,UAAW,KAAA;AAAA,EACpC;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,EAKY;AACZ,IAAA,MAAM,IAAA,EAAM,IAAI,GAAA,CAAI,CAAA,EAAA;AACA,IAAA;AACD,MAAA;AACD,QAAA;AACR,UAAA;AACN,QAAA;AACF,MAAA;AACF,IAAA;AAEwC,IAAA;AACtC,MAAA;AACF,IAAA;AACa,IAAA;AACH,MAAA;AACV,IAAA;AAEmB,IAAA;AACA,MAAA;AACD,QAAA;AACJ,QAAA;AACZ,MAAA;AAEmB,MAAA;AACD,MAAA;AAKH,MAAA;AAEX,MAAA;AACe,QAAA;AACf,UAAA;AACA,UAAA;AACe,UAAA;AACf,UAAA;AACD,QAAA;AAEY,QAAA;AAEI,QAAA;AACF,UAAA;AACJ,YAAA;AACT,UAAA;AACc,UAAA;AAChB,QAAA;AAEM,QAAA;AAIW,QAAA;AACf,UAAA;AACF,QAAA;AAEI,QAAA;AACA,QAAA;AACU,UAAA;AACN,QAAA;AAER,QAAA;AAEE,QAAA;AAEmB,UAAA;AAMP,QAAA;AACJ,QAAA;AACI,MAAA;AACD,QAAA;AACP,QAAA;AACR,MAAA;AACF,IAAA;AAEgB,IAAA;AAClB,EAAA;AAEkE,EAAA;AACzC,IAAA;AACzB,EAAA;AAEsC,EAAA;AACb,IAAA;AACzB,EAAA;AAEuC,EAAA;AACd,IAAA;AACzB,EAAA;AAEqE,EAAA;AAC5C,IAAA;AACzB,EAAA;AACF;AFjCyB;AACA;AACA;AACA;AACA","file":"/Users/sauravpanda/Github/LLMs/Browser-Use/sdk/browser-use-node/dist/chunk-RIRVOEIU.cjs","sourcesContent":[null,"export class BrowserUseError extends Error {\n readonly statusCode: number;\n readonly detail: unknown;\n\n constructor(statusCode: number, message: string, detail?: unknown) {\n super(message);\n this.name = \"BrowserUseError\";\n this.statusCode = statusCode;\n this.detail = detail;\n }\n}\n","import { BrowserUseError } from \"./errors.js\";\n\nexport interface HttpClientOptions {\n apiKey: string;\n baseUrl: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly maxRetries: number;\n private readonly timeout: number;\n\n constructor(options: HttpClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.maxRetries = options.maxRetries ?? 3;\n this.timeout = options.timeout ?? 30_000;\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, unknown>;\n signal?: AbortSignal;\n },\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n \"X-Browser-Use-API-Key\": this.apiKey,\n };\n if (options?.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(1000 * 2 ** (attempt - 1), 10_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n const controller = new AbortController();\n const timeoutId = options?.signal\n ? undefined\n : setTimeout(() => controller.abort(), this.timeout);\n\n // Combine user signal with internal timeout when both are present\n const signal = options?.signal ?? controller.signal;\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n const shouldRetry =\n response.status === 429 &&\n attempt < this.maxRetries;\n\n if (shouldRetry) {\n continue;\n }\n\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n /* ignore parse errors */\n }\n const message =\n typeof errorBody === \"object\" && errorBody !== null\n ? String(\n \"message\" in errorBody\n ? (errorBody as Record<string, unknown>).message\n : \"detail\" in errorBody\n ? (errorBody as Record<string, unknown>).detail\n : `HTTP ${response.status}`,\n )\n : `HTTP ${response.status}`;\n throw new BrowserUseError(response.status, message, errorBody);\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n throw new Error(\"Unreachable: retry loop exhausted\");\n }\n\n get<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"GET\", path, { query });\n }\n\n post<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"POST\", path, { body, query });\n }\n\n patch<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body, query });\n }\n\n delete<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.request<T>(\"DELETE\", path, { query });\n }\n}\n"]}
|