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.
Files changed (62) hide show
  1. package/README.md +193 -0
  2. package/dist/actions.d.ts +9 -0
  3. package/dist/actions.d.ts.map +1 -0
  4. package/dist/actions.js +113 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/browser.d.ts +24 -0
  7. package/dist/browser.d.ts.map +1 -0
  8. package/dist/browser.js +236 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/cli.d.ts +5 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +158 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/expect.d.ts +16 -0
  15. package/dist/expect.d.ts.map +1 -0
  16. package/dist/expect.js +66 -0
  17. package/dist/expect.js.map +1 -0
  18. package/dist/generator.d.ts +16 -0
  19. package/dist/generator.d.ts.map +1 -0
  20. package/dist/generator.js +205 -0
  21. package/dist/generator.js.map +1 -0
  22. package/dist/index.d.ts +16 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +52 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/inspector.d.ts +13 -0
  27. package/dist/inspector.d.ts.map +1 -0
  28. package/dist/inspector.js +147 -0
  29. package/dist/inspector.js.map +1 -0
  30. package/dist/query.d.ts +8 -0
  31. package/dist/query.d.ts.map +1 -0
  32. package/dist/query.js +337 -0
  33. package/dist/query.js.map +1 -0
  34. package/dist/read.d.ts +40 -0
  35. package/dist/read.d.ts.map +1 -0
  36. package/dist/read.js +86 -0
  37. package/dist/read.js.map +1 -0
  38. package/dist/recorder.d.ts +44 -0
  39. package/dist/recorder.d.ts.map +1 -0
  40. package/dist/recorder.js +256 -0
  41. package/dist/recorder.js.map +1 -0
  42. package/dist/screenshot.d.ts +17 -0
  43. package/dist/screenshot.d.ts.map +1 -0
  44. package/dist/screenshot.js +37 -0
  45. package/dist/screenshot.js.map +1 -0
  46. package/dist/snapshot.d.ts +20 -0
  47. package/dist/snapshot.d.ts.map +1 -0
  48. package/dist/snapshot.js +101 -0
  49. package/dist/snapshot.js.map +1 -0
  50. package/dist/types.d.ts +71 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +6 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/wait.d.ts +7 -0
  55. package/dist/wait.d.ts.map +1 -0
  56. package/dist/wait.js +37 -0
  57. package/dist/wait.js.map +1 -0
  58. package/package.json +58 -0
  59. package/spec/README.md +72 -0
  60. package/spec/SNAPSHOT_V1.md +208 -0
  61. package/spec/sdk-types.md +259 -0
  62. 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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"}
@@ -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":";AAAA;;GAEG;;AAIH,sCAsJC;AAiMD,sBAWC;AAED,oBAGC;AAvWD,SAAgB,aAAa,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAeP,EAAE,CAAC;IAEP,mGAAmG;IACnG,2DAA2D;IAC3D,4CAA4C;IAC5C,uFAAuF;IACvF,MAAM,OAAO,GAAG,gEAAgE,CAAC;IACjF,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAErB,2BAA2B;QAC3B,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAE1C,6BAA6B;QAC7B,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;YAC7B,CAAC;iBAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;gBAC/B,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;YAC1B,CAAC;iBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC7B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,qCAAqC;YACrC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACrC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACvB,eAAe;YACf,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACrC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACvB,eAAe;YACf,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACrC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,eAAe;YACf,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;oBACzB,KAAK,CAAC,cAAc,GAAG,YAAY,GAAG,MAAM,CAAC,CAAC,YAAY;gBAC5D,CAAC;qBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,YAAY,GAAG,MAAM,CAAC;gBAC9C,CAAC;qBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC7B,KAAK,CAAC,WAAW,GAAG,YAAY,GAAG,MAAM,CAAC;gBAC5C,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7D,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACvB,wBAAwB;YACxB,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;oBACzB,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC;gBACtC,CAAC;qBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,YAAY,CAAC;gBACrC,CAAC;qBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC7B,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC;gBACnC,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7D,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,YAAY;YACZ,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;oBACzB,KAAK,CAAC,cAAc,GAAG,YAAY,GAAG,MAAM,CAAC,CAAC,YAAY;gBAC5D,CAAC;qBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,YAAY,GAAG,MAAM,CAAC;gBAC9C,CAAC;qBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC7B,KAAK,CAAC,WAAW,GAAG,YAAY,GAAG,MAAM,CAAC;gBAC5C,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7D,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACvB,qBAAqB;YACrB,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;oBACzB,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC;gBACtC,CAAC;qBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,YAAY,CAAC;gBACrC,CAAC;qBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC7B,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC;gBACnC,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7D,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,cAAc;YACd,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;gBAC/B,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;YACnD,CAAC;iBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC7B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;YACjD,CAAC;iBAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBACzB,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;YACpB,CAAC;iBAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,IAAI,GAAG,KAAK,YAAY,IAAI,SAAS,EAAE,CAAC;gBAC7C,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC;YAClC,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,oDAAoD;gBACpD,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;gBAC1D,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;gBAClB,CAAC;gBACA,KAAK,CAAC,IAAY,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;YACvC,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,wCAAwC;gBACxC,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;gBACxD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;oBACf,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;gBACjB,CAAC;gBACA,KAAK,CAAC,GAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CACnB,OAAgB,EAChB,KAeC;IAED,mBAAmB;IACnB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,YAAY;IACZ,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,WAAW,CAAC,YAAY,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9D,IAAI,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,mEAAmE;QACnE,kDAAkD;IACpD,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC1E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,wEAAwE;QACxE,yEAAyE;IAC3E,CAAC;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,wEAAwE;QACxE,yEAAyE;IAC3E,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,KAAK,CAAC,QAAkB,EAAE,QAAuB;IAC/D,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAgB,CAAC;IAE5F,kBAAkB;IAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7E,kCAAkC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAEpD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,IAAI,CAAC,QAAkB,EAAE,QAAuB;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC"}
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
@@ -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"}