sentienceapi 0.90.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE.md +43 -0
  2. package/README.md +946 -0
  3. package/dist/actions.d.ts +54 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +349 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/agent.d.ts +157 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +437 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/browser.d.ts +46 -0
  12. package/dist/browser.d.ts.map +1 -0
  13. package/dist/browser.js +622 -0
  14. package/dist/browser.js.map +1 -0
  15. package/dist/cli.d.ts +5 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +174 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/conversational-agent.d.ts +123 -0
  20. package/dist/conversational-agent.d.ts.map +1 -0
  21. package/dist/conversational-agent.js +327 -0
  22. package/dist/conversational-agent.js.map +1 -0
  23. package/dist/expect.d.ts +16 -0
  24. package/dist/expect.d.ts.map +1 -0
  25. package/dist/expect.js +66 -0
  26. package/dist/expect.js.map +1 -0
  27. package/dist/generator.d.ts +16 -0
  28. package/dist/generator.d.ts.map +1 -0
  29. package/dist/generator.js +205 -0
  30. package/dist/generator.js.map +1 -0
  31. package/dist/index.d.ts +21 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +70 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/inspector.d.ts +13 -0
  36. package/dist/inspector.d.ts.map +1 -0
  37. package/dist/inspector.js +147 -0
  38. package/dist/inspector.js.map +1 -0
  39. package/dist/llm-provider.d.ts +60 -0
  40. package/dist/llm-provider.d.ts.map +1 -0
  41. package/dist/llm-provider.js +106 -0
  42. package/dist/llm-provider.js.map +1 -0
  43. package/dist/query.d.ts +8 -0
  44. package/dist/query.d.ts.map +1 -0
  45. package/dist/query.js +337 -0
  46. package/dist/query.js.map +1 -0
  47. package/dist/read.d.ts +40 -0
  48. package/dist/read.d.ts.map +1 -0
  49. package/dist/read.js +86 -0
  50. package/dist/read.js.map +1 -0
  51. package/dist/recorder.d.ts +44 -0
  52. package/dist/recorder.d.ts.map +1 -0
  53. package/dist/recorder.js +256 -0
  54. package/dist/recorder.js.map +1 -0
  55. package/dist/screenshot.d.ts +17 -0
  56. package/dist/screenshot.d.ts.map +1 -0
  57. package/dist/screenshot.js +37 -0
  58. package/dist/screenshot.js.map +1 -0
  59. package/dist/snapshot.d.ts +23 -0
  60. package/dist/snapshot.d.ts.map +1 -0
  61. package/dist/snapshot.js +187 -0
  62. package/dist/snapshot.js.map +1 -0
  63. package/dist/tracing/cloud-sink.d.ts +74 -0
  64. package/dist/tracing/cloud-sink.d.ts.map +1 -0
  65. package/dist/tracing/cloud-sink.js +262 -0
  66. package/dist/tracing/cloud-sink.js.map +1 -0
  67. package/dist/tracing/index.d.ts +12 -0
  68. package/dist/tracing/index.d.ts.map +1 -0
  69. package/dist/tracing/index.js +28 -0
  70. package/dist/tracing/index.js.map +1 -0
  71. package/dist/tracing/jsonl-sink.d.ts +41 -0
  72. package/dist/tracing/jsonl-sink.d.ts.map +1 -0
  73. package/dist/tracing/jsonl-sink.js +168 -0
  74. package/dist/tracing/jsonl-sink.js.map +1 -0
  75. package/dist/tracing/sink.d.ts +24 -0
  76. package/dist/tracing/sink.d.ts.map +1 -0
  77. package/dist/tracing/sink.js +15 -0
  78. package/dist/tracing/sink.js.map +1 -0
  79. package/dist/tracing/tracer-factory.d.ts +57 -0
  80. package/dist/tracing/tracer-factory.d.ts.map +1 -0
  81. package/dist/tracing/tracer-factory.js +274 -0
  82. package/dist/tracing/tracer-factory.js.map +1 -0
  83. package/dist/tracing/tracer.d.ts +74 -0
  84. package/dist/tracing/tracer.d.ts.map +1 -0
  85. package/dist/tracing/tracer.js +131 -0
  86. package/dist/tracing/tracer.js.map +1 -0
  87. package/dist/tracing/types.d.ts +63 -0
  88. package/dist/tracing/types.d.ts.map +1 -0
  89. package/dist/tracing/types.js +8 -0
  90. package/dist/tracing/types.js.map +1 -0
  91. package/dist/types.d.ts +110 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +6 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/utils.d.ts +29 -0
  96. package/dist/utils.d.ts.map +1 -0
  97. package/dist/utils.js +74 -0
  98. package/dist/utils.js.map +1 -0
  99. package/dist/wait.d.ts +20 -0
  100. package/dist/wait.d.ts.map +1 -0
  101. package/dist/wait.js +63 -0
  102. package/dist/wait.js.map +1 -0
  103. package/package.json +72 -0
  104. package/spec/README.md +72 -0
  105. package/spec/SNAPSHOT_V1.md +208 -0
  106. package/spec/sdk-types.md +259 -0
  107. package/spec/snapshot.schema.json +148 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * LLM Provider Abstraction - BYOB (Bring Your Own Brain)
3
+ * Enables pluggable LLM support for SentienceAgent
4
+ */
5
+ /**
6
+ * Response from LLM provider
7
+ */
8
+ export interface LLMResponse {
9
+ content: string;
10
+ promptTokens?: number;
11
+ completionTokens?: number;
12
+ totalTokens?: number;
13
+ modelName?: string;
14
+ }
15
+ /**
16
+ * Abstract base class for LLM providers
17
+ * Implement this to integrate any LLM (OpenAI, Anthropic, Local, etc.)
18
+ */
19
+ export declare abstract class LLMProvider {
20
+ /**
21
+ * Generate LLM response from prompts
22
+ * @param systemPrompt - System/instruction prompt
23
+ * @param userPrompt - User query prompt
24
+ * @param options - Additional provider-specific options
25
+ */
26
+ abstract generate(systemPrompt: string, userPrompt: string, options?: Record<string, any>): Promise<LLMResponse>;
27
+ /**
28
+ * Whether this provider supports JSON mode (structured output)
29
+ */
30
+ abstract supportsJsonMode(): boolean;
31
+ /**
32
+ * Get the model name/identifier
33
+ */
34
+ abstract get modelName(): string;
35
+ }
36
+ /**
37
+ * OpenAI Provider (GPT-4, GPT-4o, etc.)
38
+ * Requires: npm install openai
39
+ */
40
+ export declare class OpenAIProvider extends LLMProvider {
41
+ private client;
42
+ private _modelName;
43
+ constructor(apiKey: string, model?: string);
44
+ generate(systemPrompt: string, userPrompt: string, options?: Record<string, any>): Promise<LLMResponse>;
45
+ supportsJsonMode(): boolean;
46
+ get modelName(): string;
47
+ }
48
+ /**
49
+ * Anthropic Provider (Claude 3.5 Sonnet, etc.)
50
+ * Requires: npm install @anthropic-ai/sdk
51
+ */
52
+ export declare class AnthropicProvider extends LLMProvider {
53
+ private client;
54
+ private _modelName;
55
+ constructor(apiKey: string, model?: string);
56
+ generate(systemPrompt: string, userPrompt: string, options?: Record<string, any>): Promise<LLMResponse>;
57
+ supportsJsonMode(): boolean;
58
+ get modelName(): string;
59
+ }
60
+ //# sourceMappingURL=llm-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-provider.d.ts","sourceRoot":"","sources":["../src/llm-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,8BAAsB,WAAW;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,OAAO,CAAC,WAAW,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,gBAAgB,IAAI,OAAO;IAEpC;;OAEG;IACH,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC;CAClC;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAiB;IAiB9C,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAChC,OAAO,CAAC,WAAW,CAAC;IAqBvB,gBAAgB,IAAI,OAAO;IAI3B,IAAI,SAAS,IAAI,MAAM,CAEtB;CACF;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAqC;IAgBlE,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAChC,OAAO,CAAC,WAAW,CAAC;IAsBvB,gBAAgB,IAAI,OAAO;IAK3B,IAAI,SAAS,IAAI,MAAM,CAEtB;CACF"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * LLM Provider Abstraction - BYOB (Bring Your Own Brain)
4
+ * Enables pluggable LLM support for SentienceAgent
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AnthropicProvider = exports.OpenAIProvider = exports.LLMProvider = void 0;
8
+ /**
9
+ * Abstract base class for LLM providers
10
+ * Implement this to integrate any LLM (OpenAI, Anthropic, Local, etc.)
11
+ */
12
+ class LLMProvider {
13
+ }
14
+ exports.LLMProvider = LLMProvider;
15
+ /**
16
+ * OpenAI Provider (GPT-4, GPT-4o, etc.)
17
+ * Requires: npm install openai
18
+ */
19
+ class OpenAIProvider extends LLMProvider {
20
+ constructor(apiKey, model = 'gpt-4o') {
21
+ super();
22
+ // Lazy import to avoid requiring openai package if not used
23
+ try {
24
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
25
+ const { OpenAI } = require('openai');
26
+ this.client = new OpenAI({ apiKey });
27
+ }
28
+ catch (error) {
29
+ throw new Error('OpenAI package not installed. Run: npm install openai');
30
+ }
31
+ this._modelName = model;
32
+ }
33
+ async generate(systemPrompt, userPrompt, options = {}) {
34
+ const response = await this.client.chat.completions.create({
35
+ model: this._modelName,
36
+ messages: [
37
+ { role: 'system', content: systemPrompt },
38
+ { role: 'user', content: userPrompt }
39
+ ],
40
+ temperature: options.temperature ?? 0.0,
41
+ ...options
42
+ });
43
+ const choice = response.choices[0];
44
+ return {
45
+ content: choice.message.content || '',
46
+ promptTokens: response.usage?.prompt_tokens,
47
+ completionTokens: response.usage?.completion_tokens,
48
+ totalTokens: response.usage?.total_tokens,
49
+ modelName: this._modelName
50
+ };
51
+ }
52
+ supportsJsonMode() {
53
+ return true;
54
+ }
55
+ get modelName() {
56
+ return this._modelName;
57
+ }
58
+ }
59
+ exports.OpenAIProvider = OpenAIProvider;
60
+ /**
61
+ * Anthropic Provider (Claude 3.5 Sonnet, etc.)
62
+ * Requires: npm install @anthropic-ai/sdk
63
+ */
64
+ class AnthropicProvider extends LLMProvider {
65
+ constructor(apiKey, model = 'claude-3-5-sonnet-20241022') {
66
+ super();
67
+ try {
68
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
69
+ const { Anthropic } = require('@anthropic-ai/sdk');
70
+ this.client = new Anthropic({ apiKey });
71
+ }
72
+ catch (error) {
73
+ throw new Error('Anthropic SDK not installed. Run: npm install @anthropic-ai/sdk');
74
+ }
75
+ this._modelName = model;
76
+ }
77
+ async generate(systemPrompt, userPrompt, options = {}) {
78
+ const response = await this.client.messages.create({
79
+ model: this._modelName,
80
+ max_tokens: options.max_tokens ?? 1024,
81
+ system: systemPrompt,
82
+ messages: [
83
+ { role: 'user', content: userPrompt }
84
+ ],
85
+ temperature: options.temperature ?? 0.0,
86
+ ...options
87
+ });
88
+ const content = response.content[0].text;
89
+ return {
90
+ content,
91
+ promptTokens: response.usage?.input_tokens,
92
+ completionTokens: response.usage?.output_tokens,
93
+ totalTokens: (response.usage?.input_tokens || 0) + (response.usage?.output_tokens || 0),
94
+ modelName: this._modelName
95
+ };
96
+ }
97
+ supportsJsonMode() {
98
+ // Claude supports structured output but not via "json_mode" flag
99
+ return false;
100
+ }
101
+ get modelName() {
102
+ return this._modelName;
103
+ }
104
+ }
105
+ exports.AnthropicProvider = AnthropicProvider;
106
+ //# sourceMappingURL=llm-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-provider.js","sourceRoot":"","sources":["../src/llm-provider.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