@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/dist/cjs/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Tabstack TypeScript/JavaScript SDK
|
|
4
4
|
*
|
|
5
|
-
* This SDK provides a TypeScript/JavaScript interface to the
|
|
5
|
+
* This SDK provides a TypeScript/JavaScript interface to the Tabstack API for web
|
|
6
6
|
* content extraction, AI-powered content generation, and browser automation.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* ```typescript
|
|
10
|
-
* import {
|
|
10
|
+
* import { Tabstack } from '@tabstack/sdk';
|
|
11
11
|
*
|
|
12
|
-
* const tabs = new
|
|
12
|
+
* const tabs = new Tabstack({
|
|
13
13
|
* apiKey: process.env.TABSTACK_API_KEY!
|
|
14
14
|
* });
|
|
15
15
|
*
|
|
@@ -42,17 +42,17 @@
|
|
|
42
42
|
* @packageDocumentation
|
|
43
43
|
*/
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.APIError = exports.ServiceUnavailableError = exports.ServerError = exports.InvalidURLError = exports.UnauthorizedError = exports.BadRequestError = exports.
|
|
45
|
+
exports.APIError = exports.ServiceUnavailableError = exports.ServerError = exports.InvalidURLError = exports.UnauthorizedError = exports.BadRequestError = exports.TabstackError = exports.EventData = exports.AutomateEvent = exports.JsonResponse = exports.MarkdownResponse = exports.Metadata = exports.Agent = exports.Generate = exports.Extract = exports.Tabstack = void 0;
|
|
46
46
|
// Main client
|
|
47
47
|
var client_1 = require("./client");
|
|
48
|
-
Object.defineProperty(exports, "
|
|
48
|
+
Object.defineProperty(exports, "Tabstack", { enumerable: true, get: function () { return client_1.Tabstack; } });
|
|
49
49
|
// Operators
|
|
50
50
|
var extract_1 = require("./extract");
|
|
51
51
|
Object.defineProperty(exports, "Extract", { enumerable: true, get: function () { return extract_1.Extract; } });
|
|
52
52
|
var generate_1 = require("./generate");
|
|
53
53
|
Object.defineProperty(exports, "Generate", { enumerable: true, get: function () { return generate_1.Generate; } });
|
|
54
|
-
var
|
|
55
|
-
Object.defineProperty(exports, "
|
|
54
|
+
var agent_1 = require("./agent");
|
|
55
|
+
Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return agent_1.Agent; } });
|
|
56
56
|
// Response types
|
|
57
57
|
var types_1 = require("./types");
|
|
58
58
|
Object.defineProperty(exports, "Metadata", { enumerable: true, get: function () { return types_1.Metadata; } });
|
|
@@ -62,7 +62,7 @@ Object.defineProperty(exports, "AutomateEvent", { enumerable: true, get: functio
|
|
|
62
62
|
Object.defineProperty(exports, "EventData", { enumerable: true, get: function () { return types_1.EventData; } });
|
|
63
63
|
// Exceptions
|
|
64
64
|
var exceptions_1 = require("./exceptions");
|
|
65
|
-
Object.defineProperty(exports, "
|
|
65
|
+
Object.defineProperty(exports, "TabstackError", { enumerable: true, get: function () { return exceptions_1.TabstackError; } });
|
|
66
66
|
Object.defineProperty(exports, "BadRequestError", { enumerable: true, get: function () { return exceptions_1.BadRequestError; } });
|
|
67
67
|
Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: function () { return exceptions_1.UnauthorizedError; } });
|
|
68
68
|
Object.defineProperty(exports, "InvalidURLError", { enumerable: true, get: function () { return exceptions_1.InvalidURLError; } });
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;;;AAEH,cAAc;AACd,mCAAqD;AAA5C,kGAAA,QAAQ,OAAA;AAEjB,YAAY;AACZ,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;;;AAEH,cAAc;AACd,mCAAqD;AAA5C,kGAAA,QAAQ,OAAA;AAEjB,YAAY;AACZ,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AAEd,iBAAiB;AACjB,iCAOiB;AANf,iGAAA,QAAQ,OAAA;AAER,yGAAA,gBAAgB,OAAA;AAChB,qGAAA,YAAY,OAAA;AACZ,sGAAA,aAAa,OAAA;AACb,kGAAA,SAAS,OAAA;AAGX,aAAa;AACb,2CAQsB;AAPpB,2GAAA,aAAa,OAAA;AACb,6GAAA,eAAe,OAAA;AACf,+GAAA,iBAAiB,OAAA;AACjB,6GAAA,eAAe,OAAA;AACf,yGAAA,WAAW,OAAA;AACX,qHAAA,uBAAuB,OAAA;AACvB,sGAAA,QAAQ,OAAA"}
|
package/dist/cjs/types.d.ts
CHANGED
package/dist/cjs/types.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Type definitions and response models for
|
|
3
|
+
* Type definitions and response models for Tabstack SDK
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.AutomateEvent = exports.EventData = exports.JsonResponse = exports.MarkdownResponse = exports.Metadata = void 0;
|
package/dist/cjs/util/http.d.ts
CHANGED
package/dist/cjs/util/http.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Internal HTTP client for
|
|
3
|
+
* Internal HTTP client for Tabstack SDK
|
|
4
4
|
*/
|
|
5
5
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
6
|
if (k2 === undefined) k2 = k;
|
|
@@ -124,12 +124,12 @@ class HTTPClient {
|
|
|
124
124
|
resolve(parsed);
|
|
125
125
|
}
|
|
126
126
|
catch {
|
|
127
|
-
reject(new exceptions_1.
|
|
127
|
+
reject(new exceptions_1.TabstackError('Failed to parse response JSON'));
|
|
128
128
|
}
|
|
129
129
|
});
|
|
130
130
|
});
|
|
131
131
|
req.on('error', (error) => {
|
|
132
|
-
reject(new exceptions_1.
|
|
132
|
+
reject(new exceptions_1.TabstackError(`Request failed: ${error.message}`));
|
|
133
133
|
});
|
|
134
134
|
req.write(body);
|
|
135
135
|
req.end();
|
|
@@ -173,7 +173,7 @@ class HTTPClient {
|
|
|
173
173
|
resolve(response);
|
|
174
174
|
});
|
|
175
175
|
req.on('error', (error) => {
|
|
176
|
-
reject(new exceptions_1.
|
|
176
|
+
reject(new exceptions_1.TabstackError(`Request failed: ${error.message}`));
|
|
177
177
|
});
|
|
178
178
|
req.write(body);
|
|
179
179
|
req.end();
|
|
@@ -102,13 +102,13 @@ describe('HTTPClient', () => {
|
|
|
102
102
|
(0, nock_1.default)(baseURL).post('/test').reply(500, '');
|
|
103
103
|
await expect(client.post('/test')).rejects.toThrow(exceptions_1.ServerError);
|
|
104
104
|
});
|
|
105
|
-
it('should throw
|
|
105
|
+
it('should throw TabstackError on malformed JSON response', async () => {
|
|
106
106
|
(0, nock_1.default)(baseURL).post('/test').reply(200, 'invalid json{{{');
|
|
107
|
-
await expect(client.post('/test')).rejects.toThrow(exceptions_1.
|
|
107
|
+
await expect(client.post('/test')).rejects.toThrow(exceptions_1.TabstackError);
|
|
108
108
|
});
|
|
109
|
-
it('should throw
|
|
109
|
+
it('should throw TabstackError on network error', async () => {
|
|
110
110
|
(0, nock_1.default)(baseURL).post('/test').replyWithError('Network error');
|
|
111
|
-
await expect(client.post('/test')).rejects.toThrow(exceptions_1.
|
|
111
|
+
await expect(client.post('/test')).rejects.toThrow(exceptions_1.TabstackError);
|
|
112
112
|
});
|
|
113
113
|
it('should handle query parameters in path', async () => {
|
|
114
114
|
(0, nock_1.default)(baseURL).post('/test?param=value').reply(200, { success: true });
|
|
@@ -196,7 +196,7 @@ describe('HTTPClient', () => {
|
|
|
196
196
|
const generator = client.postStream('/stream');
|
|
197
197
|
await expect(generator.next()).rejects.toThrow(exceptions_1.ServerError);
|
|
198
198
|
});
|
|
199
|
-
it('should throw
|
|
199
|
+
it('should throw TabstackError on network error during stream', async () => {
|
|
200
200
|
(0, nock_1.default)(baseURL).post('/stream').replyWithError('Connection failed');
|
|
201
201
|
const generator = client.postStream('/stream');
|
|
202
202
|
const error = await generator.next().catch((e) => e);
|
|
@@ -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,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Agent client for Tabstack SDK
|
|
3
3
|
*/
|
|
4
4
|
import { AutomateEvent } from './types.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Agent client for AI-powered web automation
|
|
7
7
|
*
|
|
8
8
|
* This class provides methods for executing complex web automation tasks using
|
|
9
9
|
* natural language instructions. The automation runs in a browser and streams
|
|
10
10
|
* real-time progress updates.
|
|
11
11
|
*/
|
|
12
|
-
export class
|
|
12
|
+
export class Agent {
|
|
13
13
|
constructor(httpClient) {
|
|
14
14
|
this.httpClient = httpClient;
|
|
15
15
|
}
|
|
@@ -46,7 +46,7 @@ export class Automate {
|
|
|
46
46
|
* @example
|
|
47
47
|
* Extract GitHub trending repositories:
|
|
48
48
|
* ```typescript
|
|
49
|
-
* for await (const event of tabs.automate
|
|
49
|
+
* for await (const event of tabs.agent.automate(
|
|
50
50
|
* 'Find the top 3 trending repositories and extract their names, descriptions, and star counts',
|
|
51
51
|
* {
|
|
52
52
|
* url: 'https://github.com/trending',
|
|
@@ -68,7 +68,7 @@ export class Automate {
|
|
|
68
68
|
* @example
|
|
69
69
|
* Scrape product information:
|
|
70
70
|
* ```typescript
|
|
71
|
-
* for await (const event of tabs.automate
|
|
71
|
+
* for await (const event of tabs.agent.automate(
|
|
72
72
|
* 'Find the product name, price, and availability status',
|
|
73
73
|
* {
|
|
74
74
|
* url: 'https://example-store.com/product/wireless-headphones',
|
|
@@ -88,7 +88,7 @@ export class Automate {
|
|
|
88
88
|
* @example
|
|
89
89
|
* Fill out contact form:
|
|
90
90
|
* ```typescript
|
|
91
|
-
* for await (const event of tabs.automate
|
|
91
|
+
* for await (const event of tabs.agent.automate(
|
|
92
92
|
* 'Submit the contact form with my information',
|
|
93
93
|
* {
|
|
94
94
|
* url: 'https://company.com/contact',
|
|
@@ -112,7 +112,7 @@ export class Automate {
|
|
|
112
112
|
* @example
|
|
113
113
|
* Handle all event types:
|
|
114
114
|
* ```typescript
|
|
115
|
-
* for await (const event of tabs.automate
|
|
115
|
+
* for await (const event of tabs.agent.automate(
|
|
116
116
|
* 'Research TypeScript frameworks and compare them',
|
|
117
117
|
* { url: 'https://www.npmjs.com' }
|
|
118
118
|
* )) {
|
|
@@ -140,7 +140,7 @@ export class Automate {
|
|
|
140
140
|
* }
|
|
141
141
|
* ```
|
|
142
142
|
*/
|
|
143
|
-
async *
|
|
143
|
+
async *automate(task, options) {
|
|
144
144
|
const requestData = {
|
|
145
145
|
task,
|
|
146
146
|
maxIterations: options?.maxIterations ?? 50,
|
|
@@ -204,4 +204,4 @@ export class Automate {
|
|
|
204
204
|
}
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
|
-
//# sourceMappingURL=
|
|
207
|
+
//# 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,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tests for
|
|
2
|
+
* Tests for Agent
|
|
3
3
|
*/
|
|
4
4
|
// @ts-nocheck
|
|
5
|
-
import {
|
|
5
|
+
import { Agent } from './agent.js';
|
|
6
6
|
import { HTTPClient } from './util/http.js';
|
|
7
7
|
// Mock HTTPClient
|
|
8
8
|
jest.mock('./util/http');
|
|
9
|
-
describe('
|
|
10
|
-
let
|
|
9
|
+
describe('Agent', () => {
|
|
10
|
+
let agent;
|
|
11
11
|
let mockHttpClient;
|
|
12
12
|
beforeEach(() => {
|
|
13
13
|
mockHttpClient = new HTTPClient({ apiKey: 'test-key' });
|
|
14
|
-
|
|
14
|
+
agent = new Agent(mockHttpClient);
|
|
15
15
|
});
|
|
16
16
|
afterEach(() => {
|
|
17
17
|
jest.clearAllMocks();
|
|
@@ -22,7 +22,7 @@ describe('Automate', () => {
|
|
|
22
22
|
yield line;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
describe('
|
|
25
|
+
describe('automate', () => {
|
|
26
26
|
it('should execute task with minimal options', async () => {
|
|
27
27
|
const sseLines = [
|
|
28
28
|
'event: start',
|
|
@@ -34,7 +34,7 @@ describe('Automate', () => {
|
|
|
34
34
|
];
|
|
35
35
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
36
36
|
const events = [];
|
|
37
|
-
for await (const event of automate
|
|
37
|
+
for await (const event of agent.automate('Test task')) {
|
|
38
38
|
events.push(event);
|
|
39
39
|
}
|
|
40
40
|
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
@@ -50,7 +50,7 @@ describe('Automate', () => {
|
|
|
50
50
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
51
51
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
52
52
|
const events = [];
|
|
53
|
-
for await (const event of automate
|
|
53
|
+
for await (const event of agent.automate('Test task', {
|
|
54
54
|
url: 'https://example.com',
|
|
55
55
|
})) {
|
|
56
56
|
events.push(event);
|
|
@@ -67,7 +67,7 @@ describe('Automate', () => {
|
|
|
67
67
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
68
68
|
const data = { name: 'John', email: 'john@example.com' };
|
|
69
69
|
const events = [];
|
|
70
|
-
for await (const event of automate
|
|
70
|
+
for await (const event of agent.automate('Fill form', { data })) {
|
|
71
71
|
events.push(event);
|
|
72
72
|
}
|
|
73
73
|
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
@@ -81,7 +81,7 @@ describe('Automate', () => {
|
|
|
81
81
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
82
82
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
83
83
|
const events = [];
|
|
84
|
-
for await (const event of automate
|
|
84
|
+
for await (const event of agent.automate('Browse site', {
|
|
85
85
|
guardrails: 'read only, no modifications',
|
|
86
86
|
})) {
|
|
87
87
|
events.push(event);
|
|
@@ -97,7 +97,7 @@ describe('Automate', () => {
|
|
|
97
97
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
98
98
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
99
99
|
const events = [];
|
|
100
|
-
for await (const event of automate
|
|
100
|
+
for await (const event of agent.automate('Test task', { maxIterations: 100 })) {
|
|
101
101
|
events.push(event);
|
|
102
102
|
}
|
|
103
103
|
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
@@ -110,7 +110,7 @@ describe('Automate', () => {
|
|
|
110
110
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
111
111
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
112
112
|
const events = [];
|
|
113
|
-
for await (const event of automate
|
|
113
|
+
for await (const event of agent.automate('Test task', { maxValidationAttempts: 5 })) {
|
|
114
114
|
events.push(event);
|
|
115
115
|
}
|
|
116
116
|
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
@@ -123,7 +123,7 @@ describe('Automate', () => {
|
|
|
123
123
|
const sseLines = ['event: start', 'data: {}', ''];
|
|
124
124
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
125
125
|
const events = [];
|
|
126
|
-
for await (const event of automate
|
|
126
|
+
for await (const event of agent.automate('Complete task', {
|
|
127
127
|
url: 'https://example.com',
|
|
128
128
|
data: { key: 'value' },
|
|
129
129
|
guardrails: 'safe mode',
|
|
@@ -147,7 +147,7 @@ describe('Automate', () => {
|
|
|
147
147
|
const sseLines = ['event: start', 'data: {"message":"Started"}', ''];
|
|
148
148
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
149
149
|
const events = [];
|
|
150
|
-
for await (const event of automate
|
|
150
|
+
for await (const event of agent.automate('Task')) {
|
|
151
151
|
events.push(event);
|
|
152
152
|
}
|
|
153
153
|
expect(events).toHaveLength(1);
|
|
@@ -168,7 +168,7 @@ describe('Automate', () => {
|
|
|
168
168
|
];
|
|
169
169
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
170
170
|
const events = [];
|
|
171
|
-
for await (const event of automate
|
|
171
|
+
for await (const event of agent.automate('Task')) {
|
|
172
172
|
events.push(event);
|
|
173
173
|
}
|
|
174
174
|
expect(events).toHaveLength(3);
|
|
@@ -187,7 +187,7 @@ describe('Automate', () => {
|
|
|
187
187
|
];
|
|
188
188
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
189
189
|
const events = [];
|
|
190
|
-
for await (const event of automate
|
|
190
|
+
for await (const event of agent.automate('Task')) {
|
|
191
191
|
events.push(event);
|
|
192
192
|
}
|
|
193
193
|
expect(events).toHaveLength(1);
|
|
@@ -200,7 +200,7 @@ describe('Automate', () => {
|
|
|
200
200
|
const sseLines = ['event: start', 'data: {"message":"Started"}'];
|
|
201
201
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
202
202
|
const events = [];
|
|
203
|
-
for await (const event of automate
|
|
203
|
+
for await (const event of agent.automate('Task')) {
|
|
204
204
|
events.push(event);
|
|
205
205
|
}
|
|
206
206
|
// Should still yield the last event even without trailing empty line
|
|
@@ -211,7 +211,7 @@ describe('Automate', () => {
|
|
|
211
211
|
const sseLines = ['event: start ', 'data: {"message":"Test"} ', ''];
|
|
212
212
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
213
213
|
const events = [];
|
|
214
|
-
for await (const event of automate
|
|
214
|
+
for await (const event of agent.automate('Task')) {
|
|
215
215
|
events.push(event);
|
|
216
216
|
}
|
|
217
217
|
expect(events).toHaveLength(1);
|
|
@@ -222,7 +222,7 @@ describe('Automate', () => {
|
|
|
222
222
|
const sseLines = ['event: start', '', 'data: {"message":"Test"}', '', ''];
|
|
223
223
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
224
224
|
const events = [];
|
|
225
|
-
for await (const event of automate
|
|
225
|
+
for await (const event of agent.automate('Task')) {
|
|
226
226
|
events.push(event);
|
|
227
227
|
}
|
|
228
228
|
expect(events).toHaveLength(1);
|
|
@@ -251,7 +251,7 @@ describe('Automate', () => {
|
|
|
251
251
|
});
|
|
252
252
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
253
253
|
const events = [];
|
|
254
|
-
for await (const event of automate
|
|
254
|
+
for await (const event of agent.automate('Task')) {
|
|
255
255
|
events.push(event);
|
|
256
256
|
}
|
|
257
257
|
expect(events).toHaveLength(eventTypes.length);
|
|
@@ -269,7 +269,7 @@ describe('Automate', () => {
|
|
|
269
269
|
];
|
|
270
270
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
271
271
|
const events = [];
|
|
272
|
-
for await (const event of automate
|
|
272
|
+
for await (const event of agent.automate('Task')) {
|
|
273
273
|
events.push(event);
|
|
274
274
|
}
|
|
275
275
|
expect(events[0].data.get('extractedData')).toEqual({ title: 'Test', count: 42 });
|
|
@@ -278,7 +278,7 @@ describe('Automate', () => {
|
|
|
278
278
|
const sseLines = ['event: error', 'data: Invalid JSON {{{', ''];
|
|
279
279
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
280
280
|
const events = [];
|
|
281
|
-
for await (const event of automate
|
|
281
|
+
for await (const event of agent.automate('Task')) {
|
|
282
282
|
events.push(event);
|
|
283
283
|
}
|
|
284
284
|
expect(events[0].type).toBe('error');
|
|
@@ -288,7 +288,7 @@ describe('Automate', () => {
|
|
|
288
288
|
const sseLines = ['event: start', 'data: ', ''];
|
|
289
289
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
290
290
|
const events = [];
|
|
291
|
-
for await (const event of automate
|
|
291
|
+
for await (const event of agent.automate('Task')) {
|
|
292
292
|
events.push(event);
|
|
293
293
|
}
|
|
294
294
|
expect(events).toHaveLength(1);
|
|
@@ -307,7 +307,7 @@ describe('Automate', () => {
|
|
|
307
307
|
const sseLines = ['event: agent:extracted', `data: ${JSON.stringify(complexData)}`, ''];
|
|
308
308
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
309
309
|
const events = [];
|
|
310
|
-
for await (const event of automate
|
|
310
|
+
for await (const event of agent.automate('Task')) {
|
|
311
311
|
events.push(event);
|
|
312
312
|
}
|
|
313
313
|
expect(events[0].data.get('result')).toEqual(complexData.result);
|
|
@@ -322,7 +322,7 @@ describe('Automate', () => {
|
|
|
322
322
|
];
|
|
323
323
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
324
324
|
const events = [];
|
|
325
|
-
for await (const event of automate
|
|
325
|
+
for await (const event of agent.automate('Task')) {
|
|
326
326
|
events.push(event);
|
|
327
327
|
}
|
|
328
328
|
expect(events[0].data.get('url')).toBe('https://example.com');
|
|
@@ -332,7 +332,7 @@ describe('Automate', () => {
|
|
|
332
332
|
const sseLines = ['event: start', 'data: {"message":"Test"}', ''];
|
|
333
333
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
334
334
|
const events = [];
|
|
335
|
-
for await (const event of automate
|
|
335
|
+
for await (const event of agent.automate('Task')) {
|
|
336
336
|
events.push(event);
|
|
337
337
|
}
|
|
338
338
|
expect(events[0].data.get('nonexistent')).toBeUndefined();
|
|
@@ -346,7 +346,7 @@ describe('Automate', () => {
|
|
|
346
346
|
];
|
|
347
347
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
348
348
|
const events = [];
|
|
349
|
-
for await (const event of automate
|
|
349
|
+
for await (const event of agent.automate('Task')) {
|
|
350
350
|
events.push(event);
|
|
351
351
|
}
|
|
352
352
|
const raw = events[0].data.getRaw();
|
|
@@ -381,7 +381,7 @@ describe('Automate', () => {
|
|
|
381
381
|
];
|
|
382
382
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
383
383
|
const events = [];
|
|
384
|
-
for await (const event of automate
|
|
384
|
+
for await (const event of agent.automate('Extract data', {
|
|
385
385
|
url: 'https://example.com',
|
|
386
386
|
})) {
|
|
387
387
|
events.push(event);
|
|
@@ -402,7 +402,7 @@ describe('Automate', () => {
|
|
|
402
402
|
];
|
|
403
403
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
404
404
|
const events = [];
|
|
405
|
-
for await (const event of automate
|
|
405
|
+
for await (const event of agent.automate('Task')) {
|
|
406
406
|
events.push(event);
|
|
407
407
|
}
|
|
408
408
|
expect(events).toHaveLength(2);
|
|
@@ -420,7 +420,7 @@ describe('Automate', () => {
|
|
|
420
420
|
];
|
|
421
421
|
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
422
422
|
const events = [];
|
|
423
|
-
for await (const event of automate
|
|
423
|
+
for await (const event of agent.automate('Task', { maxIterations: 10 })) {
|
|
424
424
|
events.push(event);
|
|
425
425
|
}
|
|
426
426
|
expect(events).toHaveLength(2);
|
|
@@ -431,9 +431,9 @@ describe('Automate', () => {
|
|
|
431
431
|
mockHttpClient.postStream = jest.fn().mockImplementation(async function* () {
|
|
432
432
|
throw error;
|
|
433
433
|
});
|
|
434
|
-
const generator = automate
|
|
434
|
+
const generator = agent.automate('Task');
|
|
435
435
|
await expect(generator.next()).rejects.toThrow('Stream error');
|
|
436
436
|
});
|
|
437
437
|
});
|
|
438
438
|
});
|
|
439
|
-
//# sourceMappingURL=
|
|
439
|
+
//# 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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"}
|