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/agent.js
ADDED
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sentience Agent: High-level automation agent using LLM + SDK
|
|
4
|
+
* Implements observe-think-act loop for natural language commands
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SentienceAgent = void 0;
|
|
8
|
+
const snapshot_1 = require("./snapshot");
|
|
9
|
+
const actions_1 = require("./actions");
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
11
|
+
/**
|
|
12
|
+
* High-level agent that combines Sentience SDK with any LLM provider.
|
|
13
|
+
*
|
|
14
|
+
* Uses observe-think-act loop to execute natural language commands:
|
|
15
|
+
* 1. OBSERVE: Get snapshot of current page state
|
|
16
|
+
* 2. THINK: Query LLM to decide next action
|
|
17
|
+
* 3. ACT: Execute action using SDK
|
|
18
|
+
*
|
|
19
|
+
* Example:
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { SentienceBrowser, SentienceAgent, OpenAIProvider } from 'sentience-ts';
|
|
22
|
+
*
|
|
23
|
+
* const browser = await SentienceBrowser.create({ apiKey: 'sentience_key' });
|
|
24
|
+
* const llm = new OpenAIProvider('openai_key', 'gpt-4o');
|
|
25
|
+
* const agent = new SentienceAgent(browser, llm);
|
|
26
|
+
*
|
|
27
|
+
* await browser.getPage().goto('https://google.com');
|
|
28
|
+
* await agent.act('Click the search box');
|
|
29
|
+
* await agent.act("Type 'magic mouse' into the search field");
|
|
30
|
+
* await agent.act('Press Enter key');
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
class SentienceAgent {
|
|
34
|
+
/**
|
|
35
|
+
* Initialize Sentience Agent
|
|
36
|
+
* @param browser - SentienceBrowser instance
|
|
37
|
+
* @param llm - LLM provider (OpenAIProvider, AnthropicProvider, etc.)
|
|
38
|
+
* @param snapshotLimit - Maximum elements to include in context (default: 50)
|
|
39
|
+
* @param verbose - Print execution logs (default: true)
|
|
40
|
+
* @param tracer - Optional tracer for recording execution (default: undefined)
|
|
41
|
+
*/
|
|
42
|
+
constructor(browser, llm, snapshotLimit = 50, verbose = true, tracer) {
|
|
43
|
+
this.browser = browser;
|
|
44
|
+
this.llm = llm;
|
|
45
|
+
this.snapshotLimit = snapshotLimit;
|
|
46
|
+
this.verbose = verbose;
|
|
47
|
+
this.tracer = tracer;
|
|
48
|
+
this.stepCount = 0;
|
|
49
|
+
this.history = [];
|
|
50
|
+
this.tokenUsage = {
|
|
51
|
+
totalPromptTokens: 0,
|
|
52
|
+
totalCompletionTokens: 0,
|
|
53
|
+
totalTokens: 0,
|
|
54
|
+
byAction: []
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Execute a high-level goal using observe → think → act loop
|
|
59
|
+
* @param goal - Natural language instruction (e.g., "Click the Sign In button")
|
|
60
|
+
* @param maxRetries - Number of retries on failure (default: 2)
|
|
61
|
+
* @param snapshotOptions - Optional snapshot parameters (limit, filter, etc.)
|
|
62
|
+
* @returns Result dict with status, action_taken, reasoning, and execution data
|
|
63
|
+
*
|
|
64
|
+
* Example:
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const result = await agent.act('Click the search box');
|
|
67
|
+
* console.log(result);
|
|
68
|
+
* // { success: true, action: 'click', elementId: 42, ... }
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
async act(goal, maxRetries = 2, snapshotOptions) {
|
|
72
|
+
if (this.verbose) {
|
|
73
|
+
console.log('\n' + '='.repeat(70));
|
|
74
|
+
console.log(`🤖 Agent Goal: ${goal}`);
|
|
75
|
+
console.log('='.repeat(70));
|
|
76
|
+
}
|
|
77
|
+
// Increment step counter and generate step ID
|
|
78
|
+
this.stepCount += 1;
|
|
79
|
+
const stepId = (0, crypto_1.randomUUID)();
|
|
80
|
+
// Emit step_start event
|
|
81
|
+
if (this.tracer) {
|
|
82
|
+
const currentUrl = this.browser.getPage().url();
|
|
83
|
+
this.tracer.emitStepStart(stepId, this.stepCount, goal, 0, currentUrl);
|
|
84
|
+
}
|
|
85
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
86
|
+
try {
|
|
87
|
+
// 1. OBSERVE: Get refined semantic snapshot
|
|
88
|
+
const startTime = Date.now();
|
|
89
|
+
const snapOpts = {
|
|
90
|
+
...snapshotOptions,
|
|
91
|
+
goal: snapshotOptions?.goal ?? goal,
|
|
92
|
+
limit: snapshotOptions?.limit || this.snapshotLimit,
|
|
93
|
+
};
|
|
94
|
+
const snap = await (0, snapshot_1.snapshot)(this.browser, snapOpts);
|
|
95
|
+
if (snap.status !== 'success') {
|
|
96
|
+
throw new Error(`Snapshot failed: ${snap.error}`);
|
|
97
|
+
}
|
|
98
|
+
// Apply element filtering based on goal
|
|
99
|
+
const filteredElements = this.filterElements(snap, goal);
|
|
100
|
+
// Create filtered snapshot
|
|
101
|
+
const filteredSnap = {
|
|
102
|
+
...snap,
|
|
103
|
+
elements: filteredElements
|
|
104
|
+
};
|
|
105
|
+
// Emit snapshot event
|
|
106
|
+
if (this.tracer) {
|
|
107
|
+
this.tracer.emit('snapshot', {
|
|
108
|
+
url: filteredSnap.url,
|
|
109
|
+
elements: filteredSnap.elements.slice(0, 50).map(el => ({
|
|
110
|
+
id: el.id,
|
|
111
|
+
bbox: el.bbox,
|
|
112
|
+
role: el.role,
|
|
113
|
+
text: el.text?.substring(0, 100),
|
|
114
|
+
}))
|
|
115
|
+
}, stepId);
|
|
116
|
+
}
|
|
117
|
+
// 2. GROUND: Format elements for LLM context
|
|
118
|
+
const context = this.buildContext(filteredSnap, goal);
|
|
119
|
+
// 3. THINK: Query LLM for next action
|
|
120
|
+
const llmResponse = await this.queryLLM(context, goal);
|
|
121
|
+
if (this.verbose) {
|
|
122
|
+
console.log(`🧠 LLM Decision: ${llmResponse.content}`);
|
|
123
|
+
}
|
|
124
|
+
// Emit LLM response event
|
|
125
|
+
if (this.tracer) {
|
|
126
|
+
this.tracer.emit('llm_response', {
|
|
127
|
+
model: llmResponse.modelName,
|
|
128
|
+
prompt_tokens: llmResponse.promptTokens,
|
|
129
|
+
completion_tokens: llmResponse.completionTokens,
|
|
130
|
+
response_text: llmResponse.content.substring(0, 500),
|
|
131
|
+
}, stepId);
|
|
132
|
+
}
|
|
133
|
+
// Track token usage
|
|
134
|
+
this.trackTokens(goal, llmResponse);
|
|
135
|
+
// Parse action from LLM response
|
|
136
|
+
const actionStr = llmResponse.content.trim();
|
|
137
|
+
// 4. EXECUTE: Parse and run action
|
|
138
|
+
const result = await this.executeAction(actionStr, filteredSnap);
|
|
139
|
+
const durationMs = Date.now() - startTime;
|
|
140
|
+
result.durationMs = durationMs;
|
|
141
|
+
result.attempt = attempt;
|
|
142
|
+
result.goal = goal;
|
|
143
|
+
// Emit action event
|
|
144
|
+
if (this.tracer) {
|
|
145
|
+
this.tracer.emit('action', {
|
|
146
|
+
action_type: result.action,
|
|
147
|
+
element_id: result.elementId,
|
|
148
|
+
text: result.text,
|
|
149
|
+
key: result.key,
|
|
150
|
+
success: result.success,
|
|
151
|
+
}, stepId);
|
|
152
|
+
}
|
|
153
|
+
// 5. RECORD: Track history
|
|
154
|
+
this.history.push({
|
|
155
|
+
goal,
|
|
156
|
+
action: actionStr,
|
|
157
|
+
result,
|
|
158
|
+
success: result.success,
|
|
159
|
+
attempt,
|
|
160
|
+
durationMs
|
|
161
|
+
});
|
|
162
|
+
if (this.verbose) {
|
|
163
|
+
const status = result.success ? '✅' : '❌';
|
|
164
|
+
console.log(`${status} Completed in ${durationMs}ms`);
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
// Emit error event
|
|
170
|
+
if (this.tracer) {
|
|
171
|
+
this.tracer.emitError(stepId, error.message, attempt);
|
|
172
|
+
}
|
|
173
|
+
if (attempt < maxRetries) {
|
|
174
|
+
if (this.verbose) {
|
|
175
|
+
console.log(`⚠️ Retry ${attempt + 1}/${maxRetries}: ${error.message}`);
|
|
176
|
+
}
|
|
177
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const errorResult = {
|
|
182
|
+
success: false,
|
|
183
|
+
goal,
|
|
184
|
+
error: error.message,
|
|
185
|
+
attempt,
|
|
186
|
+
durationMs: 0
|
|
187
|
+
};
|
|
188
|
+
this.history.push(errorResult);
|
|
189
|
+
throw new Error(`Failed after ${maxRetries} retries: ${error.message}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
throw new Error('Unexpected: loop should have returned or thrown');
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Filter elements from snapshot based on goal context.
|
|
197
|
+
* Applies goal-based keyword matching to boost relevant elements and filters out irrelevant ones.
|
|
198
|
+
*/
|
|
199
|
+
filterElements(snap, goal) {
|
|
200
|
+
let elements = snap.elements;
|
|
201
|
+
// If no goal provided, return all elements (up to limit)
|
|
202
|
+
if (!goal) {
|
|
203
|
+
return elements.slice(0, this.snapshotLimit);
|
|
204
|
+
}
|
|
205
|
+
const goalLower = goal.toLowerCase();
|
|
206
|
+
// Extract keywords from goal
|
|
207
|
+
const keywords = this.extractKeywords(goalLower);
|
|
208
|
+
// Boost elements matching goal keywords
|
|
209
|
+
const scoredElements = [];
|
|
210
|
+
for (const el of elements) {
|
|
211
|
+
let score = el.importance;
|
|
212
|
+
// Boost if element text matches goal
|
|
213
|
+
if (el.text && keywords.some(kw => el.text.toLowerCase().includes(kw))) {
|
|
214
|
+
score += 0.3;
|
|
215
|
+
}
|
|
216
|
+
// Boost if role matches goal intent
|
|
217
|
+
if (goalLower.includes('click') && el.visual_cues.is_clickable) {
|
|
218
|
+
score += 0.2;
|
|
219
|
+
}
|
|
220
|
+
if (goalLower.includes('type') && (el.role === 'textbox' || el.role === 'searchbox')) {
|
|
221
|
+
score += 0.2;
|
|
222
|
+
}
|
|
223
|
+
if (goalLower.includes('search')) {
|
|
224
|
+
// Filter out non-interactive elements for search tasks
|
|
225
|
+
if ((el.role === 'link' || el.role === 'img') && !el.visual_cues.is_primary) {
|
|
226
|
+
score -= 0.5;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
scoredElements.push([score, el]);
|
|
230
|
+
}
|
|
231
|
+
// Re-sort by boosted score
|
|
232
|
+
scoredElements.sort((a, b) => b[0] - a[0]);
|
|
233
|
+
elements = scoredElements.map(([, el]) => el);
|
|
234
|
+
return elements.slice(0, this.snapshotLimit);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Extract meaningful keywords from goal text
|
|
238
|
+
*/
|
|
239
|
+
extractKeywords(text) {
|
|
240
|
+
const stopwords = new Set([
|
|
241
|
+
'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
|
|
242
|
+
'of', 'with', 'by', 'from', 'as', 'is', 'was'
|
|
243
|
+
]);
|
|
244
|
+
const words = text.split(/\s+/);
|
|
245
|
+
return words.filter(w => !stopwords.has(w) && w.length > 2);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Convert snapshot elements to token-efficient prompt string
|
|
249
|
+
* Format: [ID] <role> "text" {cues} @ (x,y) (Imp:score)
|
|
250
|
+
* Note: elements are already filtered by filterElements() in act()
|
|
251
|
+
*/
|
|
252
|
+
buildContext(snap, goal) {
|
|
253
|
+
const lines = [];
|
|
254
|
+
for (const el of snap.elements) {
|
|
255
|
+
// Extract visual cues
|
|
256
|
+
const cues = [];
|
|
257
|
+
if (el.visual_cues.is_primary)
|
|
258
|
+
cues.push('PRIMARY');
|
|
259
|
+
if (el.visual_cues.is_clickable)
|
|
260
|
+
cues.push('CLICKABLE');
|
|
261
|
+
if (el.visual_cues.background_color_name) {
|
|
262
|
+
cues.push(`color:${el.visual_cues.background_color_name}`);
|
|
263
|
+
}
|
|
264
|
+
// Format element line
|
|
265
|
+
const cuesStr = cues.length > 0 ? ` {${cues.join(',')}}` : '';
|
|
266
|
+
const text = el.text || '';
|
|
267
|
+
const textPreview = text.length > 50 ? text.substring(0, 50) + '...' : text;
|
|
268
|
+
lines.push(`[${el.id}] <${el.role}> "${textPreview}"${cuesStr} ` +
|
|
269
|
+
`@ (${Math.floor(el.bbox.x)},${Math.floor(el.bbox.y)}) (Imp:${el.importance})`);
|
|
270
|
+
}
|
|
271
|
+
return lines.join('\n');
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Query LLM with standardized prompt template
|
|
275
|
+
*/
|
|
276
|
+
async queryLLM(domContext, goal) {
|
|
277
|
+
const systemPrompt = `You are an AI web automation agent.
|
|
278
|
+
|
|
279
|
+
GOAL: ${goal}
|
|
280
|
+
|
|
281
|
+
VISIBLE ELEMENTS (sorted by importance, max ${this.snapshotLimit}):
|
|
282
|
+
${domContext}
|
|
283
|
+
|
|
284
|
+
VISUAL CUES EXPLAINED:
|
|
285
|
+
- {PRIMARY}: Main call-to-action element on the page
|
|
286
|
+
- {CLICKABLE}: Element is clickable
|
|
287
|
+
- {color:X}: Background color name
|
|
288
|
+
|
|
289
|
+
RESPONSE FORMAT:
|
|
290
|
+
Return ONLY the function call, no explanation or markdown.
|
|
291
|
+
|
|
292
|
+
Available actions:
|
|
293
|
+
- CLICK(id) - Click element by ID
|
|
294
|
+
- TYPE(id, "text") - Type text into element
|
|
295
|
+
- PRESS("key") - Press keyboard key (Enter, Escape, Tab, ArrowDown, etc)
|
|
296
|
+
- FINISH() - Task complete
|
|
297
|
+
|
|
298
|
+
Examples:
|
|
299
|
+
- CLICK(42)
|
|
300
|
+
- TYPE(15, "magic mouse")
|
|
301
|
+
- PRESS("Enter")
|
|
302
|
+
- FINISH()
|
|
303
|
+
`;
|
|
304
|
+
const userPrompt = 'What is the next step to achieve the goal?';
|
|
305
|
+
return await this.llm.generate(systemPrompt, userPrompt, { temperature: 0.0 });
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Parse action string and execute SDK call
|
|
309
|
+
*/
|
|
310
|
+
async executeAction(actionStr, snap) {
|
|
311
|
+
// Parse CLICK(42)
|
|
312
|
+
let match = actionStr.match(/CLICK\s*\(\s*(\d+)\s*\)/i);
|
|
313
|
+
if (match) {
|
|
314
|
+
const elementId = parseInt(match[1], 10);
|
|
315
|
+
const result = await (0, actions_1.click)(this.browser, elementId);
|
|
316
|
+
return {
|
|
317
|
+
success: result.success,
|
|
318
|
+
action: 'click',
|
|
319
|
+
elementId,
|
|
320
|
+
outcome: result.outcome,
|
|
321
|
+
urlChanged: result.url_changed,
|
|
322
|
+
durationMs: 0,
|
|
323
|
+
attempt: 0,
|
|
324
|
+
goal: ''
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// Parse TYPE(42, "hello world")
|
|
328
|
+
match = actionStr.match(/TYPE\s*\(\s*(\d+)\s*,\s*["']([^"']*)["']\s*\)/i);
|
|
329
|
+
if (match) {
|
|
330
|
+
const elementId = parseInt(match[1], 10);
|
|
331
|
+
const text = match[2];
|
|
332
|
+
const result = await (0, actions_1.typeText)(this.browser, elementId, text);
|
|
333
|
+
return {
|
|
334
|
+
success: result.success,
|
|
335
|
+
action: 'type',
|
|
336
|
+
elementId,
|
|
337
|
+
text,
|
|
338
|
+
outcome: result.outcome,
|
|
339
|
+
durationMs: 0,
|
|
340
|
+
attempt: 0,
|
|
341
|
+
goal: ''
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
// Parse PRESS("Enter")
|
|
345
|
+
match = actionStr.match(/PRESS\s*\(\s*["']([^"']+)["']\s*\)/i);
|
|
346
|
+
if (match) {
|
|
347
|
+
const key = match[1];
|
|
348
|
+
const result = await (0, actions_1.press)(this.browser, key);
|
|
349
|
+
return {
|
|
350
|
+
success: result.success,
|
|
351
|
+
action: 'press',
|
|
352
|
+
key,
|
|
353
|
+
outcome: result.outcome,
|
|
354
|
+
durationMs: 0,
|
|
355
|
+
attempt: 0,
|
|
356
|
+
goal: ''
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
// Parse FINISH()
|
|
360
|
+
if (/FINISH\s*\(\s*\)/i.test(actionStr)) {
|
|
361
|
+
return {
|
|
362
|
+
success: true,
|
|
363
|
+
action: 'finish',
|
|
364
|
+
message: 'Task marked as complete',
|
|
365
|
+
durationMs: 0,
|
|
366
|
+
attempt: 0,
|
|
367
|
+
goal: ''
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
throw new Error(`Unknown action format: ${actionStr}\n` +
|
|
371
|
+
`Expected: CLICK(id), TYPE(id, "text"), PRESS("key"), or FINISH()`);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Track token usage for analytics
|
|
375
|
+
*/
|
|
376
|
+
trackTokens(goal, llmResponse) {
|
|
377
|
+
if (llmResponse.promptTokens) {
|
|
378
|
+
this.tokenUsage.totalPromptTokens += llmResponse.promptTokens;
|
|
379
|
+
}
|
|
380
|
+
if (llmResponse.completionTokens) {
|
|
381
|
+
this.tokenUsage.totalCompletionTokens += llmResponse.completionTokens;
|
|
382
|
+
}
|
|
383
|
+
if (llmResponse.totalTokens) {
|
|
384
|
+
this.tokenUsage.totalTokens += llmResponse.totalTokens;
|
|
385
|
+
}
|
|
386
|
+
this.tokenUsage.byAction.push({
|
|
387
|
+
goal,
|
|
388
|
+
promptTokens: llmResponse.promptTokens,
|
|
389
|
+
completionTokens: llmResponse.completionTokens,
|
|
390
|
+
totalTokens: llmResponse.totalTokens,
|
|
391
|
+
model: llmResponse.modelName
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Get token usage statistics
|
|
396
|
+
* @returns Dictionary with token usage breakdown
|
|
397
|
+
*/
|
|
398
|
+
getTokenStats() {
|
|
399
|
+
return { ...this.tokenUsage };
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get execution history
|
|
403
|
+
* @returns List of all actions taken with results
|
|
404
|
+
*/
|
|
405
|
+
getHistory() {
|
|
406
|
+
return [...this.history];
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Clear execution history and reset token counters
|
|
410
|
+
*/
|
|
411
|
+
clearHistory() {
|
|
412
|
+
this.history = [];
|
|
413
|
+
this.stepCount = 0;
|
|
414
|
+
this.tokenUsage = {
|
|
415
|
+
totalPromptTokens: 0,
|
|
416
|
+
totalCompletionTokens: 0,
|
|
417
|
+
totalTokens: 0,
|
|
418
|
+
byAction: []
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Close the tracer and flush events to disk
|
|
423
|
+
*/
|
|
424
|
+
async closeTracer() {
|
|
425
|
+
if (this.tracer) {
|
|
426
|
+
await this.tracer.close();
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Get the tracer instance (if any)
|
|
431
|
+
*/
|
|
432
|
+
getTracer() {
|
|
433
|
+
return this.tracer;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
exports.SentienceAgent = SentienceAgent;
|
|
437
|
+
//# 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,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright browser harness with extension loading
|
|
3
|
+
*/
|
|
4
|
+
import { BrowserContext, Page } from 'playwright';
|
|
5
|
+
import { StorageState } from './types';
|
|
6
|
+
export declare class SentienceBrowser {
|
|
7
|
+
private context;
|
|
8
|
+
private browser;
|
|
9
|
+
private page;
|
|
10
|
+
private extensionPath;
|
|
11
|
+
private userDataDir;
|
|
12
|
+
private _apiKey?;
|
|
13
|
+
private _apiUrl?;
|
|
14
|
+
private headless;
|
|
15
|
+
private _proxy?;
|
|
16
|
+
private _userDataDir?;
|
|
17
|
+
private _storageState?;
|
|
18
|
+
constructor(apiKey?: string, apiUrl?: string, headless?: boolean, proxy?: string, userDataDir?: string, storageState?: string | StorageState | object);
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
goto(url: string): Promise<void>;
|
|
21
|
+
private waitForExtension;
|
|
22
|
+
getPage(): Page;
|
|
23
|
+
private _copyRecursive;
|
|
24
|
+
getApiKey(): string | undefined;
|
|
25
|
+
getApiUrl(): string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Parse proxy connection string into Playwright format.
|
|
28
|
+
*
|
|
29
|
+
* @param proxyString - Standard format "http://username:password@host:port"
|
|
30
|
+
* or "socks5://user:pass@host:port"
|
|
31
|
+
* @returns Playwright proxy object or undefined if invalid
|
|
32
|
+
*/
|
|
33
|
+
private parseProxy;
|
|
34
|
+
/**
|
|
35
|
+
* Inject storage state (cookies + localStorage) into browser context.
|
|
36
|
+
*
|
|
37
|
+
* @param storageState - Path to JSON file, StorageState object, or plain object
|
|
38
|
+
*/
|
|
39
|
+
private injectStorageState;
|
|
40
|
+
/**
|
|
41
|
+
* Get the browser context (for utilities like saveStorageState)
|
|
42
|
+
*/
|
|
43
|
+
getContext(): BrowserContext;
|
|
44
|
+
close(): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAY,cAAc,EAAE,IAAI,EAAW,MAAM,YAAY,CAAC;AAKrE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAC,CAAiC;gBAGrD,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,OAAO,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM;IA4BzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6VtB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAqBxB,gBAAgB;IAkB9B,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,cAAc;IAYtB,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAsClB;;;;OAIG;YACW,kBAAkB;IA0FhC;;OAEG;IACH,UAAU,IAAI,cAAc;IAOtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAmD7B"}
|