@predicatelabs/sdk 0.99.9
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 +24 -0
- package/README.md +252 -0
- package/dist/actions.d.ts +185 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +1120 -0
- package/dist/actions.js.map +1 -0
- package/dist/agent-runtime.d.ts +352 -0
- package/dist/agent-runtime.d.ts.map +1 -0
- package/dist/agent-runtime.js +1170 -0
- package/dist/agent-runtime.js.map +1 -0
- package/dist/agent.d.ts +164 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +408 -0
- package/dist/agent.js.map +1 -0
- package/dist/asserts/expect.d.ts +159 -0
- package/dist/asserts/expect.d.ts.map +1 -0
- package/dist/asserts/expect.js +547 -0
- package/dist/asserts/expect.js.map +1 -0
- package/dist/asserts/index.d.ts +58 -0
- package/dist/asserts/index.d.ts.map +1 -0
- package/dist/asserts/index.js +70 -0
- package/dist/asserts/index.js.map +1 -0
- package/dist/asserts/query.d.ts +199 -0
- package/dist/asserts/query.d.ts.map +1 -0
- package/dist/asserts/query.js +288 -0
- package/dist/asserts/query.js.map +1 -0
- package/dist/backends/actions.d.ts +119 -0
- package/dist/backends/actions.d.ts.map +1 -0
- package/dist/backends/actions.js +291 -0
- package/dist/backends/actions.js.map +1 -0
- package/dist/backends/browser-use-adapter.d.ts +131 -0
- package/dist/backends/browser-use-adapter.d.ts.map +1 -0
- package/dist/backends/browser-use-adapter.js +219 -0
- package/dist/backends/browser-use-adapter.js.map +1 -0
- package/dist/backends/cdp-backend.d.ts +66 -0
- package/dist/backends/cdp-backend.d.ts.map +1 -0
- package/dist/backends/cdp-backend.js +273 -0
- package/dist/backends/cdp-backend.js.map +1 -0
- package/dist/backends/index.d.ts +80 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +101 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/protocol.d.ts +156 -0
- package/dist/backends/protocol.d.ts.map +1 -0
- package/dist/backends/protocol.js +16 -0
- package/dist/backends/protocol.js.map +1 -0
- package/dist/backends/sentience-context.d.ts +143 -0
- package/dist/backends/sentience-context.d.ts.map +1 -0
- package/dist/backends/sentience-context.js +359 -0
- package/dist/backends/sentience-context.js.map +1 -0
- package/dist/backends/snapshot.d.ts +188 -0
- package/dist/backends/snapshot.d.ts.map +1 -0
- package/dist/backends/snapshot.js +360 -0
- package/dist/backends/snapshot.js.map +1 -0
- package/dist/browser.d.ts +154 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +920 -0
- package/dist/browser.js.map +1 -0
- package/dist/canonicalization.d.ts +126 -0
- package/dist/canonicalization.d.ts.map +1 -0
- package/dist/canonicalization.js +161 -0
- package/dist/canonicalization.js.map +1 -0
- package/dist/captcha/strategies.d.ts +12 -0
- package/dist/captcha/strategies.d.ts.map +1 -0
- package/dist/captcha/strategies.js +43 -0
- package/dist/captcha/strategies.js.map +1 -0
- package/dist/captcha/types.d.ts +45 -0
- package/dist/captcha/types.d.ts.map +1 -0
- package/dist/captcha/types.js +12 -0
- package/dist/captcha/types.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +422 -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 +341 -0
- package/dist/conversational-agent.js.map +1 -0
- package/dist/cursor-policy.d.ts +41 -0
- package/dist/cursor-policy.d.ts.map +1 -0
- package/dist/cursor-policy.js +81 -0
- package/dist/cursor-policy.js.map +1 -0
- package/dist/debugger.d.ts +28 -0
- package/dist/debugger.d.ts.map +1 -0
- package/dist/debugger.js +107 -0
- package/dist/debugger.js.map +1 -0
- package/dist/expect.d.ts +16 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +67 -0
- package/dist/expect.js.map +1 -0
- package/dist/failure-artifacts.d.ts +95 -0
- package/dist/failure-artifacts.d.ts.map +1 -0
- package/dist/failure-artifacts.js +805 -0
- package/dist/failure-artifacts.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 +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +160 -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 +153 -0
- package/dist/inspector.js.map +1 -0
- package/dist/llm-provider.d.ts +144 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +460 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/ordinal.d.ts +90 -0
- package/dist/ordinal.d.ts.map +1 -0
- package/dist/ordinal.js +249 -0
- package/dist/ordinal.js.map +1 -0
- package/dist/overlay.d.ts +63 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +102 -0
- package/dist/overlay.js.map +1 -0
- package/dist/protocols/browser-protocol.d.ts +79 -0
- package/dist/protocols/browser-protocol.d.ts.map +1 -0
- package/dist/protocols/browser-protocol.js +9 -0
- package/dist/protocols/browser-protocol.js.map +1 -0
- package/dist/query.d.ts +66 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +482 -0
- package/dist/query.js.map +1 -0
- package/dist/read.d.ts +47 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +128 -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 +262 -0
- package/dist/recorder.js.map +1 -0
- package/dist/runtime-agent.d.ts +72 -0
- package/dist/runtime-agent.d.ts.map +1 -0
- package/dist/runtime-agent.js +357 -0
- package/dist/runtime-agent.js.map +1 -0
- package/dist/screenshot.d.ts +17 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +40 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/snapshot-diff.d.ts +23 -0
- package/dist/snapshot-diff.d.ts.map +1 -0
- package/dist/snapshot-diff.js +119 -0
- package/dist/snapshot-diff.js.map +1 -0
- package/dist/snapshot.d.ts +47 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +358 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/textSearch.d.ts +64 -0
- package/dist/textSearch.d.ts.map +1 -0
- package/dist/textSearch.js +113 -0
- package/dist/textSearch.js.map +1 -0
- package/dist/tools/context.d.ts +18 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +40 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/defaults.d.ts +5 -0
- package/dist/tools/defaults.d.ts.map +1 -0
- package/dist/tools/defaults.js +368 -0
- package/dist/tools/defaults.js.map +1 -0
- package/dist/tools/filesystem.d.ts +12 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +137 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +38 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +100 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tracing/cloud-sink.d.ts +189 -0
- package/dist/tracing/cloud-sink.d.ts.map +1 -0
- package/dist/tracing/cloud-sink.js +1067 -0
- package/dist/tracing/cloud-sink.js.map +1 -0
- package/dist/tracing/index-schema.d.ts +231 -0
- package/dist/tracing/index-schema.d.ts.map +1 -0
- package/dist/tracing/index-schema.js +235 -0
- package/dist/tracing/index-schema.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/indexer.d.ts +20 -0
- package/dist/tracing/indexer.d.ts.map +1 -0
- package/dist/tracing/indexer.js +347 -0
- package/dist/tracing/indexer.js.map +1 -0
- package/dist/tracing/jsonl-sink.d.ts +51 -0
- package/dist/tracing/jsonl-sink.d.ts.map +1 -0
- package/dist/tracing/jsonl-sink.js +329 -0
- package/dist/tracing/jsonl-sink.js.map +1 -0
- package/dist/tracing/sink.d.ts +25 -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 +102 -0
- package/dist/tracing/tracer-factory.d.ts.map +1 -0
- package/dist/tracing/tracer-factory.js +375 -0
- package/dist/tracing/tracer-factory.js.map +1 -0
- package/dist/tracing/tracer.d.ts +140 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +336 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/tracing/types.d.ts +203 -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 +422 -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/action-executor.d.ts +25 -0
- package/dist/utils/action-executor.d.ts.map +1 -0
- package/dist/utils/action-executor.js +121 -0
- package/dist/utils/action-executor.js.map +1 -0
- package/dist/utils/browser-evaluator.d.ts +76 -0
- package/dist/utils/browser-evaluator.d.ts.map +1 -0
- package/dist/utils/browser-evaluator.js +130 -0
- package/dist/utils/browser-evaluator.js.map +1 -0
- package/dist/utils/browser.d.ts +30 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +75 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/element-filter.d.ts +76 -0
- package/dist/utils/element-filter.d.ts.map +1 -0
- package/dist/utils/element-filter.js +195 -0
- package/dist/utils/element-filter.js.map +1 -0
- package/dist/utils/grid-utils.d.ts +37 -0
- package/dist/utils/grid-utils.d.ts.map +1 -0
- package/dist/utils/grid-utils.js +283 -0
- package/dist/utils/grid-utils.js.map +1 -0
- package/dist/utils/llm-interaction-handler.d.ts +41 -0
- package/dist/utils/llm-interaction-handler.d.ts.map +1 -0
- package/dist/utils/llm-interaction-handler.js +171 -0
- package/dist/utils/llm-interaction-handler.js.map +1 -0
- package/dist/utils/llm-response-builder.d.ts +56 -0
- package/dist/utils/llm-response-builder.d.ts.map +1 -0
- package/dist/utils/llm-response-builder.js +130 -0
- package/dist/utils/llm-response-builder.js.map +1 -0
- package/dist/utils/selector-utils.d.ts +12 -0
- package/dist/utils/selector-utils.d.ts.map +1 -0
- package/dist/utils/selector-utils.js +32 -0
- package/dist/utils/selector-utils.js.map +1 -0
- package/dist/utils/snapshot-event-builder.d.ts +28 -0
- package/dist/utils/snapshot-event-builder.d.ts.map +1 -0
- package/dist/utils/snapshot-event-builder.js +88 -0
- package/dist/utils/snapshot-event-builder.js.map +1 -0
- package/dist/utils/snapshot-processor.d.ts +27 -0
- package/dist/utils/snapshot-processor.d.ts.map +1 -0
- package/dist/utils/snapshot-processor.js +47 -0
- package/dist/utils/snapshot-processor.js.map +1 -0
- package/dist/utils/trace-event-builder.d.ts +122 -0
- package/dist/utils/trace-event-builder.d.ts.map +1 -0
- package/dist/utils/trace-event-builder.js +365 -0
- package/dist/utils/trace-event-builder.js.map +1 -0
- package/dist/utils/trace-file-manager.d.ts +70 -0
- package/dist/utils/trace-file-manager.d.ts.map +1 -0
- package/dist/utils/trace-file-manager.js +194 -0
- package/dist/utils/trace-file-manager.js.map +1 -0
- package/dist/utils/zod.d.ts +5 -0
- package/dist/utils/zod.d.ts.map +1 -0
- package/dist/utils/zod.js +80 -0
- package/dist/utils/zod.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +13 -0
- package/dist/utils.js.map +1 -0
- package/dist/verification.d.ts +194 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +530 -0
- package/dist/verification.js.map +1 -0
- package/dist/vision-executor.d.ts +18 -0
- package/dist/vision-executor.d.ts.map +1 -0
- package/dist/vision-executor.js +60 -0
- package/dist/vision-executor.js.map +1 -0
- package/dist/visual-agent.d.ts +120 -0
- package/dist/visual-agent.d.ts.map +1 -0
- package/dist/visual-agent.js +796 -0
- package/dist/visual-agent.js.map +1 -0
- package/dist/wait.d.ts +35 -0
- package/dist/wait.d.ts.map +1 -0
- package/dist/wait.js +76 -0
- package/dist/wait.js.map +1 -0
- package/package.json +94 -0
- package/spec/README.md +72 -0
- package/spec/SNAPSHOT_V1.md +208 -0
- package/spec/sdk-types.md +259 -0
- package/spec/snapshot.schema.json +148 -0
- package/src/extension/background.js +104 -0
- package/src/extension/content.js +162 -0
- package/src/extension/injected_api.js +1399 -0
- package/src/extension/manifest.json +36 -0
- package/src/extension/pkg/README.md +1340 -0
- package/src/extension/pkg/package.json +15 -0
- package/src/extension/pkg/sentience_core.d.ts +51 -0
- package/src/extension/pkg/sentience_core.js +371 -0
- package/src/extension/pkg/sentience_core_bg.wasm +0 -0
- package/src/extension/pkg/sentience_core_bg.wasm.d.ts +10 -0
- package/src/extension/release.json +116 -0
package/dist/query.js
ADDED
|
@@ -0,0 +1,482 @@
|
|
|
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
|
+
/**
|
|
10
|
+
* Parse a selector string into a QuerySelectorObject
|
|
11
|
+
*
|
|
12
|
+
* Supports operators: =, !=, ~, ^=, $=, >, >=, <, <=
|
|
13
|
+
* Supports dot notation: attr.id, css.color, bbox.x
|
|
14
|
+
*
|
|
15
|
+
* @param selector - Selector string (e.g., "role=button", "text~search", "importance>0.5")
|
|
16
|
+
* @returns Parsed query object
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const query = parseSelector('role=button clickable=true importance>0.5');
|
|
21
|
+
* // Returns: { role: 'button', clickable: true, importance_min: 0.5 }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
function parseSelector(selector) {
|
|
25
|
+
const query = {};
|
|
26
|
+
// Match patterns like: key=value, key~'value', key!="value", key>123, key^='prefix', key$='suffix'
|
|
27
|
+
// Updated regex to support: =, !=, ~, ^=, $=, >, >=, <, <=
|
|
28
|
+
// Supports dot notation: attr.id, css.color
|
|
29
|
+
// Note: Handle ^= and $= first (before single char operators) to avoid regex conflicts
|
|
30
|
+
const pattern = /([\w.]+)(\^=|\$=|>=|<=|!=|[=~<>])((?:'[^']+'|"[^"]+"|[^\s]+))/g;
|
|
31
|
+
let match;
|
|
32
|
+
while ((match = pattern.exec(selector)) !== null) {
|
|
33
|
+
const key = match[1];
|
|
34
|
+
const op = match[2];
|
|
35
|
+
let value = match[3];
|
|
36
|
+
// Remove quotes from value
|
|
37
|
+
value = value.replace(/^["']|["']$/g, '');
|
|
38
|
+
// Handle numeric comparisons
|
|
39
|
+
let isNumeric = false;
|
|
40
|
+
let numericValue = 0;
|
|
41
|
+
const parsedNum = parseFloat(value);
|
|
42
|
+
if (!isNaN(parsedNum) && isFinite(parsedNum)) {
|
|
43
|
+
isNumeric = true;
|
|
44
|
+
numericValue = parsedNum;
|
|
45
|
+
}
|
|
46
|
+
if (op === '!=') {
|
|
47
|
+
if (key === 'role') {
|
|
48
|
+
query.role_exclude = value;
|
|
49
|
+
}
|
|
50
|
+
else if (key === 'clickable') {
|
|
51
|
+
query.clickable = false;
|
|
52
|
+
}
|
|
53
|
+
else if (key === 'visible') {
|
|
54
|
+
query.visible = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (op === '~') {
|
|
58
|
+
// Substring match (case-insensitive)
|
|
59
|
+
if (key === 'text') {
|
|
60
|
+
query.text_contains = value;
|
|
61
|
+
}
|
|
62
|
+
else if (key === 'name') {
|
|
63
|
+
query.name_contains = value;
|
|
64
|
+
}
|
|
65
|
+
else if (key === 'value') {
|
|
66
|
+
query.value_contains = value;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (op === '^=') {
|
|
70
|
+
// Prefix match
|
|
71
|
+
if (key === 'text') {
|
|
72
|
+
query.text_prefix = value;
|
|
73
|
+
}
|
|
74
|
+
else if (key === 'name') {
|
|
75
|
+
query.name_prefix = value;
|
|
76
|
+
}
|
|
77
|
+
else if (key === 'value') {
|
|
78
|
+
query.value_prefix = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else if (op === '$=') {
|
|
82
|
+
// Suffix match
|
|
83
|
+
if (key === 'text') {
|
|
84
|
+
query.text_suffix = value;
|
|
85
|
+
}
|
|
86
|
+
else if (key === 'name') {
|
|
87
|
+
query.name_suffix = value;
|
|
88
|
+
}
|
|
89
|
+
else if (key === 'value') {
|
|
90
|
+
query.value_suffix = value;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (op === '>') {
|
|
94
|
+
// Greater than
|
|
95
|
+
if (isNumeric) {
|
|
96
|
+
if (key === 'importance') {
|
|
97
|
+
query.importance_min = numericValue + 0.0001; // Exclusive
|
|
98
|
+
}
|
|
99
|
+
else if (key.startsWith('bbox.')) {
|
|
100
|
+
query[`${key}_min`] = numericValue + 0.0001;
|
|
101
|
+
}
|
|
102
|
+
else if (key === 'z_index') {
|
|
103
|
+
query.z_index_min = numericValue + 0.0001;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
107
|
+
query[`${key}_gt`] = value;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else if (op === '>=') {
|
|
111
|
+
// Greater than or equal
|
|
112
|
+
if (isNumeric) {
|
|
113
|
+
if (key === 'importance') {
|
|
114
|
+
query.importance_min = numericValue;
|
|
115
|
+
}
|
|
116
|
+
else if (key.startsWith('bbox.')) {
|
|
117
|
+
query[`${key}_min`] = numericValue;
|
|
118
|
+
}
|
|
119
|
+
else if (key === 'z_index') {
|
|
120
|
+
query.z_index_min = numericValue;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
124
|
+
query[`${key}_gte`] = value;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else if (op === '<') {
|
|
128
|
+
// Less than
|
|
129
|
+
if (isNumeric) {
|
|
130
|
+
if (key === 'importance') {
|
|
131
|
+
query.importance_max = numericValue - 0.0001; // Exclusive
|
|
132
|
+
}
|
|
133
|
+
else if (key.startsWith('bbox.')) {
|
|
134
|
+
query[`${key}_max`] = numericValue - 0.0001;
|
|
135
|
+
}
|
|
136
|
+
else if (key === 'z_index') {
|
|
137
|
+
query.z_index_max = numericValue - 0.0001;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
141
|
+
query[`${key}_lt`] = value;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else if (op === '<=') {
|
|
145
|
+
// Less than or equal
|
|
146
|
+
if (isNumeric) {
|
|
147
|
+
if (key === 'importance') {
|
|
148
|
+
query.importance_max = numericValue;
|
|
149
|
+
}
|
|
150
|
+
else if (key.startsWith('bbox.')) {
|
|
151
|
+
query[`${key}_max`] = numericValue;
|
|
152
|
+
}
|
|
153
|
+
else if (key === 'z_index') {
|
|
154
|
+
query.z_index_max = numericValue;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
158
|
+
query[`${key}_lte`] = value;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (op === '=') {
|
|
162
|
+
// Exact match
|
|
163
|
+
if (key === 'role') {
|
|
164
|
+
query.role = value;
|
|
165
|
+
}
|
|
166
|
+
else if (key === 'clickable') {
|
|
167
|
+
query.clickable = value.toLowerCase() === 'true';
|
|
168
|
+
}
|
|
169
|
+
else if (key === 'visible') {
|
|
170
|
+
query.visible = value.toLowerCase() === 'true';
|
|
171
|
+
}
|
|
172
|
+
else if (key === 'tag') {
|
|
173
|
+
query.tag = value;
|
|
174
|
+
}
|
|
175
|
+
else if (key === 'text') {
|
|
176
|
+
query.text = value;
|
|
177
|
+
}
|
|
178
|
+
else if (key === 'name') {
|
|
179
|
+
query.name = value;
|
|
180
|
+
}
|
|
181
|
+
else if (key === 'value') {
|
|
182
|
+
query.value = value;
|
|
183
|
+
}
|
|
184
|
+
else if (key === 'checked' || key === 'disabled' || key === 'expanded') {
|
|
185
|
+
query[key] = value.toLowerCase() === 'true';
|
|
186
|
+
}
|
|
187
|
+
else if (key === 'importance' && isNumeric) {
|
|
188
|
+
query.importance = numericValue;
|
|
189
|
+
}
|
|
190
|
+
else if (key.startsWith('attr.')) {
|
|
191
|
+
// Dot notation for attributes: attr.id="submit-btn"
|
|
192
|
+
const attrKey = key.substring(5); // Remove "attr." prefix
|
|
193
|
+
if (!query.attr) {
|
|
194
|
+
query.attr = {};
|
|
195
|
+
}
|
|
196
|
+
query.attr[attrKey] = value;
|
|
197
|
+
}
|
|
198
|
+
else if (key.startsWith('css.')) {
|
|
199
|
+
// Dot notation for CSS: css.color="red"
|
|
200
|
+
const cssKey = key.substring(4); // Remove "css." prefix
|
|
201
|
+
if (!query.css) {
|
|
202
|
+
query.css = {};
|
|
203
|
+
}
|
|
204
|
+
query.css[cssKey] = value;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return query;
|
|
209
|
+
}
|
|
210
|
+
function matchElement(element, query) {
|
|
211
|
+
// Role exact match
|
|
212
|
+
if (query.role !== undefined) {
|
|
213
|
+
if (element.role !== query.role) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Role exclusion
|
|
218
|
+
if (query.role_exclude !== undefined) {
|
|
219
|
+
if (element.role === query.role_exclude) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Clickable
|
|
224
|
+
if (query.clickable !== undefined) {
|
|
225
|
+
if (element.visual_cues.is_clickable !== query.clickable) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Visible (using in_viewport and !is_occluded)
|
|
230
|
+
if (query.visible !== undefined) {
|
|
231
|
+
const isVisible = element.in_viewport && !element.is_occluded;
|
|
232
|
+
if (isVisible !== query.visible) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Tag (not yet in Element model, but prepare for future)
|
|
237
|
+
if (query.tag !== undefined) {
|
|
238
|
+
// For now, this will always fail since tag is not in Element model
|
|
239
|
+
// This is a placeholder for future implementation
|
|
240
|
+
}
|
|
241
|
+
// Text exact match
|
|
242
|
+
if (query.text !== undefined) {
|
|
243
|
+
if (!element.text || element.text !== query.text) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Text contains (case-insensitive)
|
|
248
|
+
if (query.text_contains !== undefined) {
|
|
249
|
+
if (!element.text) {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
if (!element.text.toLowerCase().includes(query.text_contains.toLowerCase())) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Text prefix match
|
|
257
|
+
if (query.text_prefix !== undefined) {
|
|
258
|
+
if (!element.text) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
if (!element.text.toLowerCase().startsWith(query.text_prefix.toLowerCase())) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Text suffix match
|
|
266
|
+
if (query.text_suffix !== undefined) {
|
|
267
|
+
if (!element.text) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
if (!element.text.toLowerCase().endsWith(query.text_suffix.toLowerCase())) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Name matching (best-effort; fallback to text for backward compatibility)
|
|
275
|
+
const nameVal = element.name ?? element.text ?? '';
|
|
276
|
+
if (query.name !== undefined) {
|
|
277
|
+
if (!nameVal || nameVal !== query.name) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (query.name_contains !== undefined) {
|
|
282
|
+
if (!nameVal || !nameVal.toLowerCase().includes(query.name_contains.toLowerCase())) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (query.name_prefix !== undefined) {
|
|
287
|
+
if (!nameVal || !nameVal.toLowerCase().startsWith(query.name_prefix.toLowerCase())) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (query.name_suffix !== undefined) {
|
|
292
|
+
if (!nameVal || !nameVal.toLowerCase().endsWith(query.name_suffix.toLowerCase())) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Value matching (inputs/textarea/select)
|
|
297
|
+
const valueVal = element.value ?? null;
|
|
298
|
+
if (query.value !== undefined) {
|
|
299
|
+
if (valueVal === null || valueVal !== query.value) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (query.value_contains !== undefined) {
|
|
304
|
+
if (valueVal === null || !valueVal.toLowerCase().includes(query.value_contains.toLowerCase())) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (query.value_prefix !== undefined) {
|
|
309
|
+
if (valueVal === null || !valueVal.toLowerCase().startsWith(query.value_prefix.toLowerCase())) {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (query.value_suffix !== undefined) {
|
|
314
|
+
if (valueVal === null || !valueVal.toLowerCase().endsWith(query.value_suffix.toLowerCase())) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// State matching (best-effort)
|
|
319
|
+
if (query.checked !== undefined) {
|
|
320
|
+
if ((element.checked === true) !== query.checked) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (query.disabled !== undefined) {
|
|
325
|
+
if ((element.disabled === true) !== query.disabled) {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if (query.expanded !== undefined) {
|
|
330
|
+
if ((element.expanded === true) !== query.expanded) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Importance filtering
|
|
335
|
+
if (query.importance !== undefined) {
|
|
336
|
+
if (element.importance !== query.importance) {
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (query.importance_min !== undefined) {
|
|
341
|
+
if (element.importance < query.importance_min) {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (query.importance_max !== undefined) {
|
|
346
|
+
if (element.importance > query.importance_max) {
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// BBox filtering (spatial)
|
|
351
|
+
if (query['bbox.x_min'] !== undefined) {
|
|
352
|
+
if (element.bbox.x < query['bbox.x_min']) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (query['bbox.x_max'] !== undefined) {
|
|
357
|
+
if (element.bbox.x > query['bbox.x_max']) {
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (query['bbox.y_min'] !== undefined) {
|
|
362
|
+
if (element.bbox.y < query['bbox.y_min']) {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
if (query['bbox.y_max'] !== undefined) {
|
|
367
|
+
if (element.bbox.y > query['bbox.y_max']) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (query['bbox.width_min'] !== undefined) {
|
|
372
|
+
if (element.bbox.width < query['bbox.width_min']) {
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (query['bbox.width_max'] !== undefined) {
|
|
377
|
+
if (element.bbox.width > query['bbox.width_max']) {
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (query['bbox.height_min'] !== undefined) {
|
|
382
|
+
if (element.bbox.height < query['bbox.height_min']) {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
if (query['bbox.height_max'] !== undefined) {
|
|
387
|
+
if (element.bbox.height > query['bbox.height_max']) {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
// Z-index filtering
|
|
392
|
+
if (query.z_index_min !== undefined) {
|
|
393
|
+
if (element.z_index < query.z_index_min) {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (query.z_index_max !== undefined) {
|
|
398
|
+
if (element.z_index > query.z_index_max) {
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
// In viewport filtering
|
|
403
|
+
if (query.in_viewport !== undefined) {
|
|
404
|
+
if (element.in_viewport !== query.in_viewport) {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// Occlusion filtering
|
|
409
|
+
if (query.is_occluded !== undefined) {
|
|
410
|
+
if (element.is_occluded !== query.is_occluded) {
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// Attribute filtering (dot notation: attr.id="submit-btn")
|
|
415
|
+
if (query.attr !== undefined) {
|
|
416
|
+
// This requires DOM access, which is not available in the Element model
|
|
417
|
+
// This is a placeholder for future implementation when we add DOM access
|
|
418
|
+
}
|
|
419
|
+
// CSS property filtering (dot notation: css.color="red")
|
|
420
|
+
if (query.css !== undefined) {
|
|
421
|
+
// This requires DOM access, which is not available in the Element model
|
|
422
|
+
// This is a placeholder for future implementation when we add DOM access
|
|
423
|
+
}
|
|
424
|
+
return true;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Query elements from a snapshot using a selector
|
|
428
|
+
*
|
|
429
|
+
* @param snapshot - Snapshot containing elements to query
|
|
430
|
+
* @param selector - Query selector (string DSL or object)
|
|
431
|
+
* @returns Array of matching elements, sorted by importance (descending)
|
|
432
|
+
*
|
|
433
|
+
* @example
|
|
434
|
+
* ```typescript
|
|
435
|
+
* const snap = await snapshot(browser);
|
|
436
|
+
*
|
|
437
|
+
* // String selector
|
|
438
|
+
* const buttons = query(snap, 'role=button');
|
|
439
|
+
* const clickable = query(snap, 'clickable=true');
|
|
440
|
+
*
|
|
441
|
+
* // Object selector
|
|
442
|
+
* const results = query(snap, {
|
|
443
|
+
* role: 'button',
|
|
444
|
+
* importance_min: 0.5
|
|
445
|
+
* });
|
|
446
|
+
* ```
|
|
447
|
+
*/
|
|
448
|
+
function query(snapshot, selector) {
|
|
449
|
+
// Parse selector if string
|
|
450
|
+
const queryObj = typeof selector === 'string' ? parseSelector(selector) : selector;
|
|
451
|
+
// Filter elements
|
|
452
|
+
const matches = snapshot.elements.filter(el => matchElement(el, queryObj));
|
|
453
|
+
// Sort by importance (descending)
|
|
454
|
+
matches.sort((a, b) => b.importance - a.importance);
|
|
455
|
+
return matches;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Find the first element matching a selector
|
|
459
|
+
*
|
|
460
|
+
* @param snapshot - Snapshot containing elements to search
|
|
461
|
+
* @param selector - Query selector (string DSL or object)
|
|
462
|
+
* @returns First matching element, or null if none found
|
|
463
|
+
*
|
|
464
|
+
* @example
|
|
465
|
+
* ```typescript
|
|
466
|
+
* const snap = await snapshot(browser);
|
|
467
|
+
*
|
|
468
|
+
* // Find first button
|
|
469
|
+
* const button = find(snap, 'role=button');
|
|
470
|
+
* if (button) {
|
|
471
|
+
* await click(browser, button.id);
|
|
472
|
+
* }
|
|
473
|
+
*
|
|
474
|
+
* // Find element by text
|
|
475
|
+
* const searchBox = find(snap, 'text~search');
|
|
476
|
+
* ```
|
|
477
|
+
*/
|
|
478
|
+
function find(snapshot, selector) {
|
|
479
|
+
const results = query(snapshot, selector);
|
|
480
|
+
return results[0] || null;
|
|
481
|
+
}
|
|
482
|
+
//# 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,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read page content - supports raw HTML, text, and markdown formats
|
|
3
|
+
*/
|
|
4
|
+
import { ZodTypeAny } from 'zod';
|
|
5
|
+
import { SentienceBrowser } from './browser';
|
|
6
|
+
import { LLMProvider } from './llm-provider';
|
|
7
|
+
import type { ExtractResult } from './types';
|
|
8
|
+
export interface ReadOptions {
|
|
9
|
+
format?: 'raw' | 'text' | 'markdown';
|
|
10
|
+
enhanceMarkdown?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ReadResult {
|
|
13
|
+
status: 'success' | 'error';
|
|
14
|
+
url: string;
|
|
15
|
+
format: 'raw' | 'text' | 'markdown';
|
|
16
|
+
content: string;
|
|
17
|
+
length: number;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read page content as raw HTML, text, or markdown
|
|
22
|
+
*
|
|
23
|
+
* @param browser - SentienceBrowser instance
|
|
24
|
+
* @param options - Read options
|
|
25
|
+
* @returns ReadResult with page content
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* // Get raw HTML (default)
|
|
29
|
+
* const result = await read(browser);
|
|
30
|
+
* const htmlContent = result.content;
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* // Get high-quality markdown (uses Turndown internally)
|
|
34
|
+
* const result = await read(browser, { format: 'markdown' });
|
|
35
|
+
* const markdown = result.content;
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* // Get plain text
|
|
39
|
+
* const result = await read(browser, { format: 'text' });
|
|
40
|
+
* const text = result.content;
|
|
41
|
+
*/
|
|
42
|
+
export declare function read(browser: SentienceBrowser, options?: ReadOptions): Promise<ReadResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Extract structured data from the current page using read() markdown + LLM.
|
|
45
|
+
*/
|
|
46
|
+
export declare function extract(browser: SentienceBrowser, llm: LLMProvider, query: string, schema?: ZodTypeAny, maxChars?: number): Promise<ExtractResult>;
|
|
47
|
+
//# 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,UAAU,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,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;AAcD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAoErB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,UAAU,EACnB,QAAQ,GAAE,MAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CA2BxB"}
|
package/dist/read.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
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
|
+
exports.extract = extract;
|
|
11
|
+
const turndown_1 = __importDefault(require("turndown"));
|
|
12
|
+
const browser_evaluator_1 = require("./utils/browser-evaluator");
|
|
13
|
+
const zod_1 = require("./utils/zod");
|
|
14
|
+
function extractJsonPayload(text) {
|
|
15
|
+
const fenced = text.match(/```json\s*(\{[\s\S]*?\})\s*```/i);
|
|
16
|
+
if (fenced && fenced[1]) {
|
|
17
|
+
return JSON.parse(fenced[1]);
|
|
18
|
+
}
|
|
19
|
+
const inline = text.match(/(\{[\s\S]*\})/);
|
|
20
|
+
if (inline && inline[1]) {
|
|
21
|
+
return JSON.parse(inline[1]);
|
|
22
|
+
}
|
|
23
|
+
return JSON.parse(text);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Read page content as raw HTML, text, or markdown
|
|
27
|
+
*
|
|
28
|
+
* @param browser - SentienceBrowser instance
|
|
29
|
+
* @param options - Read options
|
|
30
|
+
* @returns ReadResult with page content
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* // Get raw HTML (default)
|
|
34
|
+
* const result = await read(browser);
|
|
35
|
+
* const htmlContent = result.content;
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* // Get high-quality markdown (uses Turndown internally)
|
|
39
|
+
* const result = await read(browser, { format: 'markdown' });
|
|
40
|
+
* const markdown = result.content;
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* // Get plain text
|
|
44
|
+
* const result = await read(browser, { format: 'text' });
|
|
45
|
+
* const text = result.content;
|
|
46
|
+
*/
|
|
47
|
+
async function read(browser, options = {}) {
|
|
48
|
+
const page = browser.getPage();
|
|
49
|
+
if (!page) {
|
|
50
|
+
throw new Error('Browser not started. Call start() first.');
|
|
51
|
+
}
|
|
52
|
+
const format = options.format || 'raw'; // Default to 'raw' for Turndown compatibility
|
|
53
|
+
const enhanceMarkdown = options.enhanceMarkdown !== false; // Default to true
|
|
54
|
+
if (format === 'markdown' && enhanceMarkdown) {
|
|
55
|
+
// Get raw HTML from the extension first
|
|
56
|
+
const rawHtmlResult = (await browser_evaluator_1.BrowserEvaluator.evaluate(page, opts => window.sentience.read(opts), { format: 'raw' }));
|
|
57
|
+
if (rawHtmlResult.status === 'success') {
|
|
58
|
+
const htmlContent = rawHtmlResult.content;
|
|
59
|
+
try {
|
|
60
|
+
const turndownService = new turndown_1.default({
|
|
61
|
+
headingStyle: 'atx',
|
|
62
|
+
hr: '---',
|
|
63
|
+
bulletListMarker: '-',
|
|
64
|
+
codeBlockStyle: 'fenced',
|
|
65
|
+
emDelimiter: '*',
|
|
66
|
+
});
|
|
67
|
+
// Add custom rules for better markdown
|
|
68
|
+
turndownService.addRule('strikethrough', {
|
|
69
|
+
filter: node => ['s', 'del', 'strike'].includes(node.nodeName.toLowerCase()),
|
|
70
|
+
replacement: function (content) {
|
|
71
|
+
return '~~' + content + '~~';
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
// Optionally strip certain tags entirely
|
|
75
|
+
turndownService.remove(['script', 'style', 'noscript', 'iframe']);
|
|
76
|
+
const markdownContent = turndownService.turndown(htmlContent);
|
|
77
|
+
return {
|
|
78
|
+
status: 'success',
|
|
79
|
+
url: rawHtmlResult.url,
|
|
80
|
+
format: 'markdown',
|
|
81
|
+
content: markdownContent,
|
|
82
|
+
length: markdownContent.length,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
console.warn(`Turndown conversion failed: ${e.message}, falling back to extension's markdown.`);
|
|
87
|
+
// Fallback to extension's markdown if Turndown fails
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.warn(`Failed to get raw HTML from extension: ${rawHtmlResult.error}, falling back to extension's markdown.`);
|
|
92
|
+
// Fallback to extension's markdown if getting raw HTML fails
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// If not enhanced markdown, or fallback, call extension with requested format
|
|
96
|
+
const result = (await browser_evaluator_1.BrowserEvaluator.evaluate(page, opts => window.sentience.read(opts), { format }));
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Extract structured data from the current page using read() markdown + LLM.
|
|
101
|
+
*/
|
|
102
|
+
async function extract(browser, llm, query, schema, maxChars = 12000) {
|
|
103
|
+
const result = await read(browser, { format: 'markdown', enhanceMarkdown: true });
|
|
104
|
+
if (result.status !== 'success') {
|
|
105
|
+
return { ok: false, error: result.error ?? 'read failed' };
|
|
106
|
+
}
|
|
107
|
+
const content = result.content.slice(0, maxChars);
|
|
108
|
+
const schemaDesc = schema ? JSON.stringify((0, zod_1.zodToJsonSchema)(schema)) : '';
|
|
109
|
+
const system = 'You extract structured data from markdown content. Return only JSON. No prose.';
|
|
110
|
+
const user = `QUERY:\n${query}\n\nSCHEMA:\n${schemaDesc}\n\nCONTENT:\n${content}`;
|
|
111
|
+
const response = await llm.generate(system, user);
|
|
112
|
+
const raw = response.content.trim();
|
|
113
|
+
if (!schema) {
|
|
114
|
+
return { ok: true, data: { text: raw }, raw };
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const payload = extractJsonPayload(raw);
|
|
118
|
+
const parsed = schema.safeParse(payload);
|
|
119
|
+
if (!parsed.success) {
|
|
120
|
+
return { ok: false, error: parsed.error.message, raw };
|
|
121
|
+
}
|
|
122
|
+
return { ok: true, data: parsed.data, raw };
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
return { ok: false, error: String(err?.message ?? err), raw };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=read.js.map
|