@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-evaluator.d.ts","sourceRoot":"","sources":["../../src/utils/browser-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;;;;;;;;;;;OAiBG;WACU,QAAQ,CAAC,CAAC,EACrB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACrC,IAAI,CAAC,EAAE,GAAG,EACV,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,CAAC,CAAC;IA0Cb;;;;;;;;;;;;;;;;;;;OAmBG;WACU,8BAA8B,CAAC,CAAC,EAC3C,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACrC,IAAI,CAAC,EAAE,GAAG,EACV,aAAa,CAAC,EAAE,CAAC,GAChB,OAAO,CAAC,CAAC,CAAC;IAab;;;;;;;;;;;;;;;;OAgBG;WACU,gBAAgB,CAC3B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAC3C,OAAO,GAAE,MAAa,GACrB,OAAO,CAAC,IAAI,CAAC;CAqBjB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BrowserEvaluator - Common browser evaluation patterns with standardized error handling
|
|
4
|
+
*
|
|
5
|
+
* This utility class extracts common page.evaluate() patterns to reduce code duplication
|
|
6
|
+
* and provide consistent error handling across snapshot, actions, wait, and read modules.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.BrowserEvaluator = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* BrowserEvaluator provides static methods for common browser evaluation patterns
|
|
12
|
+
*/
|
|
13
|
+
class BrowserEvaluator {
|
|
14
|
+
/**
|
|
15
|
+
* Execute a browser evaluation script with standardized error handling
|
|
16
|
+
*
|
|
17
|
+
* @param page - Playwright Page instance
|
|
18
|
+
* @param script - Function to execute in browser context
|
|
19
|
+
* @param args - Arguments to pass to the script
|
|
20
|
+
* @param options - Evaluation options (timeout, retries, error handler)
|
|
21
|
+
* @returns Promise resolving to the evaluation result
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const result = await BrowserEvaluator.evaluate(
|
|
26
|
+
* page,
|
|
27
|
+
* (opts) => (window as any).sentience.snapshot(opts),
|
|
28
|
+
* { limit: 50 }
|
|
29
|
+
* );
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
static async evaluate(page, script, args, options = {}) {
|
|
33
|
+
const { timeout, retries = 0, onError } = options;
|
|
34
|
+
let lastError;
|
|
35
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
36
|
+
try {
|
|
37
|
+
if (timeout) {
|
|
38
|
+
return await Promise.race([
|
|
39
|
+
page.evaluate(script, args),
|
|
40
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Evaluation timeout after ${timeout}ms`)), timeout)),
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
return await page.evaluate(script, args);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
47
|
+
// Call custom error handler if provided
|
|
48
|
+
if (onError) {
|
|
49
|
+
onError(lastError);
|
|
50
|
+
}
|
|
51
|
+
// If this was the last retry, throw the error
|
|
52
|
+
if (attempt === retries) {
|
|
53
|
+
throw new Error(`Browser evaluation failed after ${retries + 1} attempt(s): ${lastError.message}`);
|
|
54
|
+
}
|
|
55
|
+
// Wait before retry (exponential backoff)
|
|
56
|
+
if (attempt < retries) {
|
|
57
|
+
await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// This should never be reached, but TypeScript needs it
|
|
62
|
+
throw lastError || new Error('Browser evaluation failed');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Execute a browser evaluation with navigation-aware error handling
|
|
66
|
+
* Navigation may destroy the context, so we handle that gracefully
|
|
67
|
+
*
|
|
68
|
+
* @param page - Playwright Page instance
|
|
69
|
+
* @param script - Function to execute in browser context
|
|
70
|
+
* @param args - Arguments to pass to the script
|
|
71
|
+
* @param fallbackValue - Value to return if evaluation fails due to navigation
|
|
72
|
+
* @returns Promise resolving to the evaluation result or fallback value
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const success = await BrowserEvaluator.evaluateWithNavigationFallback(
|
|
77
|
+
* page,
|
|
78
|
+
* (id) => (window as any).sentience.click(id),
|
|
79
|
+
* elementId,
|
|
80
|
+
* true // Assume success if navigation destroyed context
|
|
81
|
+
* );
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
static async evaluateWithNavigationFallback(page, script, args, fallbackValue) {
|
|
85
|
+
try {
|
|
86
|
+
return await page.evaluate(script, args);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
// Navigation might have destroyed context, return fallback if provided
|
|
90
|
+
if (fallbackValue !== undefined) {
|
|
91
|
+
return fallbackValue;
|
|
92
|
+
}
|
|
93
|
+
// Otherwise rethrow
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Wait for a condition in the browser context with timeout
|
|
99
|
+
*
|
|
100
|
+
* @param page - Playwright Page instance
|
|
101
|
+
* @param condition - Function that returns a truthy value when condition is met
|
|
102
|
+
* @param timeout - Maximum time to wait in milliseconds
|
|
103
|
+
* @returns Promise resolving when condition is met
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* await BrowserEvaluator.waitForCondition(
|
|
108
|
+
* page,
|
|
109
|
+
* () => typeof (window as any).sentience !== 'undefined',
|
|
110
|
+
* 5000
|
|
111
|
+
* );
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
static async waitForCondition(page, condition, timeout = 5000) {
|
|
115
|
+
try {
|
|
116
|
+
await page.waitForFunction(condition, { timeout });
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
// Gather diagnostics if wait fails
|
|
120
|
+
const diag = await this.evaluateWithNavigationFallback(page, () => ({
|
|
121
|
+
sentience_defined: typeof window.sentience !== 'undefined',
|
|
122
|
+
extension_id: document.documentElement.dataset.sentienceExtensionId || 'not set',
|
|
123
|
+
url: window.location.href,
|
|
124
|
+
}), undefined, { sentience_defined: false, extension_id: 'not set', url: 'unknown' });
|
|
125
|
+
throw new Error(`Condition wait failed after ${timeout}ms. ` + `Diagnostics: ${JSON.stringify(diag)}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.BrowserEvaluator = BrowserEvaluator;
|
|
130
|
+
//# sourceMappingURL=browser-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-evaluator.js","sourceRoot":"","sources":["../../src/utils/browser-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-related utility functions
|
|
3
|
+
*/
|
|
4
|
+
import { BrowserContext } from 'playwright';
|
|
5
|
+
/**
|
|
6
|
+
* Save current browser storage state (cookies + localStorage) to a file.
|
|
7
|
+
*
|
|
8
|
+
* This is useful for capturing a logged-in session to reuse later.
|
|
9
|
+
*
|
|
10
|
+
* @param context - Playwright BrowserContext
|
|
11
|
+
* @param filePath - Path to save the storage state JSON file
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { SentienceBrowser } from 'sentience-ts';
|
|
16
|
+
* import { saveStorageState } from 'sentience-ts/utils/browser';
|
|
17
|
+
*
|
|
18
|
+
* const browser = new SentienceBrowser();
|
|
19
|
+
* await browser.start();
|
|
20
|
+
*
|
|
21
|
+
* // User logs in manually or via agent
|
|
22
|
+
* await browser.getPage().goto('https://example.com');
|
|
23
|
+
* // ... login happens ...
|
|
24
|
+
*
|
|
25
|
+
* // Save session for later
|
|
26
|
+
* await saveStorageState(browser.getContext(), 'auth.json');
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function saveStorageState(context: BrowserContext, filePath: string): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Browser-related utility functions
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.saveStorageState = saveStorageState;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
/**
|
|
43
|
+
* Save current browser storage state (cookies + localStorage) to a file.
|
|
44
|
+
*
|
|
45
|
+
* This is useful for capturing a logged-in session to reuse later.
|
|
46
|
+
*
|
|
47
|
+
* @param context - Playwright BrowserContext
|
|
48
|
+
* @param filePath - Path to save the storage state JSON file
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* import { SentienceBrowser } from 'sentience-ts';
|
|
53
|
+
* import { saveStorageState } from 'sentience-ts/utils/browser';
|
|
54
|
+
*
|
|
55
|
+
* const browser = new SentienceBrowser();
|
|
56
|
+
* await browser.start();
|
|
57
|
+
*
|
|
58
|
+
* // User logs in manually or via agent
|
|
59
|
+
* await browser.getPage().goto('https://example.com');
|
|
60
|
+
* // ... login happens ...
|
|
61
|
+
*
|
|
62
|
+
* // Save session for later
|
|
63
|
+
* await saveStorageState(browser.getContext(), 'auth.json');
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
async function saveStorageState(context, filePath) {
|
|
67
|
+
const storageState = await context.storageState();
|
|
68
|
+
const dir = path.dirname(filePath);
|
|
69
|
+
if (!fs.existsSync(dir)) {
|
|
70
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
71
|
+
}
|
|
72
|
+
fs.writeFileSync(filePath, JSON.stringify(storageState, null, 2));
|
|
73
|
+
console.log(`✅ [Sentience] Saved storage state to ${filePath}`);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BH,4CAQC;AAnCD,uCAAyB;AACzB,2CAA6B;AAE7B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACI,KAAK,UAAU,gBAAgB,CAAC,OAAuB,EAAE,QAAgB;IAC9E,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ElementFilter - Consolidates element filtering logic
|
|
3
|
+
*
|
|
4
|
+
* This utility class extracts common element filtering patterns from agent.ts and query.ts
|
|
5
|
+
* to reduce code duplication and improve maintainability.
|
|
6
|
+
*/
|
|
7
|
+
import { Snapshot, Element } from '../types';
|
|
8
|
+
export interface FilterOptions {
|
|
9
|
+
maxElements?: number;
|
|
10
|
+
minImportance?: number;
|
|
11
|
+
maxImportance?: number;
|
|
12
|
+
inViewportOnly?: boolean;
|
|
13
|
+
clickableOnly?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* ElementFilter provides static methods for filtering elements from snapshots
|
|
17
|
+
*/
|
|
18
|
+
export declare class ElementFilter {
|
|
19
|
+
/**
|
|
20
|
+
* Filter elements by importance score
|
|
21
|
+
*
|
|
22
|
+
* @param snapshot - Snapshot containing elements
|
|
23
|
+
* @param maxElements - Maximum number of elements to return (default: 50)
|
|
24
|
+
* @returns Filtered and sorted array of elements
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const filtered = ElementFilter.filterByImportance(snap, 50);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
static filterByImportance(snapshot: Snapshot, maxElements?: number): Element[];
|
|
32
|
+
/**
|
|
33
|
+
* Filter elements relevant to a goal using keyword matching
|
|
34
|
+
* Applies goal-based keyword matching to boost relevant elements
|
|
35
|
+
*
|
|
36
|
+
* @param snapshot - Snapshot containing elements
|
|
37
|
+
* @param goal - Goal/task description to match against
|
|
38
|
+
* @param maxElements - Maximum number of elements to return (default: 50)
|
|
39
|
+
* @returns Filtered and scored array of elements
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const filtered = ElementFilter.filterByGoal(snap, "Click the search box", 50);
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
static filterByGoal(snapshot: Snapshot, goal: string, maxElements?: number): Element[];
|
|
47
|
+
/**
|
|
48
|
+
* Filter elements using multiple criteria
|
|
49
|
+
*
|
|
50
|
+
* @param snapshot - Snapshot containing elements
|
|
51
|
+
* @param options - Filter options
|
|
52
|
+
* @returns Filtered array of elements
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const filtered = ElementFilter.filter(snap, {
|
|
57
|
+
* maxElements: 50,
|
|
58
|
+
* minImportance: 0.5,
|
|
59
|
+
* inViewportOnly: true,
|
|
60
|
+
* clickableOnly: false
|
|
61
|
+
* });
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
static filter(snapshot: Snapshot, options?: FilterOptions): Element[];
|
|
65
|
+
/**
|
|
66
|
+
* Extract keywords from a goal string
|
|
67
|
+
* Removes common stop words and returns meaningful keywords
|
|
68
|
+
*
|
|
69
|
+
* @param goal - Goal string to extract keywords from
|
|
70
|
+
* @returns Array of keywords
|
|
71
|
+
*
|
|
72
|
+
* @private
|
|
73
|
+
*/
|
|
74
|
+
private static extractKeywords;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=element-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-filter.d.ts","sourceRoot":"","sources":["../../src/utils/element-filter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,GAAE,MAAW,GAAG,OAAO,EAAE;IAWlF;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,MAAW,GAAG,OAAO,EAAE;IA6C1F;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,EAAE;IAgCzE;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;CA8D/B"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ElementFilter - Consolidates element filtering logic
|
|
4
|
+
*
|
|
5
|
+
* This utility class extracts common element filtering patterns from agent.ts and query.ts
|
|
6
|
+
* to reduce code duplication and improve maintainability.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ElementFilter = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* ElementFilter provides static methods for filtering elements from snapshots
|
|
12
|
+
*/
|
|
13
|
+
class ElementFilter {
|
|
14
|
+
/**
|
|
15
|
+
* Filter elements by importance score
|
|
16
|
+
*
|
|
17
|
+
* @param snapshot - Snapshot containing elements
|
|
18
|
+
* @param maxElements - Maximum number of elements to return (default: 50)
|
|
19
|
+
* @returns Filtered and sorted array of elements
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const filtered = ElementFilter.filterByImportance(snap, 50);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
static filterByImportance(snapshot, maxElements = 50) {
|
|
27
|
+
// Filter out REMOVED elements - they're not actionable and shouldn't be in LLM context
|
|
28
|
+
const elements = snapshot.elements.filter(el => el.diff_status !== 'REMOVED');
|
|
29
|
+
// Sort by importance (descending)
|
|
30
|
+
elements.sort((a, b) => b.importance - a.importance);
|
|
31
|
+
// Return top N elements
|
|
32
|
+
return elements.slice(0, maxElements);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Filter elements relevant to a goal using keyword matching
|
|
36
|
+
* Applies goal-based keyword matching to boost relevant elements
|
|
37
|
+
*
|
|
38
|
+
* @param snapshot - Snapshot containing elements
|
|
39
|
+
* @param goal - Goal/task description to match against
|
|
40
|
+
* @param maxElements - Maximum number of elements to return (default: 50)
|
|
41
|
+
* @returns Filtered and scored array of elements
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const filtered = ElementFilter.filterByGoal(snap, "Click the search box", 50);
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
static filterByGoal(snapshot, goal, maxElements = 50) {
|
|
49
|
+
if (!goal) {
|
|
50
|
+
return this.filterByImportance(snapshot, maxElements);
|
|
51
|
+
}
|
|
52
|
+
// Filter out REMOVED elements - they're not actionable and shouldn't be in LLM context
|
|
53
|
+
const elements = snapshot.elements.filter(el => el.diff_status !== 'REMOVED');
|
|
54
|
+
const goalLower = goal.toLowerCase();
|
|
55
|
+
const keywords = this.extractKeywords(goalLower);
|
|
56
|
+
// Score elements based on keyword matches
|
|
57
|
+
const scoredElements = [];
|
|
58
|
+
for (const element of elements) {
|
|
59
|
+
let score = element.importance; // Start with base importance
|
|
60
|
+
// Boost score for keyword matches in text
|
|
61
|
+
if (element.text) {
|
|
62
|
+
const textLower = element.text.toLowerCase();
|
|
63
|
+
for (const keyword of keywords) {
|
|
64
|
+
if (textLower.includes(keyword)) {
|
|
65
|
+
score += 0.5; // Boost for keyword match
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Boost score for keyword matches in role
|
|
70
|
+
const roleLower = element.role.toLowerCase();
|
|
71
|
+
for (const keyword of keywords) {
|
|
72
|
+
if (roleLower.includes(keyword)) {
|
|
73
|
+
score += 0.3; // Smaller boost for role match
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
scoredElements.push([score, element]);
|
|
77
|
+
}
|
|
78
|
+
// Sort by score (descending)
|
|
79
|
+
scoredElements.sort((a, b) => b[0] - a[0]);
|
|
80
|
+
// Return top N elements
|
|
81
|
+
return scoredElements.slice(0, maxElements).map(([_, element]) => element);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Filter elements using multiple criteria
|
|
85
|
+
*
|
|
86
|
+
* @param snapshot - Snapshot containing elements
|
|
87
|
+
* @param options - Filter options
|
|
88
|
+
* @returns Filtered array of elements
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const filtered = ElementFilter.filter(snap, {
|
|
93
|
+
* maxElements: 50,
|
|
94
|
+
* minImportance: 0.5,
|
|
95
|
+
* inViewportOnly: true,
|
|
96
|
+
* clickableOnly: false
|
|
97
|
+
* });
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
static filter(snapshot, options = {}) {
|
|
101
|
+
// Filter out REMOVED elements - they're not actionable and shouldn't be in LLM context
|
|
102
|
+
let elements = snapshot.elements.filter(el => el.diff_status !== 'REMOVED');
|
|
103
|
+
// Apply filters
|
|
104
|
+
if (options.minImportance !== undefined) {
|
|
105
|
+
elements = elements.filter(el => el.importance >= options.minImportance);
|
|
106
|
+
}
|
|
107
|
+
if (options.maxImportance !== undefined) {
|
|
108
|
+
elements = elements.filter(el => el.importance <= options.maxImportance);
|
|
109
|
+
}
|
|
110
|
+
if (options.inViewportOnly) {
|
|
111
|
+
elements = elements.filter(el => el.in_viewport);
|
|
112
|
+
}
|
|
113
|
+
if (options.clickableOnly) {
|
|
114
|
+
elements = elements.filter(el => el.visual_cues.is_clickable);
|
|
115
|
+
}
|
|
116
|
+
// Sort by importance (descending)
|
|
117
|
+
elements.sort((a, b) => b.importance - a.importance);
|
|
118
|
+
// Apply max elements limit
|
|
119
|
+
if (options.maxElements !== undefined) {
|
|
120
|
+
elements = elements.slice(0, options.maxElements);
|
|
121
|
+
}
|
|
122
|
+
return elements;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Extract keywords from a goal string
|
|
126
|
+
* Removes common stop words and returns meaningful keywords
|
|
127
|
+
*
|
|
128
|
+
* @param goal - Goal string to extract keywords from
|
|
129
|
+
* @returns Array of keywords
|
|
130
|
+
*
|
|
131
|
+
* @private
|
|
132
|
+
*/
|
|
133
|
+
static extractKeywords(goal) {
|
|
134
|
+
// Common stop words to filter out
|
|
135
|
+
const stopWords = new Set([
|
|
136
|
+
'the',
|
|
137
|
+
'a',
|
|
138
|
+
'an',
|
|
139
|
+
'and',
|
|
140
|
+
'or',
|
|
141
|
+
'but',
|
|
142
|
+
'in',
|
|
143
|
+
'on',
|
|
144
|
+
'at',
|
|
145
|
+
'to',
|
|
146
|
+
'for',
|
|
147
|
+
'of',
|
|
148
|
+
'with',
|
|
149
|
+
'by',
|
|
150
|
+
'from',
|
|
151
|
+
'as',
|
|
152
|
+
'is',
|
|
153
|
+
'was',
|
|
154
|
+
'are',
|
|
155
|
+
'were',
|
|
156
|
+
'be',
|
|
157
|
+
'been',
|
|
158
|
+
'being',
|
|
159
|
+
'have',
|
|
160
|
+
'has',
|
|
161
|
+
'had',
|
|
162
|
+
'do',
|
|
163
|
+
'does',
|
|
164
|
+
'did',
|
|
165
|
+
'will',
|
|
166
|
+
'would',
|
|
167
|
+
'should',
|
|
168
|
+
'could',
|
|
169
|
+
'may',
|
|
170
|
+
'might',
|
|
171
|
+
'must',
|
|
172
|
+
'can',
|
|
173
|
+
'this',
|
|
174
|
+
'that',
|
|
175
|
+
'these',
|
|
176
|
+
'those',
|
|
177
|
+
'i',
|
|
178
|
+
'you',
|
|
179
|
+
'he',
|
|
180
|
+
'she',
|
|
181
|
+
'it',
|
|
182
|
+
'we',
|
|
183
|
+
'they',
|
|
184
|
+
]);
|
|
185
|
+
// Split by whitespace and punctuation, filter out stop words and short words
|
|
186
|
+
const words = goal
|
|
187
|
+
.toLowerCase()
|
|
188
|
+
.split(/[\s,.;:!?()[\]{}'"]+/)
|
|
189
|
+
.filter(word => word.length > 2 && !stopWords.has(word));
|
|
190
|
+
// Remove duplicates
|
|
191
|
+
return Array.from(new Set(words));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
exports.ElementFilter = ElementFilter;
|
|
195
|
+
//# sourceMappingURL=element-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-filter.js","sourceRoot":"","sources":["../../src/utils/element-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for working with grid layout data in snapshots.
|
|
3
|
+
*/
|
|
4
|
+
import type { Snapshot, GridInfo } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* Get grid coordinates (bounding boxes) for detected grids.
|
|
7
|
+
*
|
|
8
|
+
* Groups elements by grid_id and computes the overall bounding box,
|
|
9
|
+
* row/column counts, and item count for each grid.
|
|
10
|
+
*
|
|
11
|
+
* @param snapshot - The snapshot containing elements with layout data
|
|
12
|
+
* @param gridId - Optional grid ID to filter by. If undefined, returns all grids.
|
|
13
|
+
* @returns Array of GridInfo objects, one per detected grid, sorted by grid_id.
|
|
14
|
+
* Each GridInfo contains:
|
|
15
|
+
* - grid_id: The grid identifier
|
|
16
|
+
* - bbox: Bounding box (x, y, width, height) in document coordinates
|
|
17
|
+
* - row_count: Number of rows in the grid
|
|
18
|
+
* - col_count: Number of columns in the grid
|
|
19
|
+
* - item_count: Total number of items in the grid
|
|
20
|
+
* - confidence: Confidence score (currently 1.0)
|
|
21
|
+
* - label: Optional inferred label (e.g., "product_grid", "search_results", "navigation")
|
|
22
|
+
* Note: Label inference is best-effort and may not always be accurate
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const snapshot = await browser.snapshot();
|
|
27
|
+
* // Get all grids
|
|
28
|
+
* const allGrids = getGridBounds(snapshot);
|
|
29
|
+
* // Get specific grid
|
|
30
|
+
* const mainGrid = getGridBounds(snapshot, 0);
|
|
31
|
+
* if (mainGrid.length > 0) {
|
|
32
|
+
* console.log(`Grid 0: ${mainGrid[0].item_count} items at (${mainGrid[0].bbox.x}, ${mainGrid[0].bbox.y})`);
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function getGridBounds(snapshot: Snapshot, gridId?: number): GridInfo[];
|
|
37
|
+
//# sourceMappingURL=grid-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid-utils.d.ts","sourceRoot":"","sources":["../../src/utils/grid-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAW,MAAM,UAAU,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAgI7E"}
|