@tabstack/sdk 1.0.0 → 1.0.5
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/LICENSE +22 -11
- package/README.md +17 -44
- package/dist/cjs/{automate.d.ts → agent.d.ts} +10 -10
- package/dist/cjs/agent.d.ts.map +1 -0
- package/dist/cjs/{automate.js → agent.js} +11 -11
- package/dist/cjs/agent.js.map +1 -0
- package/dist/cjs/agent.test.d.ts +5 -0
- package/dist/cjs/agent.test.d.ts.map +1 -0
- package/dist/cjs/{automate.test.js → agent.test.js} +32 -32
- package/dist/cjs/agent.test.js.map +1 -0
- package/dist/cjs/client.d.ts +13 -13
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +12 -12
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/client.test.d.ts +1 -1
- package/dist/cjs/client.test.js +50 -51
- package/dist/cjs/client.test.js.map +1 -1
- package/dist/cjs/exceptions.d.ts +9 -9
- package/dist/cjs/exceptions.js +13 -13
- package/dist/cjs/exceptions.test.js +30 -30
- package/dist/cjs/extract.d.ts +2 -57
- package/dist/cjs/extract.d.ts.map +1 -1
- package/dist/cjs/extract.js +2 -60
- package/dist/cjs/extract.js.map +1 -1
- package/dist/cjs/extract.test.js +0 -114
- package/dist/cjs/extract.test.js.map +1 -1
- package/dist/cjs/generate.d.ts +1 -1
- package/dist/cjs/generate.js +1 -1
- package/dist/cjs/index.d.ts +9 -9
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +9 -9
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types.d.ts +1 -1
- package/dist/cjs/types.js +1 -1
- package/dist/cjs/util/http.d.ts +1 -1
- package/dist/cjs/util/http.js +4 -4
- package/dist/cjs/util/http.test.js +5 -5
- package/dist/esm/{automate.d.ts → agent.d.ts} +10 -10
- package/dist/esm/agent.d.ts.map +1 -0
- package/dist/esm/{automate.js → agent.js} +9 -9
- package/dist/esm/agent.js.map +1 -0
- package/dist/esm/agent.test.d.ts +5 -0
- package/dist/esm/agent.test.d.ts.map +1 -0
- package/dist/esm/{automate.test.js → agent.test.js} +32 -32
- package/dist/esm/agent.test.js.map +1 -0
- package/dist/esm/client.d.ts +13 -13
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +10 -10
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/client.test.d.ts +1 -1
- package/dist/esm/client.test.js +51 -52
- package/dist/esm/client.test.js.map +1 -1
- package/dist/esm/exceptions.d.ts +9 -9
- package/dist/esm/exceptions.js +11 -11
- package/dist/esm/exceptions.test.js +31 -31
- package/dist/esm/extract.d.ts +2 -57
- package/dist/esm/extract.d.ts.map +1 -1
- package/dist/esm/extract.js +2 -60
- package/dist/esm/extract.js.map +1 -1
- package/dist/esm/extract.test.js +0 -114
- package/dist/esm/extract.test.js.map +1 -1
- package/dist/esm/generate.d.ts +1 -1
- package/dist/esm/generate.js +1 -1
- package/dist/esm/index.d.ts +9 -9
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +7 -7
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types.d.ts +1 -1
- package/dist/esm/types.js +1 -1
- package/dist/esm/util/http.d.ts +1 -1
- package/dist/esm/util/http.js +5 -5
- package/dist/esm/util/http.test.js +6 -6
- package/dist/types/{automate.d.ts → agent.d.ts} +10 -10
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.test.d.ts +5 -0
- package/dist/types/agent.test.d.ts.map +1 -0
- package/dist/types/client.d.ts +13 -13
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/client.test.d.ts +1 -1
- package/dist/types/exceptions.d.ts +9 -9
- package/dist/types/extract.d.ts +2 -57
- package/dist/types/extract.d.ts.map +1 -1
- package/dist/types/generate.d.ts +1 -1
- package/dist/types/index.d.ts +9 -9
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +1 -1
- package/dist/types/util/http.d.ts +1 -1
- package/package.json +5 -5
- package/dist/cjs/automate.d.ts.map +0 -1
- package/dist/cjs/automate.js.map +0 -1
- package/dist/cjs/automate.test.d.ts +0 -5
- package/dist/cjs/automate.test.d.ts.map +0 -1
- package/dist/cjs/automate.test.js.map +0 -1
- package/dist/esm/automate.d.ts.map +0 -1
- package/dist/esm/automate.js.map +0 -1
- package/dist/esm/automate.test.d.ts +0 -5
- package/dist/esm/automate.test.d.ts.map +0 -1
- package/dist/esm/automate.test.js.map +0 -1
- package/dist/types/automate.d.ts.map +0 -1
- package/dist/types/automate.test.d.ts +0 -5
- package/dist/types/automate.test.d.ts.map +0 -1
package/LICENSE
CHANGED
|
@@ -162,20 +162,31 @@
|
|
|
162
162
|
other commercial damages or losses), even if such Contributor
|
|
163
163
|
has been advised of the possibility of such damages.
|
|
164
164
|
|
|
165
|
-
9. Accepting Warranty or
|
|
166
|
-
Derivative Works thereof, You may choose to offer,
|
|
167
|
-
for, acceptance of support, warranty, indemnity,
|
|
168
|
-
obligations and/or rights consistent with this
|
|
169
|
-
accepting such obligations, You may act only
|
|
170
|
-
on Your sole responsibility, not on behalf
|
|
171
|
-
and only if You agree to indemnify,
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
additional liability.
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
175
|
|
|
176
176
|
END OF TERMS AND CONDITIONS
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright 2025 Mozilla
|
|
179
190
|
|
|
180
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
181
192
|
you may not use this file except in compliance with the License.
|
package/README.md
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Tabstack TypeScript SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> [!WARNING]
|
|
4
|
+
> **Early Release**: This SDK is in early development. The API may change in future releases as we refine and improve the library based on user feedback.
|
|
5
|
+
|
|
6
|
+
TypeScript/JavaScript SDK for [Tabstack](https://tabstack.ai) - Extract, Generate, and Automate web content with AI.
|
|
4
7
|
|
|
5
8
|
## Features
|
|
6
9
|
|
|
7
|
-
- **Extract**: Convert web pages to Markdown
|
|
10
|
+
- **Extract**: Convert web pages to Markdown and extract structured JSON data
|
|
8
11
|
- **Generate**: Transform web content using AI with custom instructions
|
|
9
|
-
- **
|
|
12
|
+
- **Agent**: Execute complex browser automation tasks with natural language
|
|
10
13
|
- **Type-Safe**: Full TypeScript support with comprehensive type definitions
|
|
11
14
|
- **Zero Dependencies**: Uses only Node.js standard library
|
|
12
15
|
- **Universal Module Support**: Works with CommonJS, ESM, and all TypeScript configurations
|
|
@@ -72,9 +75,9 @@ Sign up at [tabstack.ai](https://tabstack.ai) to get your API key.
|
|
|
72
75
|
|
|
73
76
|
#### ES Modules (ESM)
|
|
74
77
|
```typescript
|
|
75
|
-
import {
|
|
78
|
+
import { Tabstack } from '@tabstack/sdk';
|
|
76
79
|
|
|
77
|
-
const tabs = new
|
|
80
|
+
const tabs = new Tabstack({
|
|
78
81
|
apiKey: process.env.TABSTACK_API_KEY!
|
|
79
82
|
});
|
|
80
83
|
|
|
@@ -108,9 +111,9 @@ console.log(data.data);
|
|
|
108
111
|
|
|
109
112
|
#### CommonJS
|
|
110
113
|
```javascript
|
|
111
|
-
const {
|
|
114
|
+
const { Tabstack } = require('@tabstack/sdk');
|
|
112
115
|
|
|
113
|
-
const tabs = new
|
|
116
|
+
const tabs = new Tabstack({
|
|
114
117
|
apiKey: process.env.TABSTACK_API_KEY
|
|
115
118
|
});
|
|
116
119
|
|
|
@@ -168,20 +171,6 @@ const result = await tabs.extract.json('https://example.com/products', schema);
|
|
|
168
171
|
console.log(result.data);
|
|
169
172
|
```
|
|
170
173
|
|
|
171
|
-
### Generate Schema
|
|
172
|
-
|
|
173
|
-
Generate a JSON schema from web content:
|
|
174
|
-
|
|
175
|
-
```typescript
|
|
176
|
-
const schema = await tabs.extract.schema('https://news.ycombinator.com', {
|
|
177
|
-
instructions: 'extract top stories with title, points, and author'
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
// Use the generated schema for extraction
|
|
181
|
-
const result = await tabs.extract.json('https://news.ycombinator.com', schema);
|
|
182
|
-
console.log(result.data);
|
|
183
|
-
```
|
|
184
|
-
|
|
185
174
|
### Generate Content
|
|
186
175
|
|
|
187
176
|
Transform web content using AI:
|
|
@@ -220,7 +209,7 @@ console.log(result.data);
|
|
|
220
209
|
Execute browser automation tasks with streaming updates:
|
|
221
210
|
|
|
222
211
|
```typescript
|
|
223
|
-
for await (const event of tabs.automate
|
|
212
|
+
for await (const event of tabs.agent.automate(
|
|
224
213
|
'Find the top 3 trending repositories and extract their details',
|
|
225
214
|
{
|
|
226
215
|
url: 'https://github.com/trending',
|
|
@@ -240,9 +229,7 @@ for await (const event of tabs.automate.execute(
|
|
|
240
229
|
|
|
241
230
|
## Working with JSON Schemas
|
|
242
231
|
|
|
243
|
-
The SDK uses standard [JSON Schema](https://json-schema.org/) format for defining data structures
|
|
244
|
-
|
|
245
|
-
### Manual Schema Definition
|
|
232
|
+
The SDK uses standard [JSON Schema](https://json-schema.org/) format for defining data structures:
|
|
246
233
|
|
|
247
234
|
```typescript
|
|
248
235
|
const schema = {
|
|
@@ -280,27 +267,13 @@ const schema = {
|
|
|
280
267
|
};
|
|
281
268
|
```
|
|
282
269
|
|
|
283
|
-
### Automatic Schema Generation
|
|
284
|
-
|
|
285
|
-
Let the AI generate a schema from any webpage:
|
|
286
|
-
|
|
287
|
-
```typescript
|
|
288
|
-
// Generate schema from content
|
|
289
|
-
const schema = await tabs.extract.schema('https://news.ycombinator.com', {
|
|
290
|
-
instructions: 'extract stories with title, points, and author'
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
// Use it immediately
|
|
294
|
-
const data = await tabs.extract.json('https://news.ycombinator.com', schema);
|
|
295
|
-
```
|
|
296
|
-
|
|
297
270
|
## Error Handling
|
|
298
271
|
|
|
299
272
|
Handle errors with specific error classes:
|
|
300
273
|
|
|
301
274
|
```typescript
|
|
302
275
|
import {
|
|
303
|
-
|
|
276
|
+
TabstackError,
|
|
304
277
|
UnauthorizedError,
|
|
305
278
|
InvalidURLError,
|
|
306
279
|
BadRequestError,
|
|
@@ -314,7 +287,7 @@ try {
|
|
|
314
287
|
console.error('Invalid API key');
|
|
315
288
|
} else if (error instanceof InvalidURLError) {
|
|
316
289
|
console.error('Invalid or inaccessible URL');
|
|
317
|
-
} else if (error instanceof
|
|
290
|
+
} else if (error instanceof TabstackError) {
|
|
318
291
|
console.error(`API error: ${error.message}`);
|
|
319
292
|
}
|
|
320
293
|
}
|
|
@@ -322,7 +295,7 @@ try {
|
|
|
322
295
|
|
|
323
296
|
### Error Classes
|
|
324
297
|
|
|
325
|
-
- `
|
|
298
|
+
- `TabstackError` - Base error class
|
|
326
299
|
- `BadRequestError` - 400: Malformed request
|
|
327
300
|
- `UnauthorizedError` - 401: Invalid API key
|
|
328
301
|
- `InvalidURLError` - 422: Invalid or inaccessible URL
|
|
@@ -333,7 +306,7 @@ try {
|
|
|
333
306
|
## Requirements
|
|
334
307
|
|
|
335
308
|
- Node.js >= 20.0.0
|
|
336
|
-
-
|
|
309
|
+
- Tabstack API key ([get one here](https://tabstack.ai))
|
|
337
310
|
|
|
338
311
|
## Development & Testing
|
|
339
312
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Agent client for Tabstack SDK
|
|
3
3
|
*/
|
|
4
4
|
import { HTTPClient } from './util/http';
|
|
5
5
|
import { AutomateEvent } from './types';
|
|
6
|
-
export interface
|
|
6
|
+
export interface AutomateOptions {
|
|
7
7
|
url?: string;
|
|
8
8
|
data?: Record<string, unknown>;
|
|
9
9
|
guardrails?: string;
|
|
@@ -11,13 +11,13 @@ export interface AutomateExecuteOptions {
|
|
|
11
11
|
maxValidationAttempts?: number;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* Agent client for AI-powered web automation
|
|
15
15
|
*
|
|
16
16
|
* This class provides methods for executing complex web automation tasks using
|
|
17
17
|
* natural language instructions. The automation runs in a browser and streams
|
|
18
18
|
* real-time progress updates.
|
|
19
19
|
*/
|
|
20
|
-
export declare class
|
|
20
|
+
export declare class Agent {
|
|
21
21
|
private httpClient;
|
|
22
22
|
constructor(httpClient: HTTPClient);
|
|
23
23
|
/**
|
|
@@ -53,7 +53,7 @@ export declare class Automate {
|
|
|
53
53
|
* @example
|
|
54
54
|
* Extract GitHub trending repositories:
|
|
55
55
|
* ```typescript
|
|
56
|
-
* for await (const event of tabs.automate
|
|
56
|
+
* for await (const event of tabs.agent.automate(
|
|
57
57
|
* 'Find the top 3 trending repositories and extract their names, descriptions, and star counts',
|
|
58
58
|
* {
|
|
59
59
|
* url: 'https://github.com/trending',
|
|
@@ -75,7 +75,7 @@ export declare class Automate {
|
|
|
75
75
|
* @example
|
|
76
76
|
* Scrape product information:
|
|
77
77
|
* ```typescript
|
|
78
|
-
* for await (const event of tabs.automate
|
|
78
|
+
* for await (const event of tabs.agent.automate(
|
|
79
79
|
* 'Find the product name, price, and availability status',
|
|
80
80
|
* {
|
|
81
81
|
* url: 'https://example-store.com/product/wireless-headphones',
|
|
@@ -95,7 +95,7 @@ export declare class Automate {
|
|
|
95
95
|
* @example
|
|
96
96
|
* Fill out contact form:
|
|
97
97
|
* ```typescript
|
|
98
|
-
* for await (const event of tabs.automate
|
|
98
|
+
* for await (const event of tabs.agent.automate(
|
|
99
99
|
* 'Submit the contact form with my information',
|
|
100
100
|
* {
|
|
101
101
|
* url: 'https://company.com/contact',
|
|
@@ -119,7 +119,7 @@ export declare class Automate {
|
|
|
119
119
|
* @example
|
|
120
120
|
* Handle all event types:
|
|
121
121
|
* ```typescript
|
|
122
|
-
* for await (const event of tabs.automate
|
|
122
|
+
* for await (const event of tabs.agent.automate(
|
|
123
123
|
* 'Research TypeScript frameworks and compare them',
|
|
124
124
|
* { url: 'https://www.npmjs.com' }
|
|
125
125
|
* )) {
|
|
@@ -147,10 +147,10 @@ export declare class Automate {
|
|
|
147
147
|
* }
|
|
148
148
|
* ```
|
|
149
149
|
*/
|
|
150
|
-
|
|
150
|
+
automate(task: string, options?: AutomateOptions): AsyncGenerator<AutomateEvent, void, undefined>;
|
|
151
151
|
/**
|
|
152
152
|
* Parse SSE event data
|
|
153
153
|
*/
|
|
154
154
|
private parseEvent;
|
|
155
155
|
}
|
|
156
|
-
//# sourceMappingURL=
|
|
156
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;GAMG;AACH,qBAAa,KAAK;IACJ,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8HG;IACI,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC;IAkDjD;;OAEG;IACH,OAAO,CAAC,UAAU;CASnB"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Agent client for Tabstack SDK
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.Agent = void 0;
|
|
7
7
|
const types_1 = require("./types");
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Agent client for AI-powered web automation
|
|
10
10
|
*
|
|
11
11
|
* This class provides methods for executing complex web automation tasks using
|
|
12
12
|
* natural language instructions. The automation runs in a browser and streams
|
|
13
13
|
* real-time progress updates.
|
|
14
14
|
*/
|
|
15
|
-
class
|
|
15
|
+
class Agent {
|
|
16
16
|
constructor(httpClient) {
|
|
17
17
|
this.httpClient = httpClient;
|
|
18
18
|
}
|
|
@@ -49,7 +49,7 @@ class Automate {
|
|
|
49
49
|
* @example
|
|
50
50
|
* Extract GitHub trending repositories:
|
|
51
51
|
* ```typescript
|
|
52
|
-
* for await (const event of tabs.automate
|
|
52
|
+
* for await (const event of tabs.agent.automate(
|
|
53
53
|
* 'Find the top 3 trending repositories and extract their names, descriptions, and star counts',
|
|
54
54
|
* {
|
|
55
55
|
* url: 'https://github.com/trending',
|
|
@@ -71,7 +71,7 @@ class Automate {
|
|
|
71
71
|
* @example
|
|
72
72
|
* Scrape product information:
|
|
73
73
|
* ```typescript
|
|
74
|
-
* for await (const event of tabs.automate
|
|
74
|
+
* for await (const event of tabs.agent.automate(
|
|
75
75
|
* 'Find the product name, price, and availability status',
|
|
76
76
|
* {
|
|
77
77
|
* url: 'https://example-store.com/product/wireless-headphones',
|
|
@@ -91,7 +91,7 @@ class Automate {
|
|
|
91
91
|
* @example
|
|
92
92
|
* Fill out contact form:
|
|
93
93
|
* ```typescript
|
|
94
|
-
* for await (const event of tabs.automate
|
|
94
|
+
* for await (const event of tabs.agent.automate(
|
|
95
95
|
* 'Submit the contact form with my information',
|
|
96
96
|
* {
|
|
97
97
|
* url: 'https://company.com/contact',
|
|
@@ -115,7 +115,7 @@ class Automate {
|
|
|
115
115
|
* @example
|
|
116
116
|
* Handle all event types:
|
|
117
117
|
* ```typescript
|
|
118
|
-
* for await (const event of tabs.automate
|
|
118
|
+
* for await (const event of tabs.agent.automate(
|
|
119
119
|
* 'Research TypeScript frameworks and compare them',
|
|
120
120
|
* { url: 'https://www.npmjs.com' }
|
|
121
121
|
* )) {
|
|
@@ -143,7 +143,7 @@ class Automate {
|
|
|
143
143
|
* }
|
|
144
144
|
* ```
|
|
145
145
|
*/
|
|
146
|
-
async *
|
|
146
|
+
async *automate(task, options) {
|
|
147
147
|
const requestData = {
|
|
148
148
|
task,
|
|
149
149
|
maxIterations: options?.maxIterations ?? 50,
|
|
@@ -207,5 +207,5 @@ class Automate {
|
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
|
-
exports.
|
|
211
|
-
//# sourceMappingURL=
|
|
210
|
+
exports.Agent = Agent;
|
|
211
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.d.ts","sourceRoot":"","sources":["../../src/agent.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Tests for
|
|
3
|
+
* Tests for Agent
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
// @ts-nocheck
|
|
7
|
-
const
|
|
7
|
+
const agent_1 = require("./agent");
|
|
8
8
|
const http_1 = require("./util/http");
|
|
9
9
|
// Mock HTTPClient
|
|
10
10
|
jest.mock('./util/http');
|
|
11
|
-
describe('
|
|
12
|
-
let
|
|
11
|
+
describe('Agent', () => {
|
|
12
|
+
let agent;
|
|
13
13
|
let mockHttpClient;
|
|
14
14
|
beforeEach(() => {
|
|
15
15
|
mockHttpClient = new http_1.HTTPClient({ apiKey: 'test-key' });
|
|
16
|
-
|
|
16
|
+
agent = new agent_1.Agent(mockHttpClient);
|
|
17
17
|
});
|
|
18
18
|
afterEach(() => {
|
|
19
19
|
jest.clearAllMocks();
|
|
@@ -24,7 +24,7 @@ describe('Automate', () => {
|
|
|
24
24
|
yield line;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
describe('
|
|
27
|
+
describe('automate', () => {
|
|
28
28
|
it('should execute task with minimal options', async () => {
|
|
29
29
|
const sseLines = [
|
|
30
30
|
'event: start',
|
|
@@ -36,7 +36,7 @@ describe('Automate', () => {
|
|
|
36
36
|
];
|
|
37
37
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
38
38
|
const events = [];
|
|
39
|
-
for await (const event of automate
|
|
39
|
+
for await (const event of agent.automate('Test task')) {
|
|
40
40
|
events.push(event);
|
|
41
41
|
}
|
|
42
42
|
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
@@ -52,7 +52,7 @@ describe('Automate', () => {
|
|
|
52
52
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
53
53
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
54
54
|
const events = [];
|
|
55
|
-
for await (const event of automate
|
|
55
|
+
for await (const event of agent.automate('Test task', {
|
|
56
56
|
url: 'https://example.com',
|
|
57
57
|
})) {
|
|
58
58
|
events.push(event);
|
|
@@ -69,7 +69,7 @@ describe('Automate', () => {
|
|
|
69
69
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
70
70
|
const data = { name: 'John', email: 'john@example.com' };
|
|
71
71
|
const events = [];
|
|
72
|
-
for await (const event of automate
|
|
72
|
+
for await (const event of agent.automate('Fill form', { data })) {
|
|
73
73
|
events.push(event);
|
|
74
74
|
}
|
|
75
75
|
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
@@ -83,7 +83,7 @@ describe('Automate', () => {
|
|
|
83
83
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
84
84
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
85
85
|
const events = [];
|
|
86
|
-
for await (const event of automate
|
|
86
|
+
for await (const event of agent.automate('Browse site', {
|
|
87
87
|
guardrails: 'read only, no modifications',
|
|
88
88
|
})) {
|
|
89
89
|
events.push(event);
|
|
@@ -99,7 +99,7 @@ describe('Automate', () => {
|
|
|
99
99
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
100
100
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
101
101
|
const events = [];
|
|
102
|
-
for await (const event of automate
|
|
102
|
+
for await (const event of agent.automate('Test task', { maxIterations: 100 })) {
|
|
103
103
|
events.push(event);
|
|
104
104
|
}
|
|
105
105
|
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
@@ -112,7 +112,7 @@ describe('Automate', () => {
|
|
|
112
112
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
113
113
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
114
114
|
const events = [];
|
|
115
|
-
for await (const event of automate
|
|
115
|
+
for await (const event of agent.automate('Test task', { maxValidationAttempts: 5 })) {
|
|
116
116
|
events.push(event);
|
|
117
117
|
}
|
|
118
118
|
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
@@ -125,7 +125,7 @@ describe('Automate', () => {
|
|
|
125
125
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
126
126
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
127
127
|
const events = [];
|
|
128
|
-
for await (const event of automate
|
|
128
|
+
for await (const event of agent.automate('Complete task', {
|
|
129
129
|
url: 'https://example.com',
|
|
130
130
|
data: { key: 'value' },
|
|
131
131
|
guardrails: 'safe mode',
|
|
@@ -149,7 +149,7 @@ describe('Automate', () => {
|
|
|
149
149
|
const sseLines = ['event: start', 'data: {"message":"Started"}', ''];
|
|
150
150
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
151
151
|
const events = [];
|
|
152
|
-
for await (const event of automate
|
|
152
|
+
for await (const event of agent.automate('Task')) {
|
|
153
153
|
events.push(event);
|
|
154
154
|
}
|
|
155
155
|
expect(events).toHaveLength(1);
|
|
@@ -170,7 +170,7 @@ describe('Automate', () => {
|
|
|
170
170
|
];
|
|
171
171
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
172
172
|
const events = [];
|
|
173
|
-
for await (const event of automate
|
|
173
|
+
for await (const event of agent.automate('Task')) {
|
|
174
174
|
events.push(event);
|
|
175
175
|
}
|
|
176
176
|
expect(events).toHaveLength(3);
|
|
@@ -189,7 +189,7 @@ describe('Automate', () => {
|
|
|
189
189
|
];
|
|
190
190
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
191
191
|
const events = [];
|
|
192
|
-
for await (const event of automate
|
|
192
|
+
for await (const event of agent.automate('Task')) {
|
|
193
193
|
events.push(event);
|
|
194
194
|
}
|
|
195
195
|
expect(events).toHaveLength(1);
|
|
@@ -202,7 +202,7 @@ describe('Automate', () => {
|
|
|
202
202
|
const sseLines = ['event: start', 'data: {"message":"Started"}'];
|
|
203
203
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
204
204
|
const events = [];
|
|
205
|
-
for await (const event of automate
|
|
205
|
+
for await (const event of agent.automate('Task')) {
|
|
206
206
|
events.push(event);
|
|
207
207
|
}
|
|
208
208
|
// Should still yield the last event even without trailing empty line
|
|
@@ -213,7 +213,7 @@ describe('Automate', () => {
|
|
|
213
213
|
const sseLines = ['event: start ', 'data: {"message":"Test"} ', ''];
|
|
214
214
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
215
215
|
const events = [];
|
|
216
|
-
for await (const event of automate
|
|
216
|
+
for await (const event of agent.automate('Task')) {
|
|
217
217
|
events.push(event);
|
|
218
218
|
}
|
|
219
219
|
expect(events).toHaveLength(1);
|
|
@@ -224,7 +224,7 @@ describe('Automate', () => {
|
|
|
224
224
|
const sseLines = ['event: start', '', 'data: {"message":"Test"}', '', ''];
|
|
225
225
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
226
226
|
const events = [];
|
|
227
|
-
for await (const event of automate
|
|
227
|
+
for await (const event of agent.automate('Task')) {
|
|
228
228
|
events.push(event);
|
|
229
229
|
}
|
|
230
230
|
expect(events).toHaveLength(1);
|
|
@@ -253,7 +253,7 @@ describe('Automate', () => {
|
|
|
253
253
|
});
|
|
254
254
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
255
255
|
const events = [];
|
|
256
|
-
for await (const event of automate
|
|
256
|
+
for await (const event of agent.automate('Task')) {
|
|
257
257
|
events.push(event);
|
|
258
258
|
}
|
|
259
259
|
expect(events).toHaveLength(eventTypes.length);
|
|
@@ -271,7 +271,7 @@ describe('Automate', () => {
|
|
|
271
271
|
];
|
|
272
272
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
273
273
|
const events = [];
|
|
274
|
-
for await (const event of automate
|
|
274
|
+
for await (const event of agent.automate('Task')) {
|
|
275
275
|
events.push(event);
|
|
276
276
|
}
|
|
277
277
|
expect(events[0].data.get('extractedData')).toEqual({ title: 'Test', count: 42 });
|
|
@@ -280,7 +280,7 @@ describe('Automate', () => {
|
|
|
280
280
|
const sseLines = ['event: error', 'data: Invalid JSON {{{', ''];
|
|
281
281
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
282
282
|
const events = [];
|
|
283
|
-
for await (const event of automate
|
|
283
|
+
for await (const event of agent.automate('Task')) {
|
|
284
284
|
events.push(event);
|
|
285
285
|
}
|
|
286
286
|
expect(events[0].type).toBe('error');
|
|
@@ -290,7 +290,7 @@ describe('Automate', () => {
|
|
|
290
290
|
const sseLines = ['event: start', 'data: ', ''];
|
|
291
291
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
292
292
|
const events = [];
|
|
293
|
-
for await (const event of automate
|
|
293
|
+
for await (const event of agent.automate('Task')) {
|
|
294
294
|
events.push(event);
|
|
295
295
|
}
|
|
296
296
|
expect(events).toHaveLength(1);
|
|
@@ -309,7 +309,7 @@ describe('Automate', () => {
|
|
|
309
309
|
const sseLines = ['event: agent:extracted', `data: ${JSON.stringify(complexData)}`, ''];
|
|
310
310
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
311
311
|
const events = [];
|
|
312
|
-
for await (const event of automate
|
|
312
|
+
for await (const event of agent.automate('Task')) {
|
|
313
313
|
events.push(event);
|
|
314
314
|
}
|
|
315
315
|
expect(events[0].data.get('result')).toEqual(complexData.result);
|
|
@@ -324,7 +324,7 @@ describe('Automate', () => {
|
|
|
324
324
|
];
|
|
325
325
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
326
326
|
const events = [];
|
|
327
|
-
for await (const event of automate
|
|
327
|
+
for await (const event of agent.automate('Task')) {
|
|
328
328
|
events.push(event);
|
|
329
329
|
}
|
|
330
330
|
expect(events[0].data.get('url')).toBe('https://example.com');
|
|
@@ -334,7 +334,7 @@ describe('Automate', () => {
|
|
|
334
334
|
const sseLines = ['event: start', 'data: {"message":"Test"}', ''];
|
|
335
335
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
336
336
|
const events = [];
|
|
337
|
-
for await (const event of automate
|
|
337
|
+
for await (const event of agent.automate('Task')) {
|
|
338
338
|
events.push(event);
|
|
339
339
|
}
|
|
340
340
|
expect(events[0].data.get('nonexistent')).toBeUndefined();
|
|
@@ -348,7 +348,7 @@ describe('Automate', () => {
|
|
|
348
348
|
];
|
|
349
349
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
350
350
|
const events = [];
|
|
351
|
-
for await (const event of automate
|
|
351
|
+
for await (const event of agent.automate('Task')) {
|
|
352
352
|
events.push(event);
|
|
353
353
|
}
|
|
354
354
|
const raw = events[0].data.getRaw();
|
|
@@ -383,7 +383,7 @@ describe('Automate', () => {
|
|
|
383
383
|
];
|
|
384
384
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
385
385
|
const events = [];
|
|
386
|
-
for await (const event of automate
|
|
386
|
+
for await (const event of agent.automate('Extract data', {
|
|
387
387
|
url: 'https://example.com',
|
|
388
388
|
})) {
|
|
389
389
|
events.push(event);
|
|
@@ -404,7 +404,7 @@ describe('Automate', () => {
|
|
|
404
404
|
];
|
|
405
405
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
406
406
|
const events = [];
|
|
407
|
-
for await (const event of automate
|
|
407
|
+
for await (const event of agent.automate('Task')) {
|
|
408
408
|
events.push(event);
|
|
409
409
|
}
|
|
410
410
|
expect(events).toHaveLength(2);
|
|
@@ -422,7 +422,7 @@ describe('Automate', () => {
|
|
|
422
422
|
];
|
|
423
423
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
424
424
|
const events = [];
|
|
425
|
-
for await (const event of automate
|
|
425
|
+
for await (const event of agent.automate('Task', { maxIterations: 10 })) {
|
|
426
426
|
events.push(event);
|
|
427
427
|
}
|
|
428
428
|
expect(events).toHaveLength(2);
|
|
@@ -433,9 +433,9 @@ describe('Automate', () => {
|
|
|
433
433
|
mockHttpClient.postStream = jest.fn().mockImplementation(async function* () {
|
|
434
434
|
throw error;
|
|
435
435
|
});
|
|
436
|
-
const generator = automate
|
|
436
|
+
const generator = agent.automate('Task');
|
|
437
437
|
await expect(generator.next()).rejects.toThrow('Stream error');
|
|
438
438
|
});
|
|
439
439
|
});
|
|
440
440
|
});
|
|
441
|
-
//# sourceMappingURL=
|
|
441
|
+
//# sourceMappingURL=agent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.js","sourceRoot":"","sources":["../../src/agent.test.ts"],"names":[],"mappings":"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"}
|