sentienceapi 0.90.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +43 -0
- package/README.md +946 -0
- package/dist/actions.d.ts +54 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +349 -0
- package/dist/actions.js.map +1 -0
- package/dist/agent.d.ts +157 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +437 -0
- package/dist/agent.js.map +1 -0
- package/dist/browser.d.ts +46 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +622 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +174 -0
- package/dist/cli.js.map +1 -0
- package/dist/conversational-agent.d.ts +123 -0
- package/dist/conversational-agent.d.ts.map +1 -0
- package/dist/conversational-agent.js +327 -0
- package/dist/conversational-agent.js.map +1 -0
- package/dist/expect.d.ts +16 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +66 -0
- package/dist/expect.js.map +1 -0
- package/dist/generator.d.ts +16 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +205 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector.d.ts +13 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +147 -0
- package/dist/inspector.js.map +1 -0
- package/dist/llm-provider.d.ts +60 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +106 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/query.d.ts +8 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +337 -0
- package/dist/query.js.map +1 -0
- package/dist/read.d.ts +40 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +86 -0
- package/dist/read.js.map +1 -0
- package/dist/recorder.d.ts +44 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +256 -0
- package/dist/recorder.js.map +1 -0
- package/dist/screenshot.d.ts +17 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +37 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/snapshot.d.ts +23 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +187 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/tracing/cloud-sink.d.ts +74 -0
- package/dist/tracing/cloud-sink.d.ts.map +1 -0
- package/dist/tracing/cloud-sink.js +262 -0
- package/dist/tracing/cloud-sink.js.map +1 -0
- package/dist/tracing/index.d.ts +12 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +28 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/jsonl-sink.d.ts +41 -0
- package/dist/tracing/jsonl-sink.d.ts.map +1 -0
- package/dist/tracing/jsonl-sink.js +168 -0
- package/dist/tracing/jsonl-sink.js.map +1 -0
- package/dist/tracing/sink.d.ts +24 -0
- package/dist/tracing/sink.d.ts.map +1 -0
- package/dist/tracing/sink.js +15 -0
- package/dist/tracing/sink.js.map +1 -0
- package/dist/tracing/tracer-factory.d.ts +57 -0
- package/dist/tracing/tracer-factory.d.ts.map +1 -0
- package/dist/tracing/tracer-factory.js +274 -0
- package/dist/tracing/tracer-factory.js.map +1 -0
- package/dist/tracing/tracer.d.ts +74 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +131 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/tracing/types.d.ts +63 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +8 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +29 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +74 -0
- package/dist/utils.js.map +1 -0
- package/dist/wait.d.ts +20 -0
- package/dist/wait.d.ts.map +1 -0
- package/dist/wait.js +63 -0
- package/dist/wait.js.map +1 -0
- package/package.json +72 -0
- package/spec/README.md +72 -0
- package/spec/SNAPSHOT_V1.md +208 -0
- package/spec/sdk-types.md +259 -0
- package/spec/snapshot.schema.json +148 -0
|
@@ -0,0 +1,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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"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query engine v1 - semantic selector matching
|
|
3
|
+
*/
|
|
4
|
+
import { Snapshot, Element, QuerySelector, QuerySelectorObject } from './types';
|
|
5
|
+
export declare function parseSelector(selector: string): QuerySelectorObject;
|
|
6
|
+
export declare function query(snapshot: Snapshot, selector: QuerySelector): Element[];
|
|
7
|
+
export declare function find(snapshot: Snapshot, selector: QuerySelector): Element | null;
|
|
8
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEhF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAsJnE;AAiMD,wBAAgB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,EAAE,CAW5E;AAED,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,IAAI,CAGhF"}
|
package/dist/query.js
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Query engine v1 - semantic selector matching
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseSelector = parseSelector;
|
|
7
|
+
exports.query = query;
|
|
8
|
+
exports.find = find;
|
|
9
|
+
function parseSelector(selector) {
|
|
10
|
+
const query = {};
|
|
11
|
+
// Match patterns like: key=value, key~'value', key!="value", key>123, key^='prefix', key$='suffix'
|
|
12
|
+
// Updated regex to support: =, !=, ~, ^=, $=, >, >=, <, <=
|
|
13
|
+
// Supports dot notation: attr.id, css.color
|
|
14
|
+
// Note: Handle ^= and $= first (before single char operators) to avoid regex conflicts
|
|
15
|
+
const pattern = /([\w.]+)(\^=|\$=|>=|<=|!=|[=~<>])((?:'[^']+'|"[^"]+"|[^\s]+))/g;
|
|
16
|
+
let match;
|
|
17
|
+
while ((match = pattern.exec(selector)) !== null) {
|
|
18
|
+
const key = match[1];
|
|
19
|
+
const op = match[2];
|
|
20
|
+
let value = match[3];
|
|
21
|
+
// Remove quotes from value
|
|
22
|
+
value = value.replace(/^["']|["']$/g, '');
|
|
23
|
+
// Handle numeric comparisons
|
|
24
|
+
let isNumeric = false;
|
|
25
|
+
let numericValue = 0;
|
|
26
|
+
const parsedNum = parseFloat(value);
|
|
27
|
+
if (!isNaN(parsedNum) && isFinite(parsedNum)) {
|
|
28
|
+
isNumeric = true;
|
|
29
|
+
numericValue = parsedNum;
|
|
30
|
+
}
|
|
31
|
+
if (op === '!=') {
|
|
32
|
+
if (key === 'role') {
|
|
33
|
+
query.role_exclude = value;
|
|
34
|
+
}
|
|
35
|
+
else if (key === 'clickable') {
|
|
36
|
+
query.clickable = false;
|
|
37
|
+
}
|
|
38
|
+
else if (key === 'visible') {
|
|
39
|
+
query.visible = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (op === '~') {
|
|
43
|
+
// Substring match (case-insensitive)
|
|
44
|
+
if (key === 'text' || key === 'name') {
|
|
45
|
+
query.text_contains = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (op === '^=') {
|
|
49
|
+
// Prefix match
|
|
50
|
+
if (key === 'text' || key === 'name') {
|
|
51
|
+
query.text_prefix = value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (op === '$=') {
|
|
55
|
+
// Suffix match
|
|
56
|
+
if (key === 'text' || key === 'name') {
|
|
57
|
+
query.text_suffix = value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (op === '>') {
|
|
61
|
+
// Greater than
|
|
62
|
+
if (isNumeric) {
|
|
63
|
+
if (key === 'importance') {
|
|
64
|
+
query.importance_min = numericValue + 0.0001; // Exclusive
|
|
65
|
+
}
|
|
66
|
+
else if (key.startsWith('bbox.')) {
|
|
67
|
+
query[`${key}_min`] = numericValue + 0.0001;
|
|
68
|
+
}
|
|
69
|
+
else if (key === 'z_index') {
|
|
70
|
+
query.z_index_min = numericValue + 0.0001;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
74
|
+
query[`${key}_gt`] = value;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (op === '>=') {
|
|
78
|
+
// Greater than or equal
|
|
79
|
+
if (isNumeric) {
|
|
80
|
+
if (key === 'importance') {
|
|
81
|
+
query.importance_min = numericValue;
|
|
82
|
+
}
|
|
83
|
+
else if (key.startsWith('bbox.')) {
|
|
84
|
+
query[`${key}_min`] = numericValue;
|
|
85
|
+
}
|
|
86
|
+
else if (key === 'z_index') {
|
|
87
|
+
query.z_index_min = numericValue;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
91
|
+
query[`${key}_gte`] = value;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (op === '<') {
|
|
95
|
+
// Less than
|
|
96
|
+
if (isNumeric) {
|
|
97
|
+
if (key === 'importance') {
|
|
98
|
+
query.importance_max = numericValue - 0.0001; // Exclusive
|
|
99
|
+
}
|
|
100
|
+
else if (key.startsWith('bbox.')) {
|
|
101
|
+
query[`${key}_max`] = numericValue - 0.0001;
|
|
102
|
+
}
|
|
103
|
+
else if (key === 'z_index') {
|
|
104
|
+
query.z_index_max = numericValue - 0.0001;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
108
|
+
query[`${key}_lt`] = value;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (op === '<=') {
|
|
112
|
+
// Less than or equal
|
|
113
|
+
if (isNumeric) {
|
|
114
|
+
if (key === 'importance') {
|
|
115
|
+
query.importance_max = numericValue;
|
|
116
|
+
}
|
|
117
|
+
else if (key.startsWith('bbox.')) {
|
|
118
|
+
query[`${key}_max`] = numericValue;
|
|
119
|
+
}
|
|
120
|
+
else if (key === 'z_index') {
|
|
121
|
+
query.z_index_max = numericValue;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (key.startsWith('attr.') || key.startsWith('css.')) {
|
|
125
|
+
query[`${key}_lte`] = value;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else if (op === '=') {
|
|
129
|
+
// Exact match
|
|
130
|
+
if (key === 'role') {
|
|
131
|
+
query.role = value;
|
|
132
|
+
}
|
|
133
|
+
else if (key === 'clickable') {
|
|
134
|
+
query.clickable = value.toLowerCase() === 'true';
|
|
135
|
+
}
|
|
136
|
+
else if (key === 'visible') {
|
|
137
|
+
query.visible = value.toLowerCase() === 'true';
|
|
138
|
+
}
|
|
139
|
+
else if (key === 'tag') {
|
|
140
|
+
query.tag = value;
|
|
141
|
+
}
|
|
142
|
+
else if (key === 'name' || key === 'text') {
|
|
143
|
+
query.text = value;
|
|
144
|
+
}
|
|
145
|
+
else if (key === 'importance' && isNumeric) {
|
|
146
|
+
query.importance = numericValue;
|
|
147
|
+
}
|
|
148
|
+
else if (key.startsWith('attr.')) {
|
|
149
|
+
// Dot notation for attributes: attr.id="submit-btn"
|
|
150
|
+
const attrKey = key.substring(5); // Remove "attr." prefix
|
|
151
|
+
if (!query.attr) {
|
|
152
|
+
query.attr = {};
|
|
153
|
+
}
|
|
154
|
+
query.attr[attrKey] = value;
|
|
155
|
+
}
|
|
156
|
+
else if (key.startsWith('css.')) {
|
|
157
|
+
// Dot notation for CSS: css.color="red"
|
|
158
|
+
const cssKey = key.substring(4); // Remove "css." prefix
|
|
159
|
+
if (!query.css) {
|
|
160
|
+
query.css = {};
|
|
161
|
+
}
|
|
162
|
+
query.css[cssKey] = value;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return query;
|
|
167
|
+
}
|
|
168
|
+
function matchElement(element, query) {
|
|
169
|
+
// Role exact match
|
|
170
|
+
if (query.role !== undefined) {
|
|
171
|
+
if (element.role !== query.role) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Role exclusion
|
|
176
|
+
if (query.role_exclude !== undefined) {
|
|
177
|
+
if (element.role === query.role_exclude) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Clickable
|
|
182
|
+
if (query.clickable !== undefined) {
|
|
183
|
+
if (element.visual_cues.is_clickable !== query.clickable) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Visible (using in_viewport and !is_occluded)
|
|
188
|
+
if (query.visible !== undefined) {
|
|
189
|
+
const isVisible = element.in_viewport && !element.is_occluded;
|
|
190
|
+
if (isVisible !== query.visible) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Tag (not yet in Element model, but prepare for future)
|
|
195
|
+
if (query.tag !== undefined) {
|
|
196
|
+
// For now, this will always fail since tag is not in Element model
|
|
197
|
+
// This is a placeholder for future implementation
|
|
198
|
+
}
|
|
199
|
+
// Text exact match
|
|
200
|
+
if (query.text !== undefined) {
|
|
201
|
+
if (!element.text || element.text !== query.text) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Text contains (case-insensitive)
|
|
206
|
+
if (query.text_contains !== undefined) {
|
|
207
|
+
if (!element.text) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
if (!element.text.toLowerCase().includes(query.text_contains.toLowerCase())) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Text prefix match
|
|
215
|
+
if (query.text_prefix !== undefined) {
|
|
216
|
+
if (!element.text) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
if (!element.text.toLowerCase().startsWith(query.text_prefix.toLowerCase())) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Text suffix match
|
|
224
|
+
if (query.text_suffix !== undefined) {
|
|
225
|
+
if (!element.text) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
if (!element.text.toLowerCase().endsWith(query.text_suffix.toLowerCase())) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Importance filtering
|
|
233
|
+
if (query.importance !== undefined) {
|
|
234
|
+
if (element.importance !== query.importance) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (query.importance_min !== undefined) {
|
|
239
|
+
if (element.importance < query.importance_min) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (query.importance_max !== undefined) {
|
|
244
|
+
if (element.importance > query.importance_max) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// BBox filtering (spatial)
|
|
249
|
+
if (query['bbox.x_min'] !== undefined) {
|
|
250
|
+
if (element.bbox.x < query['bbox.x_min']) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (query['bbox.x_max'] !== undefined) {
|
|
255
|
+
if (element.bbox.x > query['bbox.x_max']) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (query['bbox.y_min'] !== undefined) {
|
|
260
|
+
if (element.bbox.y < query['bbox.y_min']) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (query['bbox.y_max'] !== undefined) {
|
|
265
|
+
if (element.bbox.y > query['bbox.y_max']) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (query['bbox.width_min'] !== undefined) {
|
|
270
|
+
if (element.bbox.width < query['bbox.width_min']) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (query['bbox.width_max'] !== undefined) {
|
|
275
|
+
if (element.bbox.width > query['bbox.width_max']) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (query['bbox.height_min'] !== undefined) {
|
|
280
|
+
if (element.bbox.height < query['bbox.height_min']) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (query['bbox.height_max'] !== undefined) {
|
|
285
|
+
if (element.bbox.height > query['bbox.height_max']) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Z-index filtering
|
|
290
|
+
if (query.z_index_min !== undefined) {
|
|
291
|
+
if (element.z_index < query.z_index_min) {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (query.z_index_max !== undefined) {
|
|
296
|
+
if (element.z_index > query.z_index_max) {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// In viewport filtering
|
|
301
|
+
if (query.in_viewport !== undefined) {
|
|
302
|
+
if (element.in_viewport !== query.in_viewport) {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Occlusion filtering
|
|
307
|
+
if (query.is_occluded !== undefined) {
|
|
308
|
+
if (element.is_occluded !== query.is_occluded) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Attribute filtering (dot notation: attr.id="submit-btn")
|
|
313
|
+
if (query.attr !== undefined) {
|
|
314
|
+
// This requires DOM access, which is not available in the Element model
|
|
315
|
+
// This is a placeholder for future implementation when we add DOM access
|
|
316
|
+
}
|
|
317
|
+
// CSS property filtering (dot notation: css.color="red")
|
|
318
|
+
if (query.css !== undefined) {
|
|
319
|
+
// This requires DOM access, which is not available in the Element model
|
|
320
|
+
// This is a placeholder for future implementation when we add DOM access
|
|
321
|
+
}
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
function query(snapshot, selector) {
|
|
325
|
+
// Parse selector if string
|
|
326
|
+
const queryObj = typeof selector === 'string' ? parseSelector(selector) : selector;
|
|
327
|
+
// Filter elements
|
|
328
|
+
const matches = snapshot.elements.filter((el) => matchElement(el, queryObj));
|
|
329
|
+
// Sort by importance (descending)
|
|
330
|
+
matches.sort((a, b) => b.importance - a.importance);
|
|
331
|
+
return matches;
|
|
332
|
+
}
|
|
333
|
+
function find(snapshot, selector) {
|
|
334
|
+
const results = query(snapshot, selector);
|
|
335
|
+
return results[0] || null;
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/read.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read page content - supports raw HTML, text, and markdown formats
|
|
3
|
+
*/
|
|
4
|
+
import { SentienceBrowser } from './browser';
|
|
5
|
+
export interface ReadOptions {
|
|
6
|
+
format?: 'raw' | 'text' | 'markdown';
|
|
7
|
+
enhanceMarkdown?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ReadResult {
|
|
10
|
+
status: 'success' | 'error';
|
|
11
|
+
url: string;
|
|
12
|
+
format: 'raw' | 'text' | 'markdown';
|
|
13
|
+
content: string;
|
|
14
|
+
length: number;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Read page content as raw HTML, text, or markdown
|
|
19
|
+
*
|
|
20
|
+
* @param browser - SentienceBrowser instance
|
|
21
|
+
* @param options - Read options
|
|
22
|
+
* @returns ReadResult with page content
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // Get raw HTML (default)
|
|
26
|
+
* const result = await read(browser);
|
|
27
|
+
* const htmlContent = result.content;
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Get high-quality markdown (uses Turndown internally)
|
|
31
|
+
* const result = await read(browser, { format: 'markdown' });
|
|
32
|
+
* const markdown = result.content;
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Get plain text
|
|
36
|
+
* const result = await read(browser, { format: 'text' });
|
|
37
|
+
* const text = result.content;
|
|
38
|
+
*/
|
|
39
|
+
export declare function read(browser: SentienceBrowser, options?: ReadOptions): Promise<ReadResult>;
|
|
40
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CA+DrB"}
|
package/dist/read.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Read page content - supports raw HTML, text, and markdown formats
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.read = read;
|
|
10
|
+
const turndown_1 = __importDefault(require("turndown"));
|
|
11
|
+
/**
|
|
12
|
+
* Read page content as raw HTML, text, or markdown
|
|
13
|
+
*
|
|
14
|
+
* @param browser - SentienceBrowser instance
|
|
15
|
+
* @param options - Read options
|
|
16
|
+
* @returns ReadResult with page content
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // Get raw HTML (default)
|
|
20
|
+
* const result = await read(browser);
|
|
21
|
+
* const htmlContent = result.content;
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* // Get high-quality markdown (uses Turndown internally)
|
|
25
|
+
* const result = await read(browser, { format: 'markdown' });
|
|
26
|
+
* const markdown = result.content;
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // Get plain text
|
|
30
|
+
* const result = await read(browser, { format: 'text' });
|
|
31
|
+
* const text = result.content;
|
|
32
|
+
*/
|
|
33
|
+
async function read(browser, options = {}) {
|
|
34
|
+
const page = browser.getPage();
|
|
35
|
+
const format = options.format || 'raw'; // Default to 'raw' for Turndown compatibility
|
|
36
|
+
const enhanceMarkdown = options.enhanceMarkdown !== false; // Default to true
|
|
37
|
+
if (format === 'markdown' && enhanceMarkdown) {
|
|
38
|
+
// Get raw HTML from the extension first
|
|
39
|
+
const rawHtmlResult = (await page.evaluate((opts) => {
|
|
40
|
+
return window.sentience.read(opts);
|
|
41
|
+
}, { format: 'raw' }));
|
|
42
|
+
if (rawHtmlResult.status === 'success') {
|
|
43
|
+
const htmlContent = rawHtmlResult.content;
|
|
44
|
+
try {
|
|
45
|
+
const turndownService = new turndown_1.default({
|
|
46
|
+
headingStyle: 'atx',
|
|
47
|
+
hr: '---',
|
|
48
|
+
bulletListMarker: '-',
|
|
49
|
+
codeBlockStyle: 'fenced',
|
|
50
|
+
emDelimiter: '*',
|
|
51
|
+
});
|
|
52
|
+
// Add custom rules for better markdown
|
|
53
|
+
turndownService.addRule('strikethrough', {
|
|
54
|
+
filter: (node) => ['s', 'del', 'strike'].includes(node.nodeName.toLowerCase()),
|
|
55
|
+
replacement: function (content) {
|
|
56
|
+
return '~~' + content + '~~';
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
// Optionally strip certain tags entirely
|
|
60
|
+
turndownService.remove(['script', 'style', 'noscript', 'iframe']);
|
|
61
|
+
const markdownContent = turndownService.turndown(htmlContent);
|
|
62
|
+
return {
|
|
63
|
+
status: 'success',
|
|
64
|
+
url: rawHtmlResult.url,
|
|
65
|
+
format: 'markdown',
|
|
66
|
+
content: markdownContent,
|
|
67
|
+
length: markdownContent.length,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
console.warn(`Turndown conversion failed: ${e.message}, falling back to extension's markdown.`);
|
|
72
|
+
// Fallback to extension's markdown if Turndown fails
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.warn(`Failed to get raw HTML from extension: ${rawHtmlResult.error}, falling back to extension's markdown.`);
|
|
77
|
+
// Fallback to extension's markdown if getting raw HTML fails
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// If not enhanced markdown, or fallback, call extension with requested format
|
|
81
|
+
const result = (await page.evaluate((opts) => {
|
|
82
|
+
return window.sentience.read(opts);
|
|
83
|
+
}, { format }));
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=read.js.map
|