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
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actions v1 - click, type, press
|
|
3
|
+
*/
|
|
4
|
+
import { SentienceBrowser } from './browser';
|
|
5
|
+
import { ActionResult, BBox } from './types';
|
|
6
|
+
export interface ClickRect {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
w?: number;
|
|
10
|
+
width?: number;
|
|
11
|
+
h?: number;
|
|
12
|
+
height?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function click(browser: SentienceBrowser, elementId: number, useMouse?: boolean, takeSnapshot?: boolean): Promise<ActionResult>;
|
|
15
|
+
export declare function typeText(browser: SentienceBrowser, elementId: number, text: string, takeSnapshot?: boolean): Promise<ActionResult>;
|
|
16
|
+
export declare function press(browser: SentienceBrowser, key: string, takeSnapshot?: boolean): Promise<ActionResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Click at the center of a rectangle using Playwright's native mouse simulation.
|
|
19
|
+
* This uses a hybrid approach: calculates center coordinates and uses mouse.click()
|
|
20
|
+
* for realistic event simulation (triggers hover, focus, mousedown, mouseup).
|
|
21
|
+
*
|
|
22
|
+
* @param browser - SentienceBrowser instance
|
|
23
|
+
* @param rect - Rectangle with x, y, w (or width), h (or height) keys, or BBox object
|
|
24
|
+
* @param highlight - Whether to show a red border highlight when clicking (default: true)
|
|
25
|
+
* @param highlightDuration - How long to show the highlight in seconds (default: 2.0)
|
|
26
|
+
* @param takeSnapshot - Whether to take snapshot after action
|
|
27
|
+
* @returns ActionResult
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // Click using rect object
|
|
32
|
+
* await clickRect(browser, { x: 100, y: 200, w: 50, h: 30 });
|
|
33
|
+
*
|
|
34
|
+
* // Click using BBox from element
|
|
35
|
+
* const snap = await snapshot(browser);
|
|
36
|
+
* const element = find(snap, "role=button");
|
|
37
|
+
* if (element) {
|
|
38
|
+
* await clickRect(browser, {
|
|
39
|
+
* x: element.bbox.x,
|
|
40
|
+
* y: element.bbox.y,
|
|
41
|
+
* w: element.bbox.width,
|
|
42
|
+
* h: element.bbox.height
|
|
43
|
+
* });
|
|
44
|
+
* }
|
|
45
|
+
*
|
|
46
|
+
* // Without highlight
|
|
47
|
+
* await clickRect(browser, { x: 100, y: 200, w: 50, h: 30 }, false);
|
|
48
|
+
*
|
|
49
|
+
* // Custom highlight duration
|
|
50
|
+
* await clickRect(browser, { x: 100, y: 200, w: 50, h: 30 }, true, 3.0);
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function clickRect(browser: SentienceBrowser, rect: ClickRect | BBox, highlight?: boolean, highlightDuration?: number, takeSnapshot?: boolean): Promise<ActionResult>;
|
|
54
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAY,IAAI,EAAE,MAAM,SAAS,CAAC;AAGvD,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4DD,wBAAsB,KAAK,CACzB,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,OAAc,EACxB,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,YAAY,CAAC,CAyGvB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,YAAY,CAAC,CA6CvB;AAED,wBAAsB,KAAK,CACzB,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,YAAY,CAAC,CA6BvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,SAAS,GAAG,IAAI,EACtB,SAAS,GAAE,OAAc,EACzB,iBAAiB,GAAE,MAAY,EAC/B,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,YAAY,CAAC,CA2FvB"}
|
package/dist/actions.js
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Actions v1 - click, type, press
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.click = click;
|
|
7
|
+
exports.typeText = typeText;
|
|
8
|
+
exports.press = press;
|
|
9
|
+
exports.clickRect = clickRect;
|
|
10
|
+
const snapshot_1 = require("./snapshot");
|
|
11
|
+
/**
|
|
12
|
+
* Highlight a rectangle with a red border overlay
|
|
13
|
+
*/
|
|
14
|
+
async function highlightRect(browser, rect, durationSec = 2.0) {
|
|
15
|
+
const page = browser.getPage();
|
|
16
|
+
const highlightId = `sentience_highlight_${Date.now()}`;
|
|
17
|
+
// Combine all arguments into a single object for Playwright
|
|
18
|
+
const args = {
|
|
19
|
+
rect: {
|
|
20
|
+
x: rect.x,
|
|
21
|
+
y: rect.y,
|
|
22
|
+
w: rect.w || rect.width || 0,
|
|
23
|
+
h: rect.h || rect.height || 0,
|
|
24
|
+
},
|
|
25
|
+
highlightId,
|
|
26
|
+
durationSec,
|
|
27
|
+
};
|
|
28
|
+
await page.evaluate((args) => {
|
|
29
|
+
const { rect, highlightId, durationSec } = args;
|
|
30
|
+
// Create overlay div
|
|
31
|
+
const overlay = document.createElement('div');
|
|
32
|
+
overlay.id = highlightId;
|
|
33
|
+
overlay.style.position = 'fixed';
|
|
34
|
+
overlay.style.left = `${rect.x}px`;
|
|
35
|
+
overlay.style.top = `${rect.y}px`;
|
|
36
|
+
overlay.style.width = `${rect.w}px`;
|
|
37
|
+
overlay.style.height = `${rect.h}px`;
|
|
38
|
+
overlay.style.border = '3px solid red';
|
|
39
|
+
overlay.style.borderRadius = '2px';
|
|
40
|
+
overlay.style.boxSizing = 'border-box';
|
|
41
|
+
overlay.style.pointerEvents = 'none';
|
|
42
|
+
overlay.style.zIndex = '999999';
|
|
43
|
+
overlay.style.backgroundColor = 'rgba(255, 0, 0, 0.1)';
|
|
44
|
+
overlay.style.transition = 'opacity 0.3s ease-out';
|
|
45
|
+
document.body.appendChild(overlay);
|
|
46
|
+
// Remove after duration
|
|
47
|
+
setTimeout(() => {
|
|
48
|
+
overlay.style.opacity = '0';
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
if (overlay.parentNode) {
|
|
51
|
+
overlay.parentNode.removeChild(overlay);
|
|
52
|
+
}
|
|
53
|
+
}, 300); // Wait for fade-out transition
|
|
54
|
+
}, durationSec * 1000);
|
|
55
|
+
}, args);
|
|
56
|
+
}
|
|
57
|
+
async function click(browser, elementId, useMouse = true, takeSnapshot = false) {
|
|
58
|
+
const page = browser.getPage();
|
|
59
|
+
const startTime = Date.now();
|
|
60
|
+
const urlBefore = page.url();
|
|
61
|
+
let success;
|
|
62
|
+
if (useMouse) {
|
|
63
|
+
// Hybrid approach: Get element bbox from snapshot, calculate center, use mouse.click()
|
|
64
|
+
try {
|
|
65
|
+
const snap = await (0, snapshot_1.snapshot)(browser);
|
|
66
|
+
const element = snap.elements.find((el) => el.id === elementId);
|
|
67
|
+
if (element) {
|
|
68
|
+
// Calculate center of element bbox
|
|
69
|
+
const centerX = element.bbox.x + element.bbox.width / 2;
|
|
70
|
+
const centerY = element.bbox.y + element.bbox.height / 2;
|
|
71
|
+
// Use Playwright's native mouse click for realistic simulation
|
|
72
|
+
await page.mouse.click(centerX, centerY);
|
|
73
|
+
success = true;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Fallback to JS click if element not found in snapshot
|
|
77
|
+
try {
|
|
78
|
+
success = await page.evaluate((id) => {
|
|
79
|
+
return window.sentience.click(id);
|
|
80
|
+
}, elementId);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
// Navigation might have destroyed context, assume success if URL changed
|
|
84
|
+
success = true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
// Fallback to JS click on error
|
|
90
|
+
try {
|
|
91
|
+
success = await page.evaluate((id) => {
|
|
92
|
+
return window.sentience.click(id);
|
|
93
|
+
}, elementId);
|
|
94
|
+
}
|
|
95
|
+
catch (evalError) {
|
|
96
|
+
// Navigation might have destroyed context, assume success
|
|
97
|
+
success = true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Legacy JS-based click
|
|
103
|
+
try {
|
|
104
|
+
success = await page.evaluate((id) => {
|
|
105
|
+
return window.sentience.click(id);
|
|
106
|
+
}, elementId);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// Navigation might have destroyed context, assume success
|
|
110
|
+
success = true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Wait a bit for navigation/DOM updates
|
|
114
|
+
try {
|
|
115
|
+
await page.waitForTimeout(500);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Navigation might have happened, context destroyed
|
|
119
|
+
}
|
|
120
|
+
const durationMs = Date.now() - startTime;
|
|
121
|
+
// Check if URL changed (handle navigation gracefully)
|
|
122
|
+
let urlAfter;
|
|
123
|
+
let urlChanged;
|
|
124
|
+
try {
|
|
125
|
+
urlAfter = page.url();
|
|
126
|
+
urlChanged = urlBefore !== urlAfter;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
// Context destroyed due to navigation - assume URL changed
|
|
130
|
+
urlAfter = urlBefore;
|
|
131
|
+
urlChanged = true;
|
|
132
|
+
}
|
|
133
|
+
// Determine outcome
|
|
134
|
+
let outcome;
|
|
135
|
+
if (urlChanged) {
|
|
136
|
+
outcome = 'navigated';
|
|
137
|
+
}
|
|
138
|
+
else if (success) {
|
|
139
|
+
outcome = 'dom_updated';
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
outcome = 'error';
|
|
143
|
+
}
|
|
144
|
+
// Optional snapshot after
|
|
145
|
+
let snapshotAfter;
|
|
146
|
+
if (takeSnapshot) {
|
|
147
|
+
try {
|
|
148
|
+
snapshotAfter = await (0, snapshot_1.snapshot)(browser);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// Navigation might have destroyed context
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
success,
|
|
156
|
+
duration_ms: durationMs,
|
|
157
|
+
outcome,
|
|
158
|
+
url_changed: urlChanged,
|
|
159
|
+
snapshot_after: snapshotAfter,
|
|
160
|
+
error: success
|
|
161
|
+
? undefined
|
|
162
|
+
: { code: 'click_failed', reason: 'Element not found or not clickable' },
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async function typeText(browser, elementId, text, takeSnapshot = false) {
|
|
166
|
+
const page = browser.getPage();
|
|
167
|
+
const startTime = Date.now();
|
|
168
|
+
const urlBefore = page.url();
|
|
169
|
+
// Focus element first
|
|
170
|
+
const focused = await page.evaluate((id) => {
|
|
171
|
+
const el = window.sentience_registry[id];
|
|
172
|
+
if (el) {
|
|
173
|
+
el.focus();
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}, elementId);
|
|
178
|
+
if (!focused) {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
duration_ms: Date.now() - startTime,
|
|
182
|
+
outcome: 'error',
|
|
183
|
+
error: { code: 'focus_failed', reason: 'Element not found' },
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Type using Playwright keyboard
|
|
187
|
+
await page.keyboard.type(text);
|
|
188
|
+
const durationMs = Date.now() - startTime;
|
|
189
|
+
const urlAfter = page.url();
|
|
190
|
+
const urlChanged = urlBefore !== urlAfter;
|
|
191
|
+
const outcome = urlChanged ? 'navigated' : 'dom_updated';
|
|
192
|
+
let snapshotAfter;
|
|
193
|
+
if (takeSnapshot) {
|
|
194
|
+
snapshotAfter = await (0, snapshot_1.snapshot)(browser);
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
success: true,
|
|
198
|
+
duration_ms: durationMs,
|
|
199
|
+
outcome,
|
|
200
|
+
url_changed: urlChanged,
|
|
201
|
+
snapshot_after: snapshotAfter,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
async function press(browser, key, takeSnapshot = false) {
|
|
205
|
+
const page = browser.getPage();
|
|
206
|
+
const startTime = Date.now();
|
|
207
|
+
const urlBefore = page.url();
|
|
208
|
+
// Press key using Playwright
|
|
209
|
+
await page.keyboard.press(key);
|
|
210
|
+
// Wait a bit for navigation/DOM updates
|
|
211
|
+
await page.waitForTimeout(500);
|
|
212
|
+
const durationMs = Date.now() - startTime;
|
|
213
|
+
const urlAfter = page.url();
|
|
214
|
+
const urlChanged = urlBefore !== urlAfter;
|
|
215
|
+
const outcome = urlChanged ? 'navigated' : 'dom_updated';
|
|
216
|
+
let snapshotAfter;
|
|
217
|
+
if (takeSnapshot) {
|
|
218
|
+
snapshotAfter = await (0, snapshot_1.snapshot)(browser);
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
success: true,
|
|
222
|
+
duration_ms: durationMs,
|
|
223
|
+
outcome,
|
|
224
|
+
url_changed: urlChanged,
|
|
225
|
+
snapshot_after: snapshotAfter,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Click at the center of a rectangle using Playwright's native mouse simulation.
|
|
230
|
+
* This uses a hybrid approach: calculates center coordinates and uses mouse.click()
|
|
231
|
+
* for realistic event simulation (triggers hover, focus, mousedown, mouseup).
|
|
232
|
+
*
|
|
233
|
+
* @param browser - SentienceBrowser instance
|
|
234
|
+
* @param rect - Rectangle with x, y, w (or width), h (or height) keys, or BBox object
|
|
235
|
+
* @param highlight - Whether to show a red border highlight when clicking (default: true)
|
|
236
|
+
* @param highlightDuration - How long to show the highlight in seconds (default: 2.0)
|
|
237
|
+
* @param takeSnapshot - Whether to take snapshot after action
|
|
238
|
+
* @returns ActionResult
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* // Click using rect object
|
|
243
|
+
* await clickRect(browser, { x: 100, y: 200, w: 50, h: 30 });
|
|
244
|
+
*
|
|
245
|
+
* // Click using BBox from element
|
|
246
|
+
* const snap = await snapshot(browser);
|
|
247
|
+
* const element = find(snap, "role=button");
|
|
248
|
+
* if (element) {
|
|
249
|
+
* await clickRect(browser, {
|
|
250
|
+
* x: element.bbox.x,
|
|
251
|
+
* y: element.bbox.y,
|
|
252
|
+
* w: element.bbox.width,
|
|
253
|
+
* h: element.bbox.height
|
|
254
|
+
* });
|
|
255
|
+
* }
|
|
256
|
+
*
|
|
257
|
+
* // Without highlight
|
|
258
|
+
* await clickRect(browser, { x: 100, y: 200, w: 50, h: 30 }, false);
|
|
259
|
+
*
|
|
260
|
+
* // Custom highlight duration
|
|
261
|
+
* await clickRect(browser, { x: 100, y: 200, w: 50, h: 30 }, true, 3.0);
|
|
262
|
+
* ```
|
|
263
|
+
*/
|
|
264
|
+
async function clickRect(browser, rect, highlight = true, highlightDuration = 2.0, takeSnapshot = false) {
|
|
265
|
+
const page = browser.getPage();
|
|
266
|
+
const startTime = Date.now();
|
|
267
|
+
const urlBefore = page.url();
|
|
268
|
+
// Handle BBox object or ClickRect dict
|
|
269
|
+
let x, y, w, h;
|
|
270
|
+
if ('width' in rect && 'height' in rect && !('w' in rect) && !('h' in rect)) {
|
|
271
|
+
// BBox object (width and height are required in BBox)
|
|
272
|
+
const bbox = rect;
|
|
273
|
+
x = bbox.x;
|
|
274
|
+
y = bbox.y;
|
|
275
|
+
w = bbox.width;
|
|
276
|
+
h = bbox.height;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// ClickRect dict
|
|
280
|
+
const clickRect = rect;
|
|
281
|
+
x = clickRect.x;
|
|
282
|
+
y = clickRect.y;
|
|
283
|
+
w = clickRect.w || clickRect.width || 0;
|
|
284
|
+
h = clickRect.h || clickRect.height || 0;
|
|
285
|
+
}
|
|
286
|
+
if (w <= 0 || h <= 0) {
|
|
287
|
+
return {
|
|
288
|
+
success: false,
|
|
289
|
+
duration_ms: 0,
|
|
290
|
+
outcome: 'error',
|
|
291
|
+
error: {
|
|
292
|
+
code: 'invalid_rect',
|
|
293
|
+
reason: 'Rectangle width and height must be positive',
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
// Calculate center of rectangle
|
|
298
|
+
const centerX = x + w / 2;
|
|
299
|
+
const centerY = y + h / 2;
|
|
300
|
+
// Show highlight before clicking (if enabled)
|
|
301
|
+
if (highlight) {
|
|
302
|
+
await highlightRect(browser, { x, y, w, h }, highlightDuration);
|
|
303
|
+
// Small delay to ensure highlight is visible
|
|
304
|
+
await page.waitForTimeout(50);
|
|
305
|
+
}
|
|
306
|
+
// Use Playwright's native mouse click for realistic simulation
|
|
307
|
+
let success;
|
|
308
|
+
let errorMsg;
|
|
309
|
+
try {
|
|
310
|
+
await page.mouse.click(centerX, centerY);
|
|
311
|
+
success = true;
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
success = false;
|
|
315
|
+
errorMsg = error instanceof Error ? error.message : String(error);
|
|
316
|
+
}
|
|
317
|
+
// Wait a bit for navigation/DOM updates
|
|
318
|
+
await page.waitForTimeout(500);
|
|
319
|
+
const durationMs = Date.now() - startTime;
|
|
320
|
+
const urlAfter = page.url();
|
|
321
|
+
const urlChanged = urlBefore !== urlAfter;
|
|
322
|
+
// Determine outcome
|
|
323
|
+
let outcome;
|
|
324
|
+
if (urlChanged) {
|
|
325
|
+
outcome = 'navigated';
|
|
326
|
+
}
|
|
327
|
+
else if (success) {
|
|
328
|
+
outcome = 'dom_updated';
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
outcome = 'error';
|
|
332
|
+
}
|
|
333
|
+
// Optional snapshot after
|
|
334
|
+
let snapshotAfter;
|
|
335
|
+
if (takeSnapshot) {
|
|
336
|
+
snapshotAfter = await (0, snapshot_1.snapshot)(browser);
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
success,
|
|
340
|
+
duration_ms: durationMs,
|
|
341
|
+
outcome,
|
|
342
|
+
url_changed: urlChanged,
|
|
343
|
+
snapshot_after: snapshotAfter,
|
|
344
|
+
error: success
|
|
345
|
+
? undefined
|
|
346
|
+
: { code: 'click_failed', reason: errorMsg || 'Click failed' },
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentience Agent: High-level automation agent using LLM + SDK
|
|
3
|
+
* Implements observe-think-act loop for natural language commands
|
|
4
|
+
*/
|
|
5
|
+
import { SentienceBrowser } from './browser';
|
|
6
|
+
import { SnapshotOptions } from './snapshot';
|
|
7
|
+
import { LLMProvider } from './llm-provider';
|
|
8
|
+
import { Tracer } from './tracing/tracer';
|
|
9
|
+
/**
|
|
10
|
+
* Execution result from agent.act()
|
|
11
|
+
*/
|
|
12
|
+
export interface AgentActResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
action?: string;
|
|
15
|
+
elementId?: number;
|
|
16
|
+
text?: string;
|
|
17
|
+
key?: string;
|
|
18
|
+
outcome?: string;
|
|
19
|
+
urlChanged?: boolean;
|
|
20
|
+
durationMs: number;
|
|
21
|
+
attempt: number;
|
|
22
|
+
goal: string;
|
|
23
|
+
error?: string;
|
|
24
|
+
message?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* History entry for executed action
|
|
28
|
+
*/
|
|
29
|
+
export interface HistoryEntry {
|
|
30
|
+
goal: string;
|
|
31
|
+
action: string;
|
|
32
|
+
result: AgentActResult;
|
|
33
|
+
success: boolean;
|
|
34
|
+
attempt: number;
|
|
35
|
+
durationMs: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Token usage statistics
|
|
39
|
+
*/
|
|
40
|
+
export interface TokenStats {
|
|
41
|
+
totalPromptTokens: number;
|
|
42
|
+
totalCompletionTokens: number;
|
|
43
|
+
totalTokens: number;
|
|
44
|
+
byAction: Array<{
|
|
45
|
+
goal: string;
|
|
46
|
+
promptTokens?: number;
|
|
47
|
+
completionTokens?: number;
|
|
48
|
+
totalTokens?: number;
|
|
49
|
+
model?: string;
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* High-level agent that combines Sentience SDK with any LLM provider.
|
|
54
|
+
*
|
|
55
|
+
* Uses observe-think-act loop to execute natural language commands:
|
|
56
|
+
* 1. OBSERVE: Get snapshot of current page state
|
|
57
|
+
* 2. THINK: Query LLM to decide next action
|
|
58
|
+
* 3. ACT: Execute action using SDK
|
|
59
|
+
*
|
|
60
|
+
* Example:
|
|
61
|
+
* ```typescript
|
|
62
|
+
* import { SentienceBrowser, SentienceAgent, OpenAIProvider } from 'sentience-ts';
|
|
63
|
+
*
|
|
64
|
+
* const browser = await SentienceBrowser.create({ apiKey: 'sentience_key' });
|
|
65
|
+
* const llm = new OpenAIProvider('openai_key', 'gpt-4o');
|
|
66
|
+
* const agent = new SentienceAgent(browser, llm);
|
|
67
|
+
*
|
|
68
|
+
* await browser.getPage().goto('https://google.com');
|
|
69
|
+
* await agent.act('Click the search box');
|
|
70
|
+
* await agent.act("Type 'magic mouse' into the search field");
|
|
71
|
+
* await agent.act('Press Enter key');
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare class SentienceAgent {
|
|
75
|
+
private browser;
|
|
76
|
+
private llm;
|
|
77
|
+
private snapshotLimit;
|
|
78
|
+
private verbose;
|
|
79
|
+
private tracer?;
|
|
80
|
+
private stepCount;
|
|
81
|
+
private history;
|
|
82
|
+
private tokenUsage;
|
|
83
|
+
/**
|
|
84
|
+
* Initialize Sentience Agent
|
|
85
|
+
* @param browser - SentienceBrowser instance
|
|
86
|
+
* @param llm - LLM provider (OpenAIProvider, AnthropicProvider, etc.)
|
|
87
|
+
* @param snapshotLimit - Maximum elements to include in context (default: 50)
|
|
88
|
+
* @param verbose - Print execution logs (default: true)
|
|
89
|
+
* @param tracer - Optional tracer for recording execution (default: undefined)
|
|
90
|
+
*/
|
|
91
|
+
constructor(browser: SentienceBrowser, llm: LLMProvider, snapshotLimit?: number, verbose?: boolean, tracer?: Tracer);
|
|
92
|
+
/**
|
|
93
|
+
* Execute a high-level goal using observe → think → act loop
|
|
94
|
+
* @param goal - Natural language instruction (e.g., "Click the Sign In button")
|
|
95
|
+
* @param maxRetries - Number of retries on failure (default: 2)
|
|
96
|
+
* @param snapshotOptions - Optional snapshot parameters (limit, filter, etc.)
|
|
97
|
+
* @returns Result dict with status, action_taken, reasoning, and execution data
|
|
98
|
+
*
|
|
99
|
+
* Example:
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const result = await agent.act('Click the search box');
|
|
102
|
+
* console.log(result);
|
|
103
|
+
* // { success: true, action: 'click', elementId: 42, ... }
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
act(goal: string, maxRetries?: number, snapshotOptions?: SnapshotOptions): Promise<AgentActResult>;
|
|
107
|
+
/**
|
|
108
|
+
* Filter elements from snapshot based on goal context.
|
|
109
|
+
* Applies goal-based keyword matching to boost relevant elements and filters out irrelevant ones.
|
|
110
|
+
*/
|
|
111
|
+
private filterElements;
|
|
112
|
+
/**
|
|
113
|
+
* Extract meaningful keywords from goal text
|
|
114
|
+
*/
|
|
115
|
+
private extractKeywords;
|
|
116
|
+
/**
|
|
117
|
+
* Convert snapshot elements to token-efficient prompt string
|
|
118
|
+
* Format: [ID] <role> "text" {cues} @ (x,y) (Imp:score)
|
|
119
|
+
* Note: elements are already filtered by filterElements() in act()
|
|
120
|
+
*/
|
|
121
|
+
private buildContext;
|
|
122
|
+
/**
|
|
123
|
+
* Query LLM with standardized prompt template
|
|
124
|
+
*/
|
|
125
|
+
private queryLLM;
|
|
126
|
+
/**
|
|
127
|
+
* Parse action string and execute SDK call
|
|
128
|
+
*/
|
|
129
|
+
private executeAction;
|
|
130
|
+
/**
|
|
131
|
+
* Track token usage for analytics
|
|
132
|
+
*/
|
|
133
|
+
private trackTokens;
|
|
134
|
+
/**
|
|
135
|
+
* Get token usage statistics
|
|
136
|
+
* @returns Dictionary with token usage breakdown
|
|
137
|
+
*/
|
|
138
|
+
getTokenStats(): TokenStats;
|
|
139
|
+
/**
|
|
140
|
+
* Get execution history
|
|
141
|
+
* @returns List of all actions taken with results
|
|
142
|
+
*/
|
|
143
|
+
getHistory(): HistoryEntry[];
|
|
144
|
+
/**
|
|
145
|
+
* Clear execution history and reset token counters
|
|
146
|
+
*/
|
|
147
|
+
clearHistory(): void;
|
|
148
|
+
/**
|
|
149
|
+
* Close the tracer and flush events to disk
|
|
150
|
+
*/
|
|
151
|
+
closeTracer(): Promise<void>;
|
|
152
|
+
/**
|
|
153
|
+
* Get the tracer instance (if any)
|
|
154
|
+
*/
|
|
155
|
+
getTracer(): Tracer | undefined;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAY,eAAe,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAe,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,UAAU,CAAa;IAE/B;;;;;;;OAOG;gBAED,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,WAAW,EAChB,aAAa,GAAE,MAAW,EAC1B,OAAO,GAAE,OAAc,EACvB,MAAM,CAAC,EAAE,MAAM;IAiBjB;;;;;;;;;;;;;OAaG;IACG,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAU,EACtB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,cAAc,CAAC;IAmJ1B;;;OAGG;IACH,OAAO,CAAC,cAAc;IA+CtB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA0BpB;;OAEG;YACW,QAAQ;IAkCtB;;OAEG;YACW,aAAa;IAsE3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;;OAGG;IACH,aAAa,IAAI,UAAU;IAI3B;;;OAGG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;OAEG;IACH,YAAY,IAAI,IAAI;IAWpB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;CAGhC"}
|