sentienceapi 0.90.1
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.md +43 -0
- package/README.md +946 -0
- package/dist/actions.d.ts +54 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +349 -0
- package/dist/actions.js.map +1 -0
- package/dist/agent.d.ts +157 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +437 -0
- package/dist/agent.js.map +1 -0
- package/dist/browser.d.ts +46 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +622 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +174 -0
- package/dist/cli.js.map +1 -0
- package/dist/conversational-agent.d.ts +123 -0
- package/dist/conversational-agent.d.ts.map +1 -0
- package/dist/conversational-agent.js +327 -0
- package/dist/conversational-agent.js.map +1 -0
- package/dist/expect.d.ts +16 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +66 -0
- package/dist/expect.js.map +1 -0
- package/dist/generator.d.ts +16 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +205 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector.d.ts +13 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +147 -0
- package/dist/inspector.js.map +1 -0
- package/dist/llm-provider.d.ts +60 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +106 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/query.d.ts +8 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +337 -0
- package/dist/query.js.map +1 -0
- package/dist/read.d.ts +40 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +86 -0
- package/dist/read.js.map +1 -0
- package/dist/recorder.d.ts +44 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +256 -0
- package/dist/recorder.js.map +1 -0
- package/dist/screenshot.d.ts +17 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +37 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/snapshot.d.ts +23 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +187 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/tracing/cloud-sink.d.ts +74 -0
- package/dist/tracing/cloud-sink.d.ts.map +1 -0
- package/dist/tracing/cloud-sink.js +262 -0
- package/dist/tracing/cloud-sink.js.map +1 -0
- package/dist/tracing/index.d.ts +12 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +28 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/jsonl-sink.d.ts +41 -0
- package/dist/tracing/jsonl-sink.d.ts.map +1 -0
- package/dist/tracing/jsonl-sink.js +168 -0
- package/dist/tracing/jsonl-sink.js.map +1 -0
- package/dist/tracing/sink.d.ts +24 -0
- package/dist/tracing/sink.d.ts.map +1 -0
- package/dist/tracing/sink.js +15 -0
- package/dist/tracing/sink.js.map +1 -0
- package/dist/tracing/tracer-factory.d.ts +57 -0
- package/dist/tracing/tracer-factory.d.ts.map +1 -0
- package/dist/tracing/tracer-factory.js +274 -0
- package/dist/tracing/tracer-factory.js.map +1 -0
- package/dist/tracing/tracer.d.ts +74 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +131 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/tracing/types.d.ts +63 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +8 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +29 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +74 -0
- package/dist/utils.js.map +1 -0
- package/dist/wait.d.ts +20 -0
- package/dist/wait.d.ts.map +1 -0
- package/dist/wait.js +63 -0
- package/dist/wait.js.map +1 -0
- package/package.json +72 -0
- package/spec/README.md +72 -0
- package/spec/SNAPSHOT_V1.md +208 -0
- package/spec/sdk-types.md +259 -0
- package/spec/snapshot.schema.json +148 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI commands for Sentience SDK
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const browser_1 = require("./browser");
|
|
7
|
+
const inspector_1 = require("./inspector");
|
|
8
|
+
const recorder_1 = require("./recorder");
|
|
9
|
+
const generator_1 = require("./generator");
|
|
10
|
+
async function cmdInspect(args) {
|
|
11
|
+
// Parse proxy from args
|
|
12
|
+
let proxy;
|
|
13
|
+
for (let i = 0; i < args.length; i++) {
|
|
14
|
+
if (args[i] === '--proxy' && i + 1 < args.length) {
|
|
15
|
+
proxy = args[++i];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const browser = new browser_1.SentienceBrowser(undefined, undefined, false, proxy);
|
|
19
|
+
try {
|
|
20
|
+
await browser.start();
|
|
21
|
+
console.log('✅ Inspector started. Hover elements to see info, click to see full details.');
|
|
22
|
+
console.log('Press Ctrl+C to stop.');
|
|
23
|
+
const inspector = (0, inspector_1.inspect)(browser);
|
|
24
|
+
await inspector.start();
|
|
25
|
+
// Keep running until interrupted
|
|
26
|
+
process.on('SIGINT', async () => {
|
|
27
|
+
console.log('\n👋 Inspector stopped.');
|
|
28
|
+
await inspector.stop();
|
|
29
|
+
await browser.close();
|
|
30
|
+
process.exit(0);
|
|
31
|
+
});
|
|
32
|
+
// Wait indefinitely
|
|
33
|
+
await new Promise(() => { });
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
console.error(`❌ Error: ${e.message}`);
|
|
37
|
+
await browser.close();
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function cmdRecord(args) {
|
|
42
|
+
// Parse arguments
|
|
43
|
+
let url;
|
|
44
|
+
let output = 'trace.json';
|
|
45
|
+
let captureSnapshots = false;
|
|
46
|
+
let proxy;
|
|
47
|
+
const maskPatterns = [];
|
|
48
|
+
for (let i = 0; i < args.length; i++) {
|
|
49
|
+
if (args[i] === '--url' && i + 1 < args.length) {
|
|
50
|
+
url = args[++i];
|
|
51
|
+
}
|
|
52
|
+
else if (args[i] === '--output' || args[i] === '-o') {
|
|
53
|
+
output = args[++i];
|
|
54
|
+
}
|
|
55
|
+
else if (args[i] === '--snapshots') {
|
|
56
|
+
captureSnapshots = true;
|
|
57
|
+
}
|
|
58
|
+
else if (args[i] === '--mask' && i + 1 < args.length) {
|
|
59
|
+
maskPatterns.push(args[++i]);
|
|
60
|
+
}
|
|
61
|
+
else if (args[i] === '--proxy' && i + 1 < args.length) {
|
|
62
|
+
proxy = args[++i];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const browser = new browser_1.SentienceBrowser(undefined, undefined, false, proxy);
|
|
66
|
+
try {
|
|
67
|
+
await browser.start();
|
|
68
|
+
// Navigate to start URL if provided
|
|
69
|
+
if (url) {
|
|
70
|
+
await browser.getPage().goto(url);
|
|
71
|
+
await browser.getPage().waitForLoadState('networkidle');
|
|
72
|
+
}
|
|
73
|
+
console.log('✅ Recording started. Perform actions in the browser.');
|
|
74
|
+
console.log('Press Ctrl+C to stop and save trace.');
|
|
75
|
+
const rec = (0, recorder_1.record)(browser, captureSnapshots);
|
|
76
|
+
rec.start();
|
|
77
|
+
// Add mask patterns
|
|
78
|
+
for (const pattern of maskPatterns) {
|
|
79
|
+
rec.addMaskPattern(pattern);
|
|
80
|
+
}
|
|
81
|
+
// Keep running until interrupted
|
|
82
|
+
process.on('SIGINT', async () => {
|
|
83
|
+
console.log('\n💾 Saving trace...');
|
|
84
|
+
await rec.save(output);
|
|
85
|
+
console.log(`✅ Trace saved to ${output}`);
|
|
86
|
+
await browser.close();
|
|
87
|
+
process.exit(0);
|
|
88
|
+
});
|
|
89
|
+
// Wait indefinitely
|
|
90
|
+
await new Promise(() => { });
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
console.error(`❌ Error: ${e.message}`);
|
|
94
|
+
await browser.close();
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function cmdGen(args) {
|
|
99
|
+
try {
|
|
100
|
+
// Parse arguments
|
|
101
|
+
let traceFile;
|
|
102
|
+
let lang = 'py';
|
|
103
|
+
let output;
|
|
104
|
+
for (let i = 0; i < args.length; i++) {
|
|
105
|
+
if (args[i] && !args[i].startsWith('--')) {
|
|
106
|
+
traceFile = args[i];
|
|
107
|
+
}
|
|
108
|
+
else if (args[i] === '--lang') {
|
|
109
|
+
lang = args[++i];
|
|
110
|
+
}
|
|
111
|
+
else if (args[i] === '--output' || args[i] === '-o') {
|
|
112
|
+
output = args[++i];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (!traceFile) {
|
|
116
|
+
console.error('❌ Trace file required');
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
// Load trace
|
|
120
|
+
const trace = await recorder_1.Recorder.load(traceFile);
|
|
121
|
+
// Generate script
|
|
122
|
+
const generator = new generator_1.ScriptGenerator(trace);
|
|
123
|
+
if (lang === 'py') {
|
|
124
|
+
const outputFile = output || 'generated.py';
|
|
125
|
+
await generator.savePython(outputFile);
|
|
126
|
+
console.log(`✅ Generated Python script: ${outputFile}`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const outputFile = output || 'generated.ts';
|
|
130
|
+
await generator.saveTypeScript(outputFile);
|
|
131
|
+
console.log(`✅ Generated TypeScript script: ${outputFile}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
console.error(`❌ Error: ${e.message}`);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function main() {
|
|
140
|
+
const args = process.argv.slice(2);
|
|
141
|
+
const command = args[0];
|
|
142
|
+
if (command === 'inspect') {
|
|
143
|
+
await cmdInspect(args.slice(1));
|
|
144
|
+
}
|
|
145
|
+
else if (command === 'record') {
|
|
146
|
+
await cmdRecord(args.slice(1));
|
|
147
|
+
}
|
|
148
|
+
else if (command === 'gen') {
|
|
149
|
+
await cmdGen(args.slice(1));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.log('Usage: sentience <command> [options]');
|
|
153
|
+
console.log('');
|
|
154
|
+
console.log('Commands:');
|
|
155
|
+
console.log(' inspect Start inspector mode');
|
|
156
|
+
console.log(' record [--url URL] Start recording mode');
|
|
157
|
+
console.log(' gen <trace.json> Generate script from trace');
|
|
158
|
+
console.log('');
|
|
159
|
+
console.log('Options:');
|
|
160
|
+
console.log(' --proxy <url> Proxy connection string (e.g., http://user:pass@host:port)');
|
|
161
|
+
console.log('');
|
|
162
|
+
console.log('Examples:');
|
|
163
|
+
console.log(' sentience inspect');
|
|
164
|
+
console.log(' sentience inspect --proxy http://user:pass@proxy.com:8000');
|
|
165
|
+
console.log(' sentience record --url https://example.com --output trace.json');
|
|
166
|
+
console.log(' sentience record --proxy http://user:pass@proxy.com:8000 --url https://example.com');
|
|
167
|
+
console.log(' sentience gen trace.json --lang py --output script.py');
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (require.main === module) {
|
|
172
|
+
main().catch(console.error);
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConversationalAgent - Level 4 Abstraction
|
|
3
|
+
* Natural language interface for browser automation
|
|
4
|
+
*/
|
|
5
|
+
import { LLMProvider } from './llm-provider';
|
|
6
|
+
import { SentienceBrowser } from './browser';
|
|
7
|
+
import { Snapshot } from './types';
|
|
8
|
+
export type ActionType = 'NAVIGATE' | 'FIND_AND_CLICK' | 'FIND_AND_TYPE' | 'PRESS_KEY' | 'WAIT' | 'EXTRACT_INFO' | 'VERIFY';
|
|
9
|
+
export interface ActionParameters {
|
|
10
|
+
url?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
text?: string;
|
|
13
|
+
key?: string;
|
|
14
|
+
seconds?: number;
|
|
15
|
+
info_type?: string;
|
|
16
|
+
condition?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface PlanStep {
|
|
19
|
+
action: ActionType;
|
|
20
|
+
parameters: ActionParameters;
|
|
21
|
+
reasoning: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ExecutionPlan {
|
|
24
|
+
steps: PlanStep[];
|
|
25
|
+
goal: string;
|
|
26
|
+
}
|
|
27
|
+
export interface StepResult {
|
|
28
|
+
success: boolean;
|
|
29
|
+
action: ActionType;
|
|
30
|
+
result?: any;
|
|
31
|
+
error?: string;
|
|
32
|
+
snapshot?: Snapshot;
|
|
33
|
+
duration_ms?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface ConversationEntry {
|
|
36
|
+
role: 'user' | 'assistant';
|
|
37
|
+
content: string;
|
|
38
|
+
timestamp: Date;
|
|
39
|
+
plan?: ExecutionPlan;
|
|
40
|
+
results?: StepResult[];
|
|
41
|
+
}
|
|
42
|
+
export interface ConversationalAgentOptions {
|
|
43
|
+
llmProvider: LLMProvider;
|
|
44
|
+
browser: SentienceBrowser;
|
|
45
|
+
verbose?: boolean;
|
|
46
|
+
maxTokens?: number;
|
|
47
|
+
planningModel?: string;
|
|
48
|
+
executionModel?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* ConversationalAgent provides the highest level of abstraction (Level 4).
|
|
52
|
+
* It accepts natural language instructions, automatically plans the execution,
|
|
53
|
+
* performs the actions, and synthesizes natural language responses.
|
|
54
|
+
*
|
|
55
|
+
* Example:
|
|
56
|
+
* const agent = new ConversationalAgent({ llmProvider, browser });
|
|
57
|
+
* const response = await agent.execute("Search Google for TypeScript tutorials");
|
|
58
|
+
* console.log(response);
|
|
59
|
+
*/
|
|
60
|
+
export declare class ConversationalAgent {
|
|
61
|
+
private llmProvider;
|
|
62
|
+
private browser;
|
|
63
|
+
private verbose;
|
|
64
|
+
private maxTokens;
|
|
65
|
+
private planningModel?;
|
|
66
|
+
private executionModel?;
|
|
67
|
+
private conversationHistory;
|
|
68
|
+
private sentienceAgent;
|
|
69
|
+
constructor(options: ConversationalAgentOptions);
|
|
70
|
+
/**
|
|
71
|
+
* Execute a natural language instruction.
|
|
72
|
+
* Plans the steps, executes them, and returns a natural language response.
|
|
73
|
+
*/
|
|
74
|
+
execute(userInput: string): Promise<string>;
|
|
75
|
+
/**
|
|
76
|
+
* Create an execution plan from natural language input.
|
|
77
|
+
* Uses LLM to break down the request into atomic steps.
|
|
78
|
+
*/
|
|
79
|
+
private createPlan;
|
|
80
|
+
/**
|
|
81
|
+
* Execute a single step from the plan.
|
|
82
|
+
*/
|
|
83
|
+
private executeStep;
|
|
84
|
+
/**
|
|
85
|
+
* Extract specific information from a page snapshot.
|
|
86
|
+
*/
|
|
87
|
+
private extractInformation;
|
|
88
|
+
/**
|
|
89
|
+
* Verify a condition is met on the current page.
|
|
90
|
+
*/
|
|
91
|
+
private verifyCondition;
|
|
92
|
+
/**
|
|
93
|
+
* Convert a Snapshot object to text representation for LLM.
|
|
94
|
+
*/
|
|
95
|
+
private snapshotToText;
|
|
96
|
+
/**
|
|
97
|
+
* Synthesize a natural language response from execution results.
|
|
98
|
+
*/
|
|
99
|
+
private synthesizeResponse;
|
|
100
|
+
/**
|
|
101
|
+
* Chat interface that maintains conversation context.
|
|
102
|
+
* Unlike execute(), this method keeps track of the full conversation
|
|
103
|
+
* and uses it for context in subsequent interactions.
|
|
104
|
+
*/
|
|
105
|
+
chat(message: string): Promise<string>;
|
|
106
|
+
/**
|
|
107
|
+
* Get a summary of the entire conversation session.
|
|
108
|
+
*/
|
|
109
|
+
getSummary(): Promise<string>;
|
|
110
|
+
/**
|
|
111
|
+
* Clear conversation history.
|
|
112
|
+
*/
|
|
113
|
+
clearHistory(): void;
|
|
114
|
+
/**
|
|
115
|
+
* Get the conversation history.
|
|
116
|
+
*/
|
|
117
|
+
getHistory(): ConversationEntry[];
|
|
118
|
+
/**
|
|
119
|
+
* Get token usage statistics from the underlying agent.
|
|
120
|
+
*/
|
|
121
|
+
getTokenStats(): import("./agent").TokenStats;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=conversational-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversational-agent.d.ts","sourceRoot":"","sources":["../src/conversational-agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,gBAAgB,GAChB,eAAe,GACf,WAAW,GACX,MAAM,GACN,cAAc,GACd,QAAQ,CAAC;AAEb,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,mBAAmB,CAA2B;IACtD,OAAO,CAAC,cAAc,CAAiB;gBAE3B,OAAO,EAAE,0BAA0B;IAgB/C;;;OAGG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuEjD;;;OAGG;YACW,UAAU;IA+CxB;;OAEG;YACW,WAAW;IAmGzB;;OAEG;YACW,kBAAkB;IAYhC;;OAEG;YACW,eAAe;IAY7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;YACW,kBAAkB;IAuChC;;;;OAIG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAwBnC;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,UAAU,IAAI,iBAAiB,EAAE;IAIjC;;OAEG;IACH,aAAa;CAGd"}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ConversationalAgent - Level 4 Abstraction
|
|
4
|
+
* Natural language interface for browser automation
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ConversationalAgent = void 0;
|
|
8
|
+
const agent_1 = require("./agent");
|
|
9
|
+
const snapshot_1 = require("./snapshot");
|
|
10
|
+
/**
|
|
11
|
+
* ConversationalAgent provides the highest level of abstraction (Level 4).
|
|
12
|
+
* It accepts natural language instructions, automatically plans the execution,
|
|
13
|
+
* performs the actions, and synthesizes natural language responses.
|
|
14
|
+
*
|
|
15
|
+
* Example:
|
|
16
|
+
* const agent = new ConversationalAgent({ llmProvider, browser });
|
|
17
|
+
* const response = await agent.execute("Search Google for TypeScript tutorials");
|
|
18
|
+
* console.log(response);
|
|
19
|
+
*/
|
|
20
|
+
class ConversationalAgent {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.conversationHistory = [];
|
|
23
|
+
this.llmProvider = options.llmProvider;
|
|
24
|
+
this.browser = options.browser;
|
|
25
|
+
this.verbose = options.verbose ?? false;
|
|
26
|
+
this.maxTokens = options.maxTokens ?? 4000;
|
|
27
|
+
this.planningModel = options.planningModel;
|
|
28
|
+
this.executionModel = options.executionModel;
|
|
29
|
+
this.sentienceAgent = new agent_1.SentienceAgent(this.browser, this.llmProvider, 50, this.verbose);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Execute a natural language instruction.
|
|
33
|
+
* Plans the steps, executes them, and returns a natural language response.
|
|
34
|
+
*/
|
|
35
|
+
async execute(userInput) {
|
|
36
|
+
const startTime = Date.now();
|
|
37
|
+
if (this.verbose) {
|
|
38
|
+
console.log(`\n[ConversationalAgent] User: ${userInput}`);
|
|
39
|
+
}
|
|
40
|
+
// Add user message to history
|
|
41
|
+
this.conversationHistory.push({
|
|
42
|
+
role: 'user',
|
|
43
|
+
content: userInput,
|
|
44
|
+
timestamp: new Date()
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
// Step 1: Create execution plan
|
|
48
|
+
const plan = await this.createPlan(userInput);
|
|
49
|
+
if (this.verbose) {
|
|
50
|
+
console.log(`[ConversationalAgent] Plan created with ${plan.steps.length} steps`);
|
|
51
|
+
}
|
|
52
|
+
// Step 2: Execute each step
|
|
53
|
+
const results = [];
|
|
54
|
+
for (let i = 0; i < plan.steps.length; i++) {
|
|
55
|
+
const step = plan.steps[i];
|
|
56
|
+
if (this.verbose) {
|
|
57
|
+
console.log(`[ConversationalAgent] Step ${i + 1}/${plan.steps.length}: ${step.action}`);
|
|
58
|
+
}
|
|
59
|
+
const result = await this.executeStep(step);
|
|
60
|
+
results.push(result);
|
|
61
|
+
if (!result.success && this.verbose) {
|
|
62
|
+
console.log(`[ConversationalAgent] Step ${i + 1} failed: ${result.error}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Step 3: Synthesize response
|
|
66
|
+
const response = await this.synthesizeResponse(userInput, plan, results);
|
|
67
|
+
// Add to history
|
|
68
|
+
this.conversationHistory.push({
|
|
69
|
+
role: 'assistant',
|
|
70
|
+
content: response,
|
|
71
|
+
timestamp: new Date(),
|
|
72
|
+
plan,
|
|
73
|
+
results
|
|
74
|
+
});
|
|
75
|
+
const duration = Date.now() - startTime;
|
|
76
|
+
if (this.verbose) {
|
|
77
|
+
console.log(`[ConversationalAgent] Completed in ${duration}ms`);
|
|
78
|
+
}
|
|
79
|
+
return response;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
83
|
+
const response = `I encountered an error while trying to help: ${errorMessage}`;
|
|
84
|
+
this.conversationHistory.push({
|
|
85
|
+
role: 'assistant',
|
|
86
|
+
content: response,
|
|
87
|
+
timestamp: new Date()
|
|
88
|
+
});
|
|
89
|
+
return response;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create an execution plan from natural language input.
|
|
94
|
+
* Uses LLM to break down the request into atomic steps.
|
|
95
|
+
*/
|
|
96
|
+
async createPlan(userInput) {
|
|
97
|
+
const systemPrompt = `You are a browser automation planner. Given a user's natural language request,
|
|
98
|
+
create a detailed execution plan with atomic steps.
|
|
99
|
+
|
|
100
|
+
Available actions:
|
|
101
|
+
- NAVIGATE: Navigate to a URL
|
|
102
|
+
Parameters: { url: string }
|
|
103
|
+
- FIND_AND_CLICK: Find and click an element
|
|
104
|
+
Parameters: { description: string }
|
|
105
|
+
- FIND_AND_TYPE: Find an input field and type text
|
|
106
|
+
Parameters: { description: string, text: string }
|
|
107
|
+
- PRESS_KEY: Press a keyboard key
|
|
108
|
+
Parameters: { key: string }
|
|
109
|
+
- WAIT: Wait for a specified time
|
|
110
|
+
Parameters: { seconds: number }
|
|
111
|
+
- EXTRACT_INFO: Extract specific information from the page
|
|
112
|
+
Parameters: { info_type: string }
|
|
113
|
+
- VERIFY: Verify a condition is met
|
|
114
|
+
Parameters: { condition: string }
|
|
115
|
+
|
|
116
|
+
Return a JSON object with this structure:
|
|
117
|
+
{
|
|
118
|
+
"goal": "brief description of the overall goal",
|
|
119
|
+
"steps": [
|
|
120
|
+
{
|
|
121
|
+
"action": "ACTION_TYPE",
|
|
122
|
+
"parameters": { ... },
|
|
123
|
+
"reasoning": "why this step is needed"
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
}`;
|
|
127
|
+
const userPrompt = `Create an execution plan for this request: ${userInput}`;
|
|
128
|
+
const llmResponse = await this.llmProvider.generate(systemPrompt, userPrompt, {
|
|
129
|
+
json_mode: this.llmProvider.supportsJsonMode()
|
|
130
|
+
});
|
|
131
|
+
const plan = JSON.parse(llmResponse.content);
|
|
132
|
+
if (!plan.steps || !Array.isArray(plan.steps)) {
|
|
133
|
+
throw new Error('Invalid plan format: missing steps array');
|
|
134
|
+
}
|
|
135
|
+
return plan;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Execute a single step from the plan.
|
|
139
|
+
*/
|
|
140
|
+
async executeStep(step) {
|
|
141
|
+
const startTime = Date.now();
|
|
142
|
+
try {
|
|
143
|
+
let result;
|
|
144
|
+
let snap;
|
|
145
|
+
switch (step.action) {
|
|
146
|
+
case 'NAVIGATE':
|
|
147
|
+
if (!step.parameters.url) {
|
|
148
|
+
throw new Error('NAVIGATE requires url parameter');
|
|
149
|
+
}
|
|
150
|
+
await this.browser.getPage().goto(step.parameters.url);
|
|
151
|
+
await this.browser.getPage().waitForLoadState('domcontentloaded');
|
|
152
|
+
snap = await (0, snapshot_1.snapshot)(this.browser);
|
|
153
|
+
result = { navigated_to: step.parameters.url };
|
|
154
|
+
break;
|
|
155
|
+
case 'FIND_AND_CLICK':
|
|
156
|
+
if (!step.parameters.description) {
|
|
157
|
+
throw new Error('FIND_AND_CLICK requires description parameter');
|
|
158
|
+
}
|
|
159
|
+
const clickResult = await this.sentienceAgent.act(`Click on: ${step.parameters.description}`);
|
|
160
|
+
result = { clicked: clickResult.success, outcome: clickResult.outcome };
|
|
161
|
+
break;
|
|
162
|
+
case 'FIND_AND_TYPE':
|
|
163
|
+
if (!step.parameters.description || !step.parameters.text) {
|
|
164
|
+
throw new Error('FIND_AND_TYPE requires description and text parameters');
|
|
165
|
+
}
|
|
166
|
+
const typeResult = await this.sentienceAgent.act(`Type "${step.parameters.text}" into: ${step.parameters.description}`);
|
|
167
|
+
result = { typed: typeResult.success, outcome: typeResult.outcome };
|
|
168
|
+
break;
|
|
169
|
+
case 'PRESS_KEY':
|
|
170
|
+
if (!step.parameters.key) {
|
|
171
|
+
throw new Error('PRESS_KEY requires key parameter');
|
|
172
|
+
}
|
|
173
|
+
await this.browser.getPage().keyboard.press(step.parameters.key);
|
|
174
|
+
snap = await (0, snapshot_1.snapshot)(this.browser);
|
|
175
|
+
result = { key_pressed: step.parameters.key };
|
|
176
|
+
break;
|
|
177
|
+
case 'WAIT':
|
|
178
|
+
const seconds = step.parameters.seconds ?? 2;
|
|
179
|
+
await this.browser.getPage().waitForTimeout(seconds * 1000);
|
|
180
|
+
snap = await (0, snapshot_1.snapshot)(this.browser);
|
|
181
|
+
result = { waited_seconds: seconds };
|
|
182
|
+
break;
|
|
183
|
+
case 'EXTRACT_INFO':
|
|
184
|
+
if (!step.parameters.info_type) {
|
|
185
|
+
throw new Error('EXTRACT_INFO requires info_type parameter');
|
|
186
|
+
}
|
|
187
|
+
snap = await (0, snapshot_1.snapshot)(this.browser);
|
|
188
|
+
const extractedInfo = await this.extractInformation(snap, step.parameters.info_type);
|
|
189
|
+
result = { info: extractedInfo };
|
|
190
|
+
break;
|
|
191
|
+
case 'VERIFY':
|
|
192
|
+
if (!step.parameters.condition) {
|
|
193
|
+
throw new Error('VERIFY requires condition parameter');
|
|
194
|
+
}
|
|
195
|
+
snap = await (0, snapshot_1.snapshot)(this.browser);
|
|
196
|
+
const verified = await this.verifyCondition(snap, step.parameters.condition);
|
|
197
|
+
result = { verified, condition: step.parameters.condition };
|
|
198
|
+
break;
|
|
199
|
+
default:
|
|
200
|
+
throw new Error(`Unknown action type: ${step.action}`);
|
|
201
|
+
}
|
|
202
|
+
const duration = Date.now() - startTime;
|
|
203
|
+
return {
|
|
204
|
+
success: true,
|
|
205
|
+
action: step.action,
|
|
206
|
+
result,
|
|
207
|
+
snapshot: snap,
|
|
208
|
+
duration_ms: duration
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
const duration = Date.now() - startTime;
|
|
213
|
+
return {
|
|
214
|
+
success: false,
|
|
215
|
+
action: step.action,
|
|
216
|
+
error: error instanceof Error ? error.message : String(error),
|
|
217
|
+
duration_ms: duration
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Extract specific information from a page snapshot.
|
|
223
|
+
*/
|
|
224
|
+
async extractInformation(snap, infoType) {
|
|
225
|
+
const snapText = this.snapshotToText(snap);
|
|
226
|
+
const prompt = `From this webpage snapshot, extract: ${infoType}\n\nSnapshot:\n${snapText.slice(0, 3000)}`;
|
|
227
|
+
const llmResponse = await this.llmProvider.generate('You are a web page information extractor. Extract only the requested information concisely.', prompt);
|
|
228
|
+
return llmResponse.content.trim();
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Verify a condition is met on the current page.
|
|
232
|
+
*/
|
|
233
|
+
async verifyCondition(snap, condition) {
|
|
234
|
+
const snapText = this.snapshotToText(snap);
|
|
235
|
+
const prompt = `Does this webpage satisfy the following condition: "${condition}"?\n\nRespond with only "yes" or "no".\n\nSnapshot:\n${snapText.slice(0, 3000)}`;
|
|
236
|
+
const llmResponse = await this.llmProvider.generate('You are a web page condition verifier. Respond with only "yes" or "no".', prompt);
|
|
237
|
+
return llmResponse.content.toLowerCase().includes('yes');
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Convert a Snapshot object to text representation for LLM.
|
|
241
|
+
*/
|
|
242
|
+
snapshotToText(snap) {
|
|
243
|
+
let text = `URL: ${snap.url}\n\nElements:\n`;
|
|
244
|
+
for (const elem of snap.elements.slice(0, 50)) {
|
|
245
|
+
text += `[${elem.id}] ${elem.role || 'element'} ${elem.text || ''}\n`;
|
|
246
|
+
}
|
|
247
|
+
return text;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Synthesize a natural language response from execution results.
|
|
251
|
+
*/
|
|
252
|
+
async synthesizeResponse(userInput, plan, results) {
|
|
253
|
+
const successCount = results.filter(r => r.success).length;
|
|
254
|
+
// Build context from results
|
|
255
|
+
let context = `User request: ${userInput}\n\n`;
|
|
256
|
+
context += `Execution summary: ${successCount}/${results.length} steps succeeded\n\n`;
|
|
257
|
+
for (let i = 0; i < results.length; i++) {
|
|
258
|
+
const step = plan.steps[i];
|
|
259
|
+
const result = results[i];
|
|
260
|
+
context += `Step ${i + 1}: ${step.action}\n`;
|
|
261
|
+
context += ` Reasoning: ${step.reasoning}\n`;
|
|
262
|
+
context += ` Success: ${result.success}\n`;
|
|
263
|
+
if (result.success && result.result) {
|
|
264
|
+
context += ` Result: ${JSON.stringify(result.result, null, 2)}\n`;
|
|
265
|
+
}
|
|
266
|
+
else if (!result.success && result.error) {
|
|
267
|
+
context += ` Error: ${result.error}\n`;
|
|
268
|
+
}
|
|
269
|
+
context += '\n';
|
|
270
|
+
}
|
|
271
|
+
const systemPrompt = `You are a helpful assistant that summarizes browser automation results.
|
|
272
|
+
Given the user's request and execution results, provide a natural, conversational response.
|
|
273
|
+
- Be concise but informative
|
|
274
|
+
- Mention what was accomplished
|
|
275
|
+
- If there were failures, explain them clearly
|
|
276
|
+
- If information was extracted, present it clearly`;
|
|
277
|
+
const llmResponse = await this.llmProvider.generate(systemPrompt, context);
|
|
278
|
+
return llmResponse.content.trim();
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Chat interface that maintains conversation context.
|
|
282
|
+
* Unlike execute(), this method keeps track of the full conversation
|
|
283
|
+
* and uses it for context in subsequent interactions.
|
|
284
|
+
*/
|
|
285
|
+
async chat(message) {
|
|
286
|
+
return await this.execute(message);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get a summary of the entire conversation session.
|
|
290
|
+
*/
|
|
291
|
+
async getSummary() {
|
|
292
|
+
if (this.conversationHistory.length === 0) {
|
|
293
|
+
return "No conversation history yet.";
|
|
294
|
+
}
|
|
295
|
+
const context = this.conversationHistory.map((entry, i) => {
|
|
296
|
+
let text = `${i + 1}. [${entry.role}]: ${entry.content}`;
|
|
297
|
+
if (entry.plan) {
|
|
298
|
+
text += ` (${entry.plan.steps.length} steps)`;
|
|
299
|
+
}
|
|
300
|
+
return text;
|
|
301
|
+
}).join('\n');
|
|
302
|
+
const systemPrompt = `You are summarizing a browser automation conversation session.
|
|
303
|
+
Provide a brief summary of what was accomplished.`;
|
|
304
|
+
const llmResponse = await this.llmProvider.generate(systemPrompt, `Summarize this conversation:\n\n${context}`);
|
|
305
|
+
return llmResponse.content.trim();
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Clear conversation history.
|
|
309
|
+
*/
|
|
310
|
+
clearHistory() {
|
|
311
|
+
this.conversationHistory = [];
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get the conversation history.
|
|
315
|
+
*/
|
|
316
|
+
getHistory() {
|
|
317
|
+
return [...this.conversationHistory];
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Get token usage statistics from the underlying agent.
|
|
321
|
+
*/
|
|
322
|
+
getTokenStats() {
|
|
323
|
+
return this.sentienceAgent.getTokenStats();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
exports.ConversationalAgent = ConversationalAgent;
|
|
327
|
+
//# sourceMappingURL=conversational-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversational-agent.js","sourceRoot":"","sources":["../src/conversational-agent.ts"],"names":[],"mappings":"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"}
|