browser-use-sdk 3.3.1 → 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/README.md +12 -193
- 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.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/v3.cjs +287 -6
- package/dist/v3.cjs.map +1 -1
- package/dist/v3.d.cts +676 -7
- package/dist/v3.d.ts +676 -7
- package/dist/v3.js +284 -3
- 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
package/README.md
CHANGED
|
@@ -1,213 +1,32 @@
|
|
|
1
1
|
# browser-use-sdk
|
|
2
2
|
|
|
3
|
-
Official TypeScript SDK for
|
|
3
|
+
Official TypeScript SDK for [Browser Use Cloud](https://browser-use.com).
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npm install browser-use-sdk
|
|
9
|
-
# or
|
|
10
|
-
pnpm add browser-use-sdk
|
|
11
|
-
# or
|
|
12
|
-
yarn add browser-use-sdk
|
|
13
|
-
# or
|
|
14
|
-
bun add browser-use-sdk
|
|
15
9
|
```
|
|
16
10
|
|
|
17
|
-
## Quick Start
|
|
11
|
+
## Quick Start
|
|
18
12
|
|
|
19
|
-
|
|
13
|
+
Get your API key at [cloud.browser-use.com/settings](https://cloud.browser-use.com/settings?tab=api-keys&new=1).
|
|
20
14
|
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const client = new BrowserUse();
|
|
25
|
-
|
|
26
|
-
const result = await client.run("Find the top post on Hacker News");
|
|
27
|
-
console.log(result.output);
|
|
28
|
-
console.log(result.id, result.status);
|
|
15
|
+
```bash
|
|
16
|
+
export BROWSER_USE_API_KEY=your_key
|
|
29
17
|
```
|
|
30
18
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
The v3 API uses a unified session model. Import from `browser-use-sdk/v3`:
|
|
34
|
-
|
|
35
|
-
```ts
|
|
36
|
-
import { BrowserUse } from "browser-use-sdk/v3";
|
|
19
|
+
```typescript
|
|
20
|
+
import { BrowserUse } from "browser-use-sdk";
|
|
37
21
|
|
|
38
22
|
const client = new BrowserUse();
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
console.log(output);
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Client Options
|
|
45
|
-
|
|
46
|
-
```ts
|
|
47
|
-
const client = new BrowserUse({
|
|
48
|
-
apiKey: "bu_...", // Or set BROWSER_USE_API_KEY env var
|
|
49
|
-
baseUrl: "https://...", // Override API base URL
|
|
50
|
-
maxRetries: 3, // Retry on 429 (default: 3)
|
|
51
|
-
timeout: 30_000, // Request timeout in ms (default: 30s)
|
|
52
|
-
});
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Structured Output
|
|
56
|
-
|
|
57
|
-
Pass a Zod schema to get typed results:
|
|
58
|
-
|
|
59
|
-
```ts
|
|
60
|
-
import { z } from "zod";
|
|
61
|
-
|
|
62
|
-
const Product = z.object({ name: z.string(), price: z.number() });
|
|
63
|
-
|
|
64
|
-
const result = await client.run("Find the price of the MacBook Air", { schema: Product });
|
|
65
|
-
console.log(`${result.output.name}: $${result.output.price}`);
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## Polling and Streaming
|
|
69
|
-
|
|
70
|
-
`client.run()` returns a dual-purpose handle: `await` it for the output, or `for await...of` it for step-by-step progress.
|
|
71
|
-
|
|
72
|
-
### Wait for Result
|
|
73
|
-
|
|
74
|
-
```ts
|
|
75
|
-
const result = await client.run("Search for AI news");
|
|
76
|
-
console.log(result.output, result.id, result.status);
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### Stream Steps
|
|
80
|
-
|
|
81
|
-
```ts
|
|
82
|
-
for await (const step of client.run("Search for AI news")) {
|
|
83
|
-
console.log(`[${step.number}] ${step.nextGoal} — ${step.url}`);
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## V2 API Reference
|
|
88
|
-
|
|
89
|
-
### Billing
|
|
90
|
-
|
|
91
|
-
| Method | Description |
|
|
92
|
-
|-----------------------|--------------------------------------|
|
|
93
|
-
| `billing.account()` | Get account info and credit balance |
|
|
94
|
-
|
|
95
|
-
### Tasks
|
|
96
|
-
|
|
97
|
-
| Method | Description |
|
|
98
|
-
|------------------------------|-----------------------------------------|
|
|
99
|
-
| `tasks.create(body)` | Create and start a new task |
|
|
100
|
-
| `tasks.list(params?)` | List tasks with optional filtering |
|
|
101
|
-
| `tasks.get(taskId)` | Get detailed task information |
|
|
102
|
-
| `tasks.stop(taskId)` | Stop a running task |
|
|
103
|
-
| `tasks.status(taskId)` | Lightweight status for polling |
|
|
104
|
-
| `tasks.wait(taskId, opts?)` | Poll until terminal, return TaskView |
|
|
105
|
-
| `tasks.logs(taskId)` | Get download URL for task logs |
|
|
106
|
-
|
|
107
|
-
### Sessions
|
|
108
|
-
|
|
109
|
-
| Method | Description |
|
|
110
|
-
|------------------------------------|--------------------------------------|
|
|
111
|
-
| `sessions.create(body?)` | Create a new session |
|
|
112
|
-
| `sessions.list(params?)` | List sessions |
|
|
113
|
-
| `sessions.get(sessionId)` | Get session details |
|
|
114
|
-
| `sessions.stop(sessionId)` | Stop session and running tasks |
|
|
115
|
-
| `sessions.delete(sessionId)` | Delete session and all tasks |
|
|
116
|
-
| `sessions.getShare(sessionId)` | Get public share info |
|
|
117
|
-
| `sessions.createShare(sessionId)` | Create public share link |
|
|
118
|
-
| `sessions.deleteShare(sessionId)` | Remove public share |
|
|
119
|
-
|
|
120
|
-
### Files
|
|
121
|
-
|
|
122
|
-
| Method | Description |
|
|
123
|
-
|-----------------------------------------|----------------------------------------|
|
|
124
|
-
| `files.sessionUrl(sessionId, body)` | Presigned URL for session file upload |
|
|
125
|
-
| `files.browserUrl(sessionId, body)` | Presigned URL for browser file upload |
|
|
126
|
-
| `files.taskOutput(taskId, fileId)` | Download URL for task output file |
|
|
127
|
-
|
|
128
|
-
### Profiles
|
|
129
|
-
|
|
130
|
-
| Method | Description |
|
|
131
|
-
|-----------------------------------|------------------------------|
|
|
132
|
-
| `profiles.create(body?)` | Create a browser profile |
|
|
133
|
-
| `profiles.list(params?)` | List profiles |
|
|
134
|
-
| `profiles.get(profileId)` | Get profile details |
|
|
135
|
-
| `profiles.update(profileId, body)` | Update a profile |
|
|
136
|
-
| `profiles.delete(profileId)` | Delete a profile |
|
|
137
|
-
|
|
138
|
-
### Browsers
|
|
139
|
-
|
|
140
|
-
| Method | Description |
|
|
141
|
-
|-------------------------------|------------------------------------|
|
|
142
|
-
| `browsers.create(body)` | Create a browser session |
|
|
143
|
-
| `browsers.list(params?)` | List browser sessions |
|
|
144
|
-
| `browsers.get(sessionId)` | Get browser session details |
|
|
145
|
-
| `browsers.stop(sessionId)` | Stop a browser session |
|
|
146
|
-
|
|
147
|
-
### Skills
|
|
148
|
-
|
|
149
|
-
| Method | Description |
|
|
150
|
-
|------------------------------------------------|--------------------------------------|
|
|
151
|
-
| `skills.create(body)` | Create a skill via generation |
|
|
152
|
-
| `skills.list(params?)` | List skills |
|
|
153
|
-
| `skills.get(skillId)` | Get skill details |
|
|
154
|
-
| `skills.delete(skillId)` | Delete a skill |
|
|
155
|
-
| `skills.update(skillId, body)` | Update skill metadata |
|
|
156
|
-
| `skills.cancel(skillId)` | Cancel in-progress generation |
|
|
157
|
-
| `skills.execute(skillId, body)` | Execute a skill |
|
|
158
|
-
| `skills.refine(skillId, body)` | Refine a skill with feedback |
|
|
159
|
-
| `skills.rollback(skillId)` | Rollback to previous version |
|
|
160
|
-
| `skills.executions(skillId, params?)` | List skill executions |
|
|
161
|
-
| `skills.executionOutput(skillId, executionId)` | Download execution output |
|
|
162
|
-
|
|
163
|
-
### Marketplace
|
|
164
|
-
|
|
165
|
-
| Method | Description |
|
|
166
|
-
|-------------------------------------|-------------------------------------|
|
|
167
|
-
| `marketplace.list(params?)` | List public marketplace skills |
|
|
168
|
-
| `marketplace.get(skillSlug)` | Get marketplace skill by slug |
|
|
169
|
-
| `marketplace.clone(skillId)` | Clone a marketplace skill |
|
|
170
|
-
| `marketplace.execute(skillId, body)` | Execute a marketplace skill |
|
|
171
|
-
|
|
172
|
-
## V3 API Reference
|
|
173
|
-
|
|
174
|
-
### Sessions
|
|
175
|
-
|
|
176
|
-
| Method | Description |
|
|
177
|
-
|--------------------------------------|--------------------------------------|
|
|
178
|
-
| `sessions.create(body)` | Create session and run a task |
|
|
179
|
-
| `sessions.list(params?)` | List sessions |
|
|
180
|
-
| `sessions.get(sessionId)` | Get session details |
|
|
181
|
-
| `sessions.stop(sessionId)` | Stop a session |
|
|
182
|
-
| `sessions.files(sessionId, params?)` | List files in session workspace |
|
|
183
|
-
|
|
184
|
-
## Error Handling
|
|
185
|
-
|
|
186
|
-
All API errors throw `BrowserUseError`:
|
|
187
|
-
|
|
188
|
-
```ts
|
|
189
|
-
import { BrowserUse, BrowserUseError } from "browser-use-sdk";
|
|
190
|
-
|
|
191
|
-
try {
|
|
192
|
-
await client.tasks.get("nonexistent-id");
|
|
193
|
-
} catch (err) {
|
|
194
|
-
if (err instanceof BrowserUseError) {
|
|
195
|
-
console.error(err.statusCode); // 404
|
|
196
|
-
console.error(err.message); // "Task not found"
|
|
197
|
-
console.error(err.detail); // Raw error body
|
|
198
|
-
}
|
|
199
|
-
}
|
|
23
|
+
const result = await client.run("Find the top 3 trending repos on GitHub today");
|
|
24
|
+
console.log(result.output);
|
|
200
25
|
```
|
|
201
26
|
|
|
202
|
-
|
|
27
|
+
## Docs
|
|
203
28
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
Types are re-exported from `browser-use-sdk` and `browser-use-sdk/v3`. The SDK ships with full type definitions for all request/response shapes.
|
|
207
|
-
|
|
208
|
-
```ts
|
|
209
|
-
import type { TaskView, CreateTaskRequest } from "browser-use-sdk";
|
|
210
|
-
```
|
|
29
|
+
[docs.browser-use.com](https://docs.browser-use.com)
|
|
211
30
|
|
|
212
31
|
## License
|
|
213
32
|
|
|
@@ -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.d.cts
CHANGED
|
@@ -1788,10 +1788,11 @@ interface components {
|
|
|
1788
1788
|
* CREATED: Task has been created but not yet started.
|
|
1789
1789
|
* STARTED: Task has been started and is currently running.
|
|
1790
1790
|
* FINISHED: Task has finished and the agent has completed the task.
|
|
1791
|
+
* FAILED: Task execution failed due to an error.
|
|
1791
1792
|
* STOPPED: Task execution has been manually stopped (cannot be resumed).
|
|
1792
1793
|
* @enum {string}
|
|
1793
1794
|
*/
|
|
1794
|
-
TaskStatus: "created" | "started" | "finished" | "stopped";
|
|
1795
|
+
TaskStatus: "created" | "started" | "finished" | "failed" | "stopped";
|
|
1795
1796
|
/**
|
|
1796
1797
|
* TaskStatusView
|
|
1797
1798
|
* @description Lightweight view optimized for polling. Use GET /tasks/{id}/status for efficient polling
|
package/dist/index.d.ts
CHANGED
|
@@ -1788,10 +1788,11 @@ interface components {
|
|
|
1788
1788
|
* CREATED: Task has been created but not yet started.
|
|
1789
1789
|
* STARTED: Task has been started and is currently running.
|
|
1790
1790
|
* FINISHED: Task has finished and the agent has completed the task.
|
|
1791
|
+
* FAILED: Task execution failed due to an error.
|
|
1791
1792
|
* STOPPED: Task execution has been manually stopped (cannot be resumed).
|
|
1792
1793
|
* @enum {string}
|
|
1793
1794
|
*/
|
|
1794
|
-
TaskStatus: "created" | "started" | "finished" | "stopped";
|
|
1795
|
+
TaskStatus: "created" | "started" | "finished" | "failed" | "stopped";
|
|
1795
1796
|
/**
|
|
1796
1797
|
* TaskStatusView
|
|
1797
1798
|
* @description Lightweight view optimized for polling. Use GET /tasks/{id}/status for efficient polling
|