@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/ordinal.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase 3: Ordinal Intent Detection for Semantic Search
|
|
4
|
+
*
|
|
5
|
+
* This module provides functions to detect ordinal intent in natural language goals
|
|
6
|
+
* and select elements based on their position within groups.
|
|
7
|
+
*
|
|
8
|
+
* Ordinal operators supported:
|
|
9
|
+
* - Position-based: "first", "second", "third", "1st", "2nd", "3rd", etc.
|
|
10
|
+
* - Relative: "top", "bottom", "last", "next", "previous"
|
|
11
|
+
* - Numeric: "#1", "#2", "number 1", "item 3"
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { detectOrdinalIntent, selectByOrdinal } from 'sentience';
|
|
16
|
+
*
|
|
17
|
+
* const intent = detectOrdinalIntent("click the first search result");
|
|
18
|
+
* // { detected: true, kind: 'nth', n: 1 }
|
|
19
|
+
*
|
|
20
|
+
* const element = selectByOrdinal(elements, "x5-w2-h1", intent);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.detectOrdinalIntent = detectOrdinalIntent;
|
|
25
|
+
exports.selectByOrdinal = selectByOrdinal;
|
|
26
|
+
exports.boostOrdinalElements = boostOrdinalElements;
|
|
27
|
+
/** Ordinal word to number mapping */
|
|
28
|
+
const ORDINAL_WORDS = {
|
|
29
|
+
first: 1,
|
|
30
|
+
second: 2,
|
|
31
|
+
third: 3,
|
|
32
|
+
fourth: 4,
|
|
33
|
+
fifth: 5,
|
|
34
|
+
sixth: 6,
|
|
35
|
+
seventh: 7,
|
|
36
|
+
eighth: 8,
|
|
37
|
+
ninth: 9,
|
|
38
|
+
tenth: 10,
|
|
39
|
+
'1st': 1,
|
|
40
|
+
'2nd': 2,
|
|
41
|
+
'3rd': 3,
|
|
42
|
+
'4th': 4,
|
|
43
|
+
'5th': 5,
|
|
44
|
+
'6th': 6,
|
|
45
|
+
'7th': 7,
|
|
46
|
+
'8th': 8,
|
|
47
|
+
'9th': 9,
|
|
48
|
+
'10th': 10,
|
|
49
|
+
};
|
|
50
|
+
/** Patterns for detecting ordinal intent */
|
|
51
|
+
const ORDINAL_PATTERNS = [
|
|
52
|
+
// "first", "second", etc.
|
|
53
|
+
{
|
|
54
|
+
pattern: /\b(first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth)\b/i,
|
|
55
|
+
type: 'ordinal_word',
|
|
56
|
+
},
|
|
57
|
+
// "1st", "2nd", "3rd", etc.
|
|
58
|
+
{ pattern: /\b(\d+)(st|nd|rd|th)\b/i, type: 'ordinal_suffix' },
|
|
59
|
+
// "#1", "#2", etc.
|
|
60
|
+
{ pattern: /#(\d+)\b/, type: 'hash_number' },
|
|
61
|
+
// "number 1", "item 3", "result 5"
|
|
62
|
+
{ pattern: /\b(?:number|item|result|option|choice)\s*(\d+)\b/i, type: 'labeled_number' },
|
|
63
|
+
// "top" (implies first/best)
|
|
64
|
+
{ pattern: /\btop\b(?!\s*\d)/i, type: 'top' },
|
|
65
|
+
// "top 3", "top 5"
|
|
66
|
+
{ pattern: /\btop\s+(\d+)\b/i, type: 'top_k' },
|
|
67
|
+
// "last", "final", "bottom"
|
|
68
|
+
{ pattern: /\b(last|final|bottom)\b/i, type: 'last' },
|
|
69
|
+
// "next", "following"
|
|
70
|
+
{ pattern: /\b(next|following)\b/i, type: 'next' },
|
|
71
|
+
// "previous", "preceding", "prior"
|
|
72
|
+
{ pattern: /\b(previous|preceding|prior)\b/i, type: 'previous' },
|
|
73
|
+
];
|
|
74
|
+
/**
|
|
75
|
+
* Detect ordinal intent from a goal string.
|
|
76
|
+
*
|
|
77
|
+
* @param goal - Natural language goal (e.g., "click the first search result")
|
|
78
|
+
* @returns OrdinalIntent with detected=true if ordinal intent found
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* detectOrdinalIntent("click the first item")
|
|
83
|
+
* // { detected: true, kind: 'nth', n: 1 }
|
|
84
|
+
*
|
|
85
|
+
* detectOrdinalIntent("select the 3rd option")
|
|
86
|
+
* // { detected: true, kind: 'nth', n: 3 }
|
|
87
|
+
*
|
|
88
|
+
* detectOrdinalIntent("show top 5 results")
|
|
89
|
+
* // { detected: true, kind: 'top_k', k: 5 }
|
|
90
|
+
*
|
|
91
|
+
* detectOrdinalIntent("find the submit button")
|
|
92
|
+
* // { detected: false }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
function detectOrdinalIntent(goal) {
|
|
96
|
+
const goalLower = goal.toLowerCase();
|
|
97
|
+
for (const { pattern, type } of ORDINAL_PATTERNS) {
|
|
98
|
+
const match = goalLower.match(pattern);
|
|
99
|
+
if (match) {
|
|
100
|
+
switch (type) {
|
|
101
|
+
case 'ordinal_word': {
|
|
102
|
+
const word = match[1].toLowerCase();
|
|
103
|
+
const n = ORDINAL_WORDS[word];
|
|
104
|
+
if (n) {
|
|
105
|
+
return { detected: true, kind: 'nth', n };
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case 'ordinal_suffix': {
|
|
110
|
+
const n = parseInt(match[1], 10);
|
|
111
|
+
return { detected: true, kind: 'nth', n };
|
|
112
|
+
}
|
|
113
|
+
case 'hash_number': {
|
|
114
|
+
const n = parseInt(match[1], 10);
|
|
115
|
+
return { detected: true, kind: 'nth', n };
|
|
116
|
+
}
|
|
117
|
+
case 'labeled_number': {
|
|
118
|
+
const n = parseInt(match[1], 10);
|
|
119
|
+
return { detected: true, kind: 'nth', n };
|
|
120
|
+
}
|
|
121
|
+
case 'top':
|
|
122
|
+
// "top" without a number means "first/best"
|
|
123
|
+
return { detected: true, kind: 'first' };
|
|
124
|
+
case 'top_k': {
|
|
125
|
+
const k = parseInt(match[1], 10);
|
|
126
|
+
return { detected: true, kind: 'top_k', k };
|
|
127
|
+
}
|
|
128
|
+
case 'last':
|
|
129
|
+
return { detected: true, kind: 'last' };
|
|
130
|
+
case 'next':
|
|
131
|
+
return { detected: true, kind: 'next' };
|
|
132
|
+
case 'previous':
|
|
133
|
+
return { detected: true, kind: 'previous' };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return { detected: false };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Select element(s) from a list based on ordinal intent.
|
|
141
|
+
*
|
|
142
|
+
* Uses the dominantGroupKey to filter to the "main content" group,
|
|
143
|
+
* then selects by group_index based on the ordinal intent.
|
|
144
|
+
*
|
|
145
|
+
* @param elements - List of elements with group_key and group_index populated
|
|
146
|
+
* @param dominantGroupKey - The most common group key (main content group)
|
|
147
|
+
* @param intent - Detected ordinal intent
|
|
148
|
+
* @param currentElementId - Current element ID (for next/previous navigation)
|
|
149
|
+
* @returns Single Element for nth/first/last, array of Elements for top_k, or null
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* const intent = { detected: true, kind: 'nth', n: 1 };
|
|
154
|
+
* const element = selectByOrdinal(elements, "x5-w2-h1", intent);
|
|
155
|
+
* // Returns element with group_key="x5-w2-h1" and group_index=0
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
function selectByOrdinal(elements, dominantGroupKey, intent, currentElementId) {
|
|
159
|
+
if (!intent.detected) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
// Filter to dominant group if available
|
|
163
|
+
let groupElements;
|
|
164
|
+
if (dominantGroupKey) {
|
|
165
|
+
groupElements = elements.filter(e => e.group_key === dominantGroupKey);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Fallback: use all elements with group_index
|
|
169
|
+
groupElements = elements.filter(e => e.group_index !== undefined);
|
|
170
|
+
}
|
|
171
|
+
if (groupElements.length === 0) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
// Sort by group_index to ensure correct ordering
|
|
175
|
+
groupElements.sort((a, b) => (a.group_index ?? 0) - (b.group_index ?? 0));
|
|
176
|
+
switch (intent.kind) {
|
|
177
|
+
case 'first':
|
|
178
|
+
return groupElements[0] ?? null;
|
|
179
|
+
case 'nth':
|
|
180
|
+
if (intent.n !== undefined) {
|
|
181
|
+
// Nth element (1-indexed, so n=2 means group_index=1)
|
|
182
|
+
const targetIndex = intent.n - 1;
|
|
183
|
+
if (targetIndex >= 0 && targetIndex < groupElements.length) {
|
|
184
|
+
return groupElements[targetIndex];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
case 'last':
|
|
189
|
+
return groupElements[groupElements.length - 1] ?? null;
|
|
190
|
+
case 'top_k':
|
|
191
|
+
if (intent.k !== undefined) {
|
|
192
|
+
return groupElements.slice(0, intent.k);
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
case 'next':
|
|
196
|
+
if (currentElementId !== undefined) {
|
|
197
|
+
for (let i = 0; i < groupElements.length; i++) {
|
|
198
|
+
if (groupElements[i].id === currentElementId && i + 1 < groupElements.length) {
|
|
199
|
+
return groupElements[i + 1];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
case 'previous':
|
|
205
|
+
if (currentElementId !== undefined) {
|
|
206
|
+
for (let i = 0; i < groupElements.length; i++) {
|
|
207
|
+
if (groupElements[i].id === currentElementId && i > 0) {
|
|
208
|
+
return groupElements[i - 1];
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
default:
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Boost the importance of elements matching ordinal intent.
|
|
219
|
+
*
|
|
220
|
+
* This is useful for integrating ordinal selection with existing
|
|
221
|
+
* importance-based ranking. Elements matching the ordinal intent
|
|
222
|
+
* get a significant importance boost.
|
|
223
|
+
*
|
|
224
|
+
* @param elements - List of elements (not modified)
|
|
225
|
+
* @param dominantGroupKey - The most common group key
|
|
226
|
+
* @param intent - Detected ordinal intent
|
|
227
|
+
* @param boostFactor - Amount to add to importance (default: 10000)
|
|
228
|
+
* @returns A new array with copies of elements, with boosted importance for matches
|
|
229
|
+
*/
|
|
230
|
+
function boostOrdinalElements(elements, dominantGroupKey, intent, boostFactor = 10000) {
|
|
231
|
+
if (!intent.detected || !dominantGroupKey) {
|
|
232
|
+
return elements.map(e => ({ ...e }));
|
|
233
|
+
}
|
|
234
|
+
const target = selectByOrdinal(elements, dominantGroupKey, intent);
|
|
235
|
+
if (target === null) {
|
|
236
|
+
return elements.map(e => ({ ...e }));
|
|
237
|
+
}
|
|
238
|
+
// Handle single element or array
|
|
239
|
+
const targetIds = new Set(Array.isArray(target) ? target.map(e => e.id) : [target.id]);
|
|
240
|
+
// Create copies and boost matching elements
|
|
241
|
+
return elements.map(elem => {
|
|
242
|
+
const copy = { ...elem };
|
|
243
|
+
if (targetIds.has(copy.id)) {
|
|
244
|
+
copy.importance = (copy.importance ?? 0) + boostFactor;
|
|
245
|
+
}
|
|
246
|
+
return copy;
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=ordinal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ordinal.js","sourceRoot":"","sources":["../src/ordinal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visual overlay utilities - show/clear element highlights in browser
|
|
3
|
+
*/
|
|
4
|
+
import { SentienceBrowser } from './browser';
|
|
5
|
+
import { Element, Snapshot } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Display visual overlay highlighting elements in the browser
|
|
8
|
+
*
|
|
9
|
+
* This function shows a Shadow DOM overlay with color-coded borders around
|
|
10
|
+
* detected elements. Useful for debugging, learning, and validating element detection.
|
|
11
|
+
*
|
|
12
|
+
* @param browser - SentienceBrowser instance
|
|
13
|
+
* @param elements - Can be:
|
|
14
|
+
* - List of Element objects (from snapshot.elements)
|
|
15
|
+
* - List of raw element objects (from snapshot result or API response)
|
|
16
|
+
* - Snapshot object (will use snapshot.elements)
|
|
17
|
+
* @param targetElementId - Optional ID of element to highlight in red (default: null)
|
|
18
|
+
*
|
|
19
|
+
* Color Coding:
|
|
20
|
+
* - Red: Target element (when targetElementId is specified)
|
|
21
|
+
* - Blue: Primary elements (is_primary=true)
|
|
22
|
+
* - Green: Regular interactive elements
|
|
23
|
+
*
|
|
24
|
+
* Visual Indicators:
|
|
25
|
+
* - Border thickness and opacity scale with importance score
|
|
26
|
+
* - Semi-transparent fill for better visibility
|
|
27
|
+
* - Importance badges showing scores
|
|
28
|
+
* - Star icon for primary elements
|
|
29
|
+
* - Target emoji for the target element
|
|
30
|
+
*
|
|
31
|
+
* Auto-clear: Overlay automatically disappears after 5 seconds
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // Show overlay from snapshot
|
|
35
|
+
* const snap = await snapshot(browser);
|
|
36
|
+
* await showOverlay(browser, snap);
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* // Show overlay with custom elements
|
|
40
|
+
* const elements = [{id: 1, bbox: {x: 100, y: 100, width: 200, height: 50}, ...}];
|
|
41
|
+
* await showOverlay(browser, elements);
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* // Show overlay with target element highlighted in red
|
|
45
|
+
* await showOverlay(browser, snap, 42);
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* // Clear overlay manually before 5 seconds
|
|
49
|
+
* await clearOverlay(browser);
|
|
50
|
+
*/
|
|
51
|
+
export declare function showOverlay(browser: SentienceBrowser, elements: Element[] | any[] | Snapshot, targetElementId?: number | null): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Clear the visual overlay manually (before 5-second auto-clear)
|
|
54
|
+
*
|
|
55
|
+
* @param browser - SentienceBrowser instance
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* await showOverlay(browser, snap);
|
|
59
|
+
* // ... inspect overlay ...
|
|
60
|
+
* await clearOverlay(browser); // Remove immediately
|
|
61
|
+
*/
|
|
62
|
+
export declare function clearOverlay(browser: SentienceBrowser): Promise<void>;
|
|
63
|
+
//# sourceMappingURL=overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,QAAQ,EACtC,eAAe,GAAE,MAAM,GAAG,IAAW,GACpC,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E"}
|
package/dist/overlay.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Visual overlay utilities - show/clear element highlights in browser
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.showOverlay = showOverlay;
|
|
7
|
+
exports.clearOverlay = clearOverlay;
|
|
8
|
+
/**
|
|
9
|
+
* Display visual overlay highlighting elements in the browser
|
|
10
|
+
*
|
|
11
|
+
* This function shows a Shadow DOM overlay with color-coded borders around
|
|
12
|
+
* detected elements. Useful for debugging, learning, and validating element detection.
|
|
13
|
+
*
|
|
14
|
+
* @param browser - SentienceBrowser instance
|
|
15
|
+
* @param elements - Can be:
|
|
16
|
+
* - List of Element objects (from snapshot.elements)
|
|
17
|
+
* - List of raw element objects (from snapshot result or API response)
|
|
18
|
+
* - Snapshot object (will use snapshot.elements)
|
|
19
|
+
* @param targetElementId - Optional ID of element to highlight in red (default: null)
|
|
20
|
+
*
|
|
21
|
+
* Color Coding:
|
|
22
|
+
* - Red: Target element (when targetElementId is specified)
|
|
23
|
+
* - Blue: Primary elements (is_primary=true)
|
|
24
|
+
* - Green: Regular interactive elements
|
|
25
|
+
*
|
|
26
|
+
* Visual Indicators:
|
|
27
|
+
* - Border thickness and opacity scale with importance score
|
|
28
|
+
* - Semi-transparent fill for better visibility
|
|
29
|
+
* - Importance badges showing scores
|
|
30
|
+
* - Star icon for primary elements
|
|
31
|
+
* - Target emoji for the target element
|
|
32
|
+
*
|
|
33
|
+
* Auto-clear: Overlay automatically disappears after 5 seconds
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // Show overlay from snapshot
|
|
37
|
+
* const snap = await snapshot(browser);
|
|
38
|
+
* await showOverlay(browser, snap);
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* // Show overlay with custom elements
|
|
42
|
+
* const elements = [{id: 1, bbox: {x: 100, y: 100, width: 200, height: 50}, ...}];
|
|
43
|
+
* await showOverlay(browser, elements);
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* // Show overlay with target element highlighted in red
|
|
47
|
+
* await showOverlay(browser, snap, 42);
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* // Clear overlay manually before 5 seconds
|
|
51
|
+
* await clearOverlay(browser);
|
|
52
|
+
*/
|
|
53
|
+
async function showOverlay(browser, elements, targetElementId = null) {
|
|
54
|
+
const page = browser.getPage();
|
|
55
|
+
if (!page) {
|
|
56
|
+
throw new Error('Browser not started. Call start() first.');
|
|
57
|
+
}
|
|
58
|
+
// Handle different input types
|
|
59
|
+
let elementsList;
|
|
60
|
+
if ('elements' in elements && Array.isArray(elements.elements)) {
|
|
61
|
+
// It's a Snapshot object
|
|
62
|
+
elementsList = elements.elements;
|
|
63
|
+
}
|
|
64
|
+
else if (Array.isArray(elements)) {
|
|
65
|
+
// It's already an array
|
|
66
|
+
elementsList = elements;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw new Error('elements must be a Snapshot object or array of elements');
|
|
70
|
+
}
|
|
71
|
+
// Call extension API
|
|
72
|
+
await page.evaluate((args) => {
|
|
73
|
+
if (window.sentience && window.sentience.showOverlay) {
|
|
74
|
+
window.sentience.showOverlay(args.elements, args.targetId);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.warn('[Sentience SDK] showOverlay not available - is extension loaded?');
|
|
78
|
+
}
|
|
79
|
+
}, { elements: elementsList, targetId: targetElementId });
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Clear the visual overlay manually (before 5-second auto-clear)
|
|
83
|
+
*
|
|
84
|
+
* @param browser - SentienceBrowser instance
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* await showOverlay(browser, snap);
|
|
88
|
+
* // ... inspect overlay ...
|
|
89
|
+
* await clearOverlay(browser); // Remove immediately
|
|
90
|
+
*/
|
|
91
|
+
async function clearOverlay(browser) {
|
|
92
|
+
const page = browser.getPage();
|
|
93
|
+
if (!page) {
|
|
94
|
+
throw new Error('Browser not started. Call start() first.');
|
|
95
|
+
}
|
|
96
|
+
await page.evaluate(() => {
|
|
97
|
+
if (window.sentience && window.sentience.clearOverlay) {
|
|
98
|
+
window.sentience.clearOverlay();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAkDH,kCAiCC;AAYD,oCAWC;AArGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACI,KAAK,UAAU,WAAW,CAC/B,OAAyB,EACzB,QAAsC,EACtC,kBAAiC,IAAI;IAErC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,+BAA+B;IAC/B,IAAI,YAAmB,CAAC;IACxB,IAAI,UAAU,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/D,yBAAyB;QACzB,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,wBAAwB;QACxB,YAAY,GAAG,QAAQ,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,qBAAqB;IACrB,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,IAAkD,EAAE,EAAE;QACrD,IAAK,MAAc,CAAC,SAAS,IAAK,MAAc,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YACtE,MAAc,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,CACtD,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACvB,IAAK,MAAc,CAAC,SAAS,IAAK,MAAc,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YACvE,MAAc,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Protocol Interfaces for Testability
|
|
3
|
+
*
|
|
4
|
+
* These interfaces allow classes to depend on abstractions rather than concrete implementations,
|
|
5
|
+
* making them easier to test with mocks.
|
|
6
|
+
*/
|
|
7
|
+
import { Page } from 'playwright';
|
|
8
|
+
import { Snapshot } from '../types';
|
|
9
|
+
import { SnapshotOptions } from '../snapshot';
|
|
10
|
+
/**
|
|
11
|
+
* Interface for browser operations
|
|
12
|
+
* Allows mocking SentienceBrowser for testing
|
|
13
|
+
*/
|
|
14
|
+
export interface IBrowser {
|
|
15
|
+
/**
|
|
16
|
+
* Navigate to a URL
|
|
17
|
+
*/
|
|
18
|
+
goto(url: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Take a snapshot of the current page
|
|
21
|
+
*/
|
|
22
|
+
snapshot(options?: SnapshotOptions): Promise<Snapshot>;
|
|
23
|
+
/**
|
|
24
|
+
* Get the underlying Playwright Page object
|
|
25
|
+
*/
|
|
26
|
+
getPage(): Page | null;
|
|
27
|
+
/**
|
|
28
|
+
* Get the browser context
|
|
29
|
+
*/
|
|
30
|
+
getContext(): any | null;
|
|
31
|
+
/**
|
|
32
|
+
* Get API key if configured
|
|
33
|
+
*/
|
|
34
|
+
getApiKey(): string | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Get API URL if configured
|
|
37
|
+
*/
|
|
38
|
+
getApiUrl(): string | undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Interface for page operations
|
|
42
|
+
* Allows mocking Playwright Page for testing
|
|
43
|
+
*/
|
|
44
|
+
export interface IPage {
|
|
45
|
+
/**
|
|
46
|
+
* Evaluate JavaScript in the page context
|
|
47
|
+
*/
|
|
48
|
+
evaluate<T>(script: string | ((...args: any[]) => T), ...args: any[]): Promise<T>;
|
|
49
|
+
/**
|
|
50
|
+
* Get current page URL
|
|
51
|
+
*/
|
|
52
|
+
url(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Navigate to a URL
|
|
55
|
+
*/
|
|
56
|
+
goto(url: string, options?: any): Promise<any>;
|
|
57
|
+
/**
|
|
58
|
+
* Wait for a function to return truthy value
|
|
59
|
+
*/
|
|
60
|
+
waitForFunction(fn: () => boolean | Promise<boolean>, options?: any): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Wait for timeout
|
|
63
|
+
*/
|
|
64
|
+
waitForTimeout(ms: number): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Get page mouse
|
|
67
|
+
*/
|
|
68
|
+
mouse: {
|
|
69
|
+
click(x: number, y: number): Promise<void>;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Get page keyboard
|
|
73
|
+
*/
|
|
74
|
+
keyboard: {
|
|
75
|
+
type(text: string): Promise<void>;
|
|
76
|
+
press(key: string): Promise<void>;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=browser-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-protocol.d.ts","sourceRoot":"","sources":["../../src/protocols/browser-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvD;;OAEG;IACH,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC;IAEvB;;OAEG;IAEH,UAAU,IAAI,GAAG,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS,CAAC;IAEhC;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB;;OAEG;IAEH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAElF;;OAEG;IACH,GAAG,IAAI,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE/C;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,KAAK,EAAE;QACL,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5C,CAAC;IAEF;;OAEG;IACH,QAAQ,EAAE;QACR,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACnC,CAAC;CACH"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Browser Protocol Interfaces for Testability
|
|
4
|
+
*
|
|
5
|
+
* These interfaces allow classes to depend on abstractions rather than concrete implementations,
|
|
6
|
+
* making them easier to test with mocks.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=browser-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-protocol.js","sourceRoot":"","sources":["../../src/protocols/browser-protocol.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query engine v1 - semantic selector matching
|
|
3
|
+
*/
|
|
4
|
+
import { Snapshot, Element, QuerySelector, QuerySelectorObject } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Parse a selector string into a QuerySelectorObject
|
|
7
|
+
*
|
|
8
|
+
* Supports operators: =, !=, ~, ^=, $=, >, >=, <, <=
|
|
9
|
+
* Supports dot notation: attr.id, css.color, bbox.x
|
|
10
|
+
*
|
|
11
|
+
* @param selector - Selector string (e.g., "role=button", "text~search", "importance>0.5")
|
|
12
|
+
* @returns Parsed query object
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const query = parseSelector('role=button clickable=true importance>0.5');
|
|
17
|
+
* // Returns: { role: 'button', clickable: true, importance_min: 0.5 }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseSelector(selector: string): QuerySelectorObject;
|
|
21
|
+
/**
|
|
22
|
+
* Query elements from a snapshot using a selector
|
|
23
|
+
*
|
|
24
|
+
* @param snapshot - Snapshot containing elements to query
|
|
25
|
+
* @param selector - Query selector (string DSL or object)
|
|
26
|
+
* @returns Array of matching elements, sorted by importance (descending)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const snap = await snapshot(browser);
|
|
31
|
+
*
|
|
32
|
+
* // String selector
|
|
33
|
+
* const buttons = query(snap, 'role=button');
|
|
34
|
+
* const clickable = query(snap, 'clickable=true');
|
|
35
|
+
*
|
|
36
|
+
* // Object selector
|
|
37
|
+
* const results = query(snap, {
|
|
38
|
+
* role: 'button',
|
|
39
|
+
* importance_min: 0.5
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function query(snapshot: Snapshot, selector: QuerySelector): Element[];
|
|
44
|
+
/**
|
|
45
|
+
* Find the first element matching a selector
|
|
46
|
+
*
|
|
47
|
+
* @param snapshot - Snapshot containing elements to search
|
|
48
|
+
* @param selector - Query selector (string DSL or object)
|
|
49
|
+
* @returns First matching element, or null if none found
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const snap = await snapshot(browser);
|
|
54
|
+
*
|
|
55
|
+
* // Find first button
|
|
56
|
+
* const button = find(snap, 'role=button');
|
|
57
|
+
* if (button) {
|
|
58
|
+
* await click(browser, button.id);
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* // Find element by text
|
|
62
|
+
* const searchBox = find(snap, 'text~search');
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function find(snapshot: Snapshot, selector: QuerySelector): Element | null;
|
|
66
|
+
//# 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;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CA8KnE;AAsQD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,EAAE,CAW5E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,IAAI,CAGhF"}
|