sentience-ts 0.10.3
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/README.md +193 -0
- package/dist/actions.d.ts +9 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +113 -0
- package/dist/actions.js.map +1 -0
- package/dist/browser.d.ts +24 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +236 -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 +158 -0
- package/dist/cli.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 +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -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/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 +20 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +101 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/wait.d.ts +7 -0
- package/dist/wait.d.ts.map +1 -0
- package/dist/wait.js +37 -0
- package/dist/wait.js.map +1 -0
- package/package.json +58 -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,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Inspector tool - helps developers see what the agent "sees"
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Inspector = void 0;
|
|
7
|
+
exports.inspect = inspect;
|
|
8
|
+
class Inspector {
|
|
9
|
+
constructor(browser) {
|
|
10
|
+
this.browser = browser;
|
|
11
|
+
this.active = false;
|
|
12
|
+
}
|
|
13
|
+
async start() {
|
|
14
|
+
const page = this.browser.getPage();
|
|
15
|
+
this.active = true;
|
|
16
|
+
// Inject inspector script into page
|
|
17
|
+
await page.evaluate(() => {
|
|
18
|
+
// Remove existing inspector if any
|
|
19
|
+
if (window.__sentience_inspector_active) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
window.__sentience_inspector_active = true;
|
|
23
|
+
window.__sentience_last_element_id = null;
|
|
24
|
+
// Get element at point
|
|
25
|
+
function getElementAtPoint(x, y) {
|
|
26
|
+
const el = document.elementFromPoint(x, y);
|
|
27
|
+
if (!el)
|
|
28
|
+
return null;
|
|
29
|
+
// Find element in registry
|
|
30
|
+
const registry = window.sentience_registry;
|
|
31
|
+
if (registry) {
|
|
32
|
+
for (let i = 0; i < registry.length; i++) {
|
|
33
|
+
if (registry[i] === el) {
|
|
34
|
+
return i;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
// Mouse move handler
|
|
41
|
+
function handleMouseMove(e) {
|
|
42
|
+
if (!window.__sentience_inspector_active)
|
|
43
|
+
return;
|
|
44
|
+
const elementId = getElementAtPoint(e.clientX, e.clientY);
|
|
45
|
+
if (elementId === null || elementId === window.__sentience_last_element_id) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
window.__sentience_last_element_id = elementId;
|
|
49
|
+
// Get element info from snapshot if available
|
|
50
|
+
const sentience = window.sentience;
|
|
51
|
+
const registry = window.sentience_registry;
|
|
52
|
+
if (sentience && registry) {
|
|
53
|
+
const el = registry[elementId];
|
|
54
|
+
if (el) {
|
|
55
|
+
const rect = el.getBoundingClientRect();
|
|
56
|
+
const text = el.getAttribute('aria-label') ||
|
|
57
|
+
el.value ||
|
|
58
|
+
el.placeholder ||
|
|
59
|
+
el.alt ||
|
|
60
|
+
(el.innerText || '').substring(0, 50);
|
|
61
|
+
const role = el.getAttribute('role') || el.tagName.toLowerCase();
|
|
62
|
+
console.log(`[Sentience Inspector] Element #${elementId}: role=${role}, text="${text}", bbox=(${Math.round(rect.x)}, ${Math.round(rect.y)}, ${Math.round(rect.width)}, ${Math.round(rect.height)})`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Click handler
|
|
67
|
+
function handleClick(e) {
|
|
68
|
+
if (!window.__sentience_inspector_active)
|
|
69
|
+
return;
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
e.stopPropagation();
|
|
72
|
+
const elementId = getElementAtPoint(e.clientX, e.clientY);
|
|
73
|
+
if (elementId === null)
|
|
74
|
+
return;
|
|
75
|
+
// Get full element info
|
|
76
|
+
const sentience = window.sentience;
|
|
77
|
+
const registry = window.sentience_registry;
|
|
78
|
+
if (sentience && registry) {
|
|
79
|
+
const el = registry[elementId];
|
|
80
|
+
if (el) {
|
|
81
|
+
const rect = el.getBoundingClientRect();
|
|
82
|
+
const info = {
|
|
83
|
+
id: elementId,
|
|
84
|
+
tag: el.tagName.toLowerCase(),
|
|
85
|
+
role: el.getAttribute('role') || 'generic',
|
|
86
|
+
text: el.getAttribute('aria-label') ||
|
|
87
|
+
el.value ||
|
|
88
|
+
el.placeholder ||
|
|
89
|
+
el.alt ||
|
|
90
|
+
(el.innerText || '').substring(0, 100),
|
|
91
|
+
bbox: {
|
|
92
|
+
x: Math.round(rect.x),
|
|
93
|
+
y: Math.round(rect.y),
|
|
94
|
+
width: Math.round(rect.width),
|
|
95
|
+
height: Math.round(rect.height),
|
|
96
|
+
},
|
|
97
|
+
attributes: {
|
|
98
|
+
id: el.id || null,
|
|
99
|
+
class: el.className || null,
|
|
100
|
+
name: el.name || null,
|
|
101
|
+
type: el.type || null,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
console.log('[Sentience Inspector] Clicked element:', JSON.stringify(info, null, 2));
|
|
105
|
+
// Also try to get from snapshot if available
|
|
106
|
+
if (sentience && sentience.snapshot) {
|
|
107
|
+
sentience
|
|
108
|
+
.snapshot({ limit: 100 })
|
|
109
|
+
.then((snap) => {
|
|
110
|
+
const element = snap.elements.find((el) => el.id === elementId);
|
|
111
|
+
if (element) {
|
|
112
|
+
console.log('[Sentience Inspector] Snapshot element:', JSON.stringify(element, null, 2));
|
|
113
|
+
}
|
|
114
|
+
})
|
|
115
|
+
.catch(() => { });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Add event listeners
|
|
121
|
+
document.addEventListener('mousemove', handleMouseMove, true);
|
|
122
|
+
document.addEventListener('click', handleClick, true);
|
|
123
|
+
// Store cleanup function
|
|
124
|
+
window.__sentience_inspector_cleanup = () => {
|
|
125
|
+
document.removeEventListener('mousemove', handleMouseMove, true);
|
|
126
|
+
document.removeEventListener('click', handleClick, true);
|
|
127
|
+
window.__sentience_inspector_active = false;
|
|
128
|
+
};
|
|
129
|
+
console.log('[Sentience Inspector] ✅ Inspection mode active. Hover elements to see info, click to see full details.');
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async stop() {
|
|
133
|
+
const page = this.browser.getPage();
|
|
134
|
+
this.active = false;
|
|
135
|
+
// Cleanup inspector
|
|
136
|
+
await page.evaluate(() => {
|
|
137
|
+
if (window.__sentience_inspector_cleanup) {
|
|
138
|
+
window.__sentience_inspector_cleanup();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.Inspector = Inspector;
|
|
144
|
+
function inspect(browser) {
|
|
145
|
+
return new Inspector(browser);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector.js","sourceRoot":"","sources":["../src/inspector.ts"],"names":[],"mappings":"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"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query engine v1 - semantic selector matching
|
|
3
|
+
*/
|
|
4
|
+
import { Snapshot, Element, QuerySelector, QuerySelectorObject } from './types';
|
|
5
|
+
export declare function parseSelector(selector: string): QuerySelectorObject;
|
|
6
|
+
export declare function query(snapshot: Snapshot, selector: QuerySelector): Element[];
|
|
7
|
+
export declare function find(snapshot: Snapshot, selector: QuerySelector): Element | null;
|
|
8
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEhF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAsJnE;AAiMD,wBAAgB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,EAAE,CAW5E;AAED,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,IAAI,CAGhF"}
|
package/dist/query.js
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Query engine v1 - semantic selector matching
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseSelector = parseSelector;
|
|
7
|
+
exports.query = query;
|
|
8
|
+
exports.find = find;
|
|
9
|
+
function parseSelector(selector) {
|
|
10
|
+
const query = {};
|
|
11
|
+
// Match patterns like: key=value, key~'value', key!="value", key>123, key^='prefix', key$='suffix'
|
|
12
|
+
// Updated regex to support: =, !=, ~, ^=, $=, >, >=, <, <=
|
|
13
|
+
// Supports dot notation: attr.id, css.color
|
|
14
|
+
// Note: Handle ^= and $= first (before single char operators) to avoid regex conflicts
|
|
15
|
+
const pattern = /([\w.]+)(\^=|\$=|>=|<=|!=|[=~<>])((?:'[^']+'|"[^"]+"|[^\s]+))/g;
|
|
16
|
+
let match;
|
|
17
|
+
while ((match = pattern.exec(selector)) !== null) {
|
|
18
|
+
const key = match[1];
|
|
19
|
+
const op = match[2];
|
|
20
|
+
let value = match[3];
|
|
21
|
+
// Remove quotes from value
|
|
22
|
+
value = value.replace(/^["']|["']$/g, '');
|
|
23
|
+
// Handle numeric comparisons
|
|
24
|
+
let isNumeric = false;
|
|
25
|
+
let numericValue = 0;
|
|
26
|
+
const parsedNum = parseFloat(value);
|
|
27
|
+
if (!isNaN(parsedNum) && isFinite(parsedNum)) {
|
|
28
|
+
isNumeric = true;
|
|
29
|
+
numericValue = parsedNum;
|
|
30
|
+
}
|
|
31
|
+
if (op === '!=') {
|
|
32
|
+
if (key === 'role') {
|
|
33
|
+
query.role_exclude = value;
|
|
34
|
+
}
|
|
35
|
+
else if (key === 'clickable') {
|
|
36
|
+
query.clickable = false;
|
|
37
|
+
}
|
|
38
|
+
else if (key === 'visible') {
|
|
39
|
+
query.visible = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (op === '~') {
|
|
43
|
+
// Substring match (case-insensitive)
|
|
44
|
+
if (key === 'text' || key === 'name') {
|
|
45
|
+
query.text_contains = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (op === '^=') {
|
|
49
|
+
// Prefix match
|
|
50
|
+
if (key === 'text' || key === 'name') {
|
|
51
|
+
query.text_prefix = value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (op === '$=') {
|
|
55
|
+
// Suffix match
|
|
56
|
+
if (key === 'text' || key === 'name') {
|
|
57
|
+
query.text_suffix = value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (op === '>') {
|
|
61
|
+
// Greater than
|
|
62
|
+
if (isNumeric) {
|
|
63
|
+
if (key === 'importance') {
|
|
64
|
+
query.importance_min = numericValue + 0.0001; // Exclusive
|
|
65
|
+
}
|
|
66
|
+
else if (key.startsWith('bbox.')) {
|
|
67
|
+
query[`${key}_min`] = numericValue + 0.0001;
|
|
68
|
+
}
|
|
69
|
+
else if (key === 'z_index') {
|
|
70
|
+
query.z_index_min = numericValue + 0.0001;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
74
|
+
query[`${key}_gt`] = value;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (op === '>=') {
|
|
78
|
+
// Greater than or equal
|
|
79
|
+
if (isNumeric) {
|
|
80
|
+
if (key === 'importance') {
|
|
81
|
+
query.importance_min = numericValue;
|
|
82
|
+
}
|
|
83
|
+
else if (key.startsWith('bbox.')) {
|
|
84
|
+
query[`${key}_min`] = numericValue;
|
|
85
|
+
}
|
|
86
|
+
else if (key === 'z_index') {
|
|
87
|
+
query.z_index_min = numericValue;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
91
|
+
query[`${key}_gte`] = value;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (op === '<') {
|
|
95
|
+
// Less than
|
|
96
|
+
if (isNumeric) {
|
|
97
|
+
if (key === 'importance') {
|
|
98
|
+
query.importance_max = numericValue - 0.0001; // Exclusive
|
|
99
|
+
}
|
|
100
|
+
else if (key.startsWith('bbox.')) {
|
|
101
|
+
query[`${key}_max`] = numericValue - 0.0001;
|
|
102
|
+
}
|
|
103
|
+
else if (key === 'z_index') {
|
|
104
|
+
query.z_index_max = numericValue - 0.0001;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
108
|
+
query[`${key}_lt`] = value;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (op === '<=') {
|
|
112
|
+
// Less than or equal
|
|
113
|
+
if (isNumeric) {
|
|
114
|
+
if (key === 'importance') {
|
|
115
|
+
query.importance_max = numericValue;
|
|
116
|
+
}
|
|
117
|
+
else if (key.startsWith('bbox.')) {
|
|
118
|
+
query[`${key}_max`] = numericValue;
|
|
119
|
+
}
|
|
120
|
+
else if (key === 'z_index') {
|
|
121
|
+
query.z_index_max = numericValue;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
125
|
+
query[`${key}_lte`] = value;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else if (op === '=') {
|
|
129
|
+
// Exact match
|
|
130
|
+
if (key === 'role') {
|
|
131
|
+
query.role = value;
|
|
132
|
+
}
|
|
133
|
+
else if (key === 'clickable') {
|
|
134
|
+
query.clickable = value.toLowerCase() === 'true';
|
|
135
|
+
}
|
|
136
|
+
else if (key === 'visible') {
|
|
137
|
+
query.visible = value.toLowerCase() === 'true';
|
|
138
|
+
}
|
|
139
|
+
else if (key === 'tag') {
|
|
140
|
+
query.tag = value;
|
|
141
|
+
}
|
|
142
|
+
else if (key === 'name' || key === 'text') {
|
|
143
|
+
query.text = value;
|
|
144
|
+
}
|
|
145
|
+
else if (key === 'importance' && isNumeric) {
|
|
146
|
+
query.importance = numericValue;
|
|
147
|
+
}
|
|
148
|
+
else if (key.startsWith('attr.')) {
|
|
149
|
+
// Dot notation for attributes: attr.id="submit-btn"
|
|
150
|
+
const attrKey = key.substring(5); // Remove "attr." prefix
|
|
151
|
+
if (!query.attr) {
|
|
152
|
+
query.attr = {};
|
|
153
|
+
}
|
|
154
|
+
query.attr[attrKey] = value;
|
|
155
|
+
}
|
|
156
|
+
else if (key.startsWith('css.')) {
|
|
157
|
+
// Dot notation for CSS: css.color="red"
|
|
158
|
+
const cssKey = key.substring(4); // Remove "css." prefix
|
|
159
|
+
if (!query.css) {
|
|
160
|
+
query.css = {};
|
|
161
|
+
}
|
|
162
|
+
query.css[cssKey] = value;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return query;
|
|
167
|
+
}
|
|
168
|
+
function matchElement(element, query) {
|
|
169
|
+
// Role exact match
|
|
170
|
+
if (query.role !== undefined) {
|
|
171
|
+
if (element.role !== query.role) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Role exclusion
|
|
176
|
+
if (query.role_exclude !== undefined) {
|
|
177
|
+
if (element.role === query.role_exclude) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Clickable
|
|
182
|
+
if (query.clickable !== undefined) {
|
|
183
|
+
if (element.visual_cues.is_clickable !== query.clickable) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Visible (using in_viewport and !is_occluded)
|
|
188
|
+
if (query.visible !== undefined) {
|
|
189
|
+
const isVisible = element.in_viewport && !element.is_occluded;
|
|
190
|
+
if (isVisible !== query.visible) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Tag (not yet in Element model, but prepare for future)
|
|
195
|
+
if (query.tag !== undefined) {
|
|
196
|
+
// For now, this will always fail since tag is not in Element model
|
|
197
|
+
// This is a placeholder for future implementation
|
|
198
|
+
}
|
|
199
|
+
// Text exact match
|
|
200
|
+
if (query.text !== undefined) {
|
|
201
|
+
if (!element.text || element.text !== query.text) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Text contains (case-insensitive)
|
|
206
|
+
if (query.text_contains !== undefined) {
|
|
207
|
+
if (!element.text) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
if (!element.text.toLowerCase().includes(query.text_contains.toLowerCase())) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Text prefix match
|
|
215
|
+
if (query.text_prefix !== undefined) {
|
|
216
|
+
if (!element.text) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
if (!element.text.toLowerCase().startsWith(query.text_prefix.toLowerCase())) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Text suffix match
|
|
224
|
+
if (query.text_suffix !== undefined) {
|
|
225
|
+
if (!element.text) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
if (!element.text.toLowerCase().endsWith(query.text_suffix.toLowerCase())) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Importance filtering
|
|
233
|
+
if (query.importance !== undefined) {
|
|
234
|
+
if (element.importance !== query.importance) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (query.importance_min !== undefined) {
|
|
239
|
+
if (element.importance < query.importance_min) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (query.importance_max !== undefined) {
|
|
244
|
+
if (element.importance > query.importance_max) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// BBox filtering (spatial)
|
|
249
|
+
if (query['bbox.x_min'] !== undefined) {
|
|
250
|
+
if (element.bbox.x < query['bbox.x_min']) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (query['bbox.x_max'] !== undefined) {
|
|
255
|
+
if (element.bbox.x > query['bbox.x_max']) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (query['bbox.y_min'] !== undefined) {
|
|
260
|
+
if (element.bbox.y < query['bbox.y_min']) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (query['bbox.y_max'] !== undefined) {
|
|
265
|
+
if (element.bbox.y > query['bbox.y_max']) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (query['bbox.width_min'] !== undefined) {
|
|
270
|
+
if (element.bbox.width < query['bbox.width_min']) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (query['bbox.width_max'] !== undefined) {
|
|
275
|
+
if (element.bbox.width > query['bbox.width_max']) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (query['bbox.height_min'] !== undefined) {
|
|
280
|
+
if (element.bbox.height < query['bbox.height_min']) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (query['bbox.height_max'] !== undefined) {
|
|
285
|
+
if (element.bbox.height > query['bbox.height_max']) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Z-index filtering
|
|
290
|
+
if (query.z_index_min !== undefined) {
|
|
291
|
+
if (element.z_index < query.z_index_min) {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (query.z_index_max !== undefined) {
|
|
296
|
+
if (element.z_index > query.z_index_max) {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// In viewport filtering
|
|
301
|
+
if (query.in_viewport !== undefined) {
|
|
302
|
+
if (element.in_viewport !== query.in_viewport) {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Occlusion filtering
|
|
307
|
+
if (query.is_occluded !== undefined) {
|
|
308
|
+
if (element.is_occluded !== query.is_occluded) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Attribute filtering (dot notation: attr.id="submit-btn")
|
|
313
|
+
if (query.attr !== undefined) {
|
|
314
|
+
// This requires DOM access, which is not available in the Element model
|
|
315
|
+
// This is a placeholder for future implementation when we add DOM access
|
|
316
|
+
}
|
|
317
|
+
// CSS property filtering (dot notation: css.color="red")
|
|
318
|
+
if (query.css !== undefined) {
|
|
319
|
+
// This requires DOM access, which is not available in the Element model
|
|
320
|
+
// This is a placeholder for future implementation when we add DOM access
|
|
321
|
+
}
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
function query(snapshot, selector) {
|
|
325
|
+
// Parse selector if string
|
|
326
|
+
const queryObj = typeof selector === 'string' ? parseSelector(selector) : selector;
|
|
327
|
+
// Filter elements
|
|
328
|
+
const matches = snapshot.elements.filter((el) => matchElement(el, queryObj));
|
|
329
|
+
// Sort by importance (descending)
|
|
330
|
+
matches.sort((a, b) => b.importance - a.importance);
|
|
331
|
+
return matches;
|
|
332
|
+
}
|
|
333
|
+
function find(snapshot, selector) {
|
|
334
|
+
const results = query(snapshot, selector);
|
|
335
|
+
return results[0] || null;
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/read.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read page content - supports raw HTML, text, and markdown formats
|
|
3
|
+
*/
|
|
4
|
+
import { SentienceBrowser } from './browser';
|
|
5
|
+
export interface ReadOptions {
|
|
6
|
+
format?: 'raw' | 'text' | 'markdown';
|
|
7
|
+
enhanceMarkdown?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ReadResult {
|
|
10
|
+
status: 'success' | 'error';
|
|
11
|
+
url: string;
|
|
12
|
+
format: 'raw' | 'text' | 'markdown';
|
|
13
|
+
content: string;
|
|
14
|
+
length: number;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Read page content as raw HTML, text, or markdown
|
|
19
|
+
*
|
|
20
|
+
* @param browser - SentienceBrowser instance
|
|
21
|
+
* @param options - Read options
|
|
22
|
+
* @returns ReadResult with page content
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // Get raw HTML (default)
|
|
26
|
+
* const result = await read(browser);
|
|
27
|
+
* const htmlContent = result.content;
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Get high-quality markdown (uses Turndown internally)
|
|
31
|
+
* const result = await read(browser, { format: 'markdown' });
|
|
32
|
+
* const markdown = result.content;
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Get plain text
|
|
36
|
+
* const result = await read(browser, { format: 'text' });
|
|
37
|
+
* const text = result.content;
|
|
38
|
+
*/
|
|
39
|
+
export declare function read(browser: SentienceBrowser, options?: ReadOptions): Promise<ReadResult>;
|
|
40
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CA+DrB"}
|
package/dist/read.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Read page content - supports raw HTML, text, and markdown formats
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.read = read;
|
|
10
|
+
const turndown_1 = __importDefault(require("turndown"));
|
|
11
|
+
/**
|
|
12
|
+
* Read page content as raw HTML, text, or markdown
|
|
13
|
+
*
|
|
14
|
+
* @param browser - SentienceBrowser instance
|
|
15
|
+
* @param options - Read options
|
|
16
|
+
* @returns ReadResult with page content
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // Get raw HTML (default)
|
|
20
|
+
* const result = await read(browser);
|
|
21
|
+
* const htmlContent = result.content;
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* // Get high-quality markdown (uses Turndown internally)
|
|
25
|
+
* const result = await read(browser, { format: 'markdown' });
|
|
26
|
+
* const markdown = result.content;
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // Get plain text
|
|
30
|
+
* const result = await read(browser, { format: 'text' });
|
|
31
|
+
* const text = result.content;
|
|
32
|
+
*/
|
|
33
|
+
async function read(browser, options = {}) {
|
|
34
|
+
const page = browser.getPage();
|
|
35
|
+
const format = options.format || 'raw'; // Default to 'raw' for Turndown compatibility
|
|
36
|
+
const enhanceMarkdown = options.enhanceMarkdown !== false; // Default to true
|
|
37
|
+
if (format === 'markdown' && enhanceMarkdown) {
|
|
38
|
+
// Get raw HTML from the extension first
|
|
39
|
+
const rawHtmlResult = (await page.evaluate((opts) => {
|
|
40
|
+
return window.sentience.read(opts);
|
|
41
|
+
}, { format: 'raw' }));
|
|
42
|
+
if (rawHtmlResult.status === 'success') {
|
|
43
|
+
const htmlContent = rawHtmlResult.content;
|
|
44
|
+
try {
|
|
45
|
+
const turndownService = new turndown_1.default({
|
|
46
|
+
headingStyle: 'atx',
|
|
47
|
+
hr: '---',
|
|
48
|
+
bulletListMarker: '-',
|
|
49
|
+
codeBlockStyle: 'fenced',
|
|
50
|
+
emDelimiter: '*',
|
|
51
|
+
});
|
|
52
|
+
// Add custom rules for better markdown
|
|
53
|
+
turndownService.addRule('strikethrough', {
|
|
54
|
+
filter: (node) => ['s', 'del', 'strike'].includes(node.nodeName.toLowerCase()),
|
|
55
|
+
replacement: function (content) {
|
|
56
|
+
return '~~' + content + '~~';
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
// Optionally strip certain tags entirely
|
|
60
|
+
turndownService.remove(['script', 'style', 'noscript', 'iframe']);
|
|
61
|
+
const markdownContent = turndownService.turndown(htmlContent);
|
|
62
|
+
return {
|
|
63
|
+
status: 'success',
|
|
64
|
+
url: rawHtmlResult.url,
|
|
65
|
+
format: 'markdown',
|
|
66
|
+
content: markdownContent,
|
|
67
|
+
length: markdownContent.length,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
console.warn(`Turndown conversion failed: ${e.message}, falling back to extension's markdown.`);
|
|
72
|
+
// Fallback to extension's markdown if Turndown fails
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.warn(`Failed to get raw HTML from extension: ${rawHtmlResult.error}, falling back to extension's markdown.`);
|
|
77
|
+
// Fallback to extension's markdown if getting raw HTML fails
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// If not enhanced markdown, or fallback, call extension with requested format
|
|
81
|
+
const result = (await page.evaluate((opts) => {
|
|
82
|
+
return window.sentience.read(opts);
|
|
83
|
+
}, { format }));
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=read.js.map
|
package/dist/read.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAyCH,oBAkEC;AAxGD,wDAAuC;AAgBvC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACI,KAAK,UAAU,IAAI,CACxB,OAAyB,EACzB,UAAuB,EAAE;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,8CAA8C;IACtF,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,kBAAkB;IAE7E,IAAI,MAAM,KAAK,UAAU,IAAI,eAAe,EAAE,CAAC;QAC7C,wCAAwC;QACxC,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CACxC,CAAC,IAAI,EAAE,EAAE;YACP,OAAQ,MAAc,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC,EACD,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAe,CAAC;QAEjB,IAAI,aAAa,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,eAAe,GAAG,IAAI,kBAAe,CAAC;oBAC1C,YAAY,EAAE,KAAK;oBACnB,EAAE,EAAE,KAAK;oBACT,gBAAgB,EAAE,GAAG;oBACrB,cAAc,EAAE,QAAQ;oBACxB,WAAW,EAAE,GAAG;iBACjB,CAAC,CAAC;gBAEH,uCAAuC;gBACvC,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE;oBACvC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAC9E,WAAW,EAAE,UAAU,OAAO;wBAC5B,OAAO,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;oBAC/B,CAAC;iBACF,CAAC,CAAC;gBAEH,yCAAyC;gBACzC,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAQ,CAAC,CAAC;gBAEzE,MAAM,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC9D,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,GAAG,EAAE,aAAa,CAAC,GAAG;oBACtB,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,eAAe;oBACxB,MAAM,EAAE,eAAe,CAAC,MAAM;iBAC/B,CAAC;YACJ,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,OAAO,yCAAyC,CAAC,CAAC;gBAChG,qDAAqD;YACvD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,0CAA0C,aAAa,CAAC,KAAK,yCAAyC,CAAC,CAAC;YACrH,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CACjC,CAAC,IAAI,EAAE,EAAE;QACP,OAAQ,MAAc,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,EACD,EAAE,MAAM,EAAE,CACX,CAAe,CAAC;IAEjB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|