@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":"actions.d.ts","sourceRoot":"","sources":["../../src/backends/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA6BrD;;;GAGG;AACH,MAAM,MAAM,WAAW,GACnB,IAAI,GACJ;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErB;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAuDjE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,KAAK,CACzB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,MAAM,GAAE,WAAoB,EAC5B,UAAU,GAAE,MAAU,EACtB,SAAS,GAAE,OAAc,EACzB,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,YAAY,CAAC,CA2BvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,EACpB,UAAU,GAAE,OAAe,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0BvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,cAAc,EACvB,MAAM,GAAE,MAAY,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAqBvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,cAA0B,EACpC,KAAK,GAAE,WAAsB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAkCvB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,KAAK,GAAE,aAAa,GAAG,UAAuB,EAC9C,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,YAAY,CAAC,CAkBvB"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Backend-agnostic actions for browser-use integration.
|
|
4
|
+
*
|
|
5
|
+
* These actions work with any BrowserBackend implementation,
|
|
6
|
+
* enabling Sentience grounding with browser-use or other frameworks.
|
|
7
|
+
*
|
|
8
|
+
* Usage with browser-use:
|
|
9
|
+
* import { BrowserUseAdapter } from './backends/browser-use-adapter';
|
|
10
|
+
* import { click, typeText, scroll } from './backends/actions';
|
|
11
|
+
*
|
|
12
|
+
* const adapter = new BrowserUseAdapter(session);
|
|
13
|
+
* const backend = await adapter.createBackend();
|
|
14
|
+
*
|
|
15
|
+
* // Take snapshot and click element
|
|
16
|
+
* const snap = await snapshot(backend);
|
|
17
|
+
* const element = find(snap, 'role=button[name="Submit"]');
|
|
18
|
+
* await click(backend, element.bbox);
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.click = click;
|
|
22
|
+
exports.typeText = typeText;
|
|
23
|
+
exports.scroll = scroll;
|
|
24
|
+
exports.scrollToElement = scrollToElement;
|
|
25
|
+
exports.waitForStable = waitForStable;
|
|
26
|
+
const cursor_policy_1 = require("../cursor-policy");
|
|
27
|
+
const cursorPosByBackend = new WeakMap();
|
|
28
|
+
async function humanMoveBackendIfEnabled(backend, target, cursorPolicy) {
|
|
29
|
+
if (!cursorPolicy || cursorPolicy.mode !== 'human')
|
|
30
|
+
return undefined;
|
|
31
|
+
const key = backend;
|
|
32
|
+
const prev = cursorPosByBackend.get(key);
|
|
33
|
+
const from = prev ? prev : { x: target.x, y: target.y };
|
|
34
|
+
const meta = (0, cursor_policy_1.buildHumanCursorPath)([from.x, from.y], [target.x, target.y], cursorPolicy);
|
|
35
|
+
const pts = meta.path || [];
|
|
36
|
+
const durationMs = meta.duration_ms || 0;
|
|
37
|
+
const perStepMs = durationMs > 0 ? durationMs / Math.max(1, pts.length) : 0;
|
|
38
|
+
for (const p of pts) {
|
|
39
|
+
await backend.mouseMove(p.x, p.y);
|
|
40
|
+
if (perStepMs > 0)
|
|
41
|
+
await sleep(perStepMs);
|
|
42
|
+
}
|
|
43
|
+
if (meta.pause_before_click_ms > 0)
|
|
44
|
+
await sleep(meta.pause_before_click_ms);
|
|
45
|
+
cursorPosByBackend.set(key, { x: target.x, y: target.y });
|
|
46
|
+
return meta;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve target to (x, y) coordinates.
|
|
50
|
+
*
|
|
51
|
+
* - BBox: Returns center point
|
|
52
|
+
* - {x, y, width?, height?}: Returns center if width/height present, else x/y directly
|
|
53
|
+
* - [x, y]: Returns as-is
|
|
54
|
+
*/
|
|
55
|
+
function resolveCoordinates(target) {
|
|
56
|
+
if (Array.isArray(target)) {
|
|
57
|
+
return target;
|
|
58
|
+
}
|
|
59
|
+
if ('width' in target && 'height' in target) {
|
|
60
|
+
// BBox or object with dimensions - compute center
|
|
61
|
+
const x = (target.x || 0) + (target.width || 0) / 2;
|
|
62
|
+
const y = (target.y || 0) + (target.height || 0) / 2;
|
|
63
|
+
return [x, y];
|
|
64
|
+
}
|
|
65
|
+
// Simple {x, y} object
|
|
66
|
+
return [target.x || 0, target.y || 0];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Helper to measure duration
|
|
70
|
+
*/
|
|
71
|
+
function measureDuration(startTime) {
|
|
72
|
+
return Math.floor(Date.now() - startTime);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Helper to create successful ActionResult
|
|
76
|
+
*/
|
|
77
|
+
function successResult(durationMs) {
|
|
78
|
+
return {
|
|
79
|
+
success: true,
|
|
80
|
+
duration_ms: durationMs,
|
|
81
|
+
outcome: 'dom_updated',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Helper to create error ActionResult
|
|
86
|
+
*/
|
|
87
|
+
function errorResult(durationMs, code, reason) {
|
|
88
|
+
return {
|
|
89
|
+
success: false,
|
|
90
|
+
duration_ms: durationMs,
|
|
91
|
+
outcome: 'error',
|
|
92
|
+
error: { code, reason },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Click at coordinates using the backend.
|
|
97
|
+
*
|
|
98
|
+
* @param backend - BrowserBackend implementation
|
|
99
|
+
* @param target - Click target - BBox (clicks center), dict with x/y, or (x, y) tuple
|
|
100
|
+
* @param button - Mouse button to click
|
|
101
|
+
* @param clickCount - Number of clicks (1=single, 2=double)
|
|
102
|
+
* @param moveFirst - Whether to move mouse to position before clicking
|
|
103
|
+
* @returns ActionResult with success status
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* // Click at coordinates
|
|
107
|
+
* await click(backend, [100, 200]);
|
|
108
|
+
*
|
|
109
|
+
* // Click element bbox center
|
|
110
|
+
* await click(backend, element.bbox);
|
|
111
|
+
*
|
|
112
|
+
* // Double-click
|
|
113
|
+
* await click(backend, element.bbox, 'left', 2);
|
|
114
|
+
*/
|
|
115
|
+
async function click(backend, target, button = 'left', clickCount = 1, moveFirst = true, cursorPolicy) {
|
|
116
|
+
const startTime = Date.now();
|
|
117
|
+
const [x, y] = resolveCoordinates(target);
|
|
118
|
+
let cursorMeta;
|
|
119
|
+
try {
|
|
120
|
+
// Optional mouse move for hover effects
|
|
121
|
+
if (moveFirst) {
|
|
122
|
+
cursorMeta = await humanMoveBackendIfEnabled(backend, { x, y }, cursorPolicy);
|
|
123
|
+
if (!cursorMeta) {
|
|
124
|
+
await backend.mouseMove(x, y);
|
|
125
|
+
await sleep(20); // Brief pause for hover
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Perform click
|
|
129
|
+
await backend.mouseClick(x, y, button, clickCount);
|
|
130
|
+
return { ...successResult(measureDuration(startTime)), cursor: cursorMeta };
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
134
|
+
return {
|
|
135
|
+
...errorResult(measureDuration(startTime), 'click_failed', reason),
|
|
136
|
+
cursor: cursorMeta,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Type text, optionally clicking a target first.
|
|
142
|
+
*
|
|
143
|
+
* @param backend - BrowserBackend implementation
|
|
144
|
+
* @param text - Text to type
|
|
145
|
+
* @param target - Optional click target before typing (BBox, dict, or tuple)
|
|
146
|
+
* @param clearFirst - If true, select all and delete before typing
|
|
147
|
+
* @returns ActionResult with success status
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* // Type into focused element
|
|
151
|
+
* await typeText(backend, 'Hello World');
|
|
152
|
+
*
|
|
153
|
+
* // Click input then type
|
|
154
|
+
* await typeText(backend, 'search query', searchBox.bbox);
|
|
155
|
+
*
|
|
156
|
+
* // Clear and type
|
|
157
|
+
* await typeText(backend, 'new value', input.bbox, true);
|
|
158
|
+
*/
|
|
159
|
+
async function typeText(backend, text, target, clearFirst = false) {
|
|
160
|
+
const startTime = Date.now();
|
|
161
|
+
try {
|
|
162
|
+
// Click target if provided
|
|
163
|
+
if (target !== undefined) {
|
|
164
|
+
const [x, y] = resolveCoordinates(target);
|
|
165
|
+
await backend.mouseClick(x, y);
|
|
166
|
+
await sleep(50); // Wait for focus
|
|
167
|
+
}
|
|
168
|
+
// Clear existing content if requested
|
|
169
|
+
if (clearFirst) {
|
|
170
|
+
// Select all and delete
|
|
171
|
+
await backend.eval("document.execCommand('selectAll')");
|
|
172
|
+
await sleep(20);
|
|
173
|
+
}
|
|
174
|
+
// Type the text
|
|
175
|
+
await backend.typeText(text);
|
|
176
|
+
return successResult(measureDuration(startTime));
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
180
|
+
return errorResult(measureDuration(startTime), 'type_failed', reason);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Scroll the page or element.
|
|
185
|
+
*
|
|
186
|
+
* @param backend - BrowserBackend implementation
|
|
187
|
+
* @param deltaY - Scroll amount (positive=down, negative=up)
|
|
188
|
+
* @param target - Optional position for scroll (defaults to viewport center)
|
|
189
|
+
* @returns ActionResult with success status
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* // Scroll down 300px
|
|
193
|
+
* await scroll(backend, 300);
|
|
194
|
+
*
|
|
195
|
+
* // Scroll up 500px
|
|
196
|
+
* await scroll(backend, -500);
|
|
197
|
+
*
|
|
198
|
+
* // Scroll at specific position
|
|
199
|
+
* await scroll(backend, 200, [500, 300]);
|
|
200
|
+
*/
|
|
201
|
+
async function scroll(backend, deltaY = 300, target) {
|
|
202
|
+
const startTime = Date.now();
|
|
203
|
+
try {
|
|
204
|
+
let x;
|
|
205
|
+
let y;
|
|
206
|
+
if (target !== undefined) {
|
|
207
|
+
[x, y] = resolveCoordinates(target);
|
|
208
|
+
}
|
|
209
|
+
await backend.wheel(deltaY, x, y);
|
|
210
|
+
// Wait for scroll to settle
|
|
211
|
+
await sleep(100);
|
|
212
|
+
return successResult(measureDuration(startTime));
|
|
213
|
+
}
|
|
214
|
+
catch (e) {
|
|
215
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
216
|
+
return errorResult(measureDuration(startTime), 'scroll_failed', reason);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Scroll element into view using JavaScript scrollIntoView.
|
|
221
|
+
*
|
|
222
|
+
* @param backend - BrowserBackend implementation
|
|
223
|
+
* @param elementId - Element ID from snapshot (requires sentience_registry)
|
|
224
|
+
* @param behavior - Scroll behavior
|
|
225
|
+
* @param block - Vertical alignment
|
|
226
|
+
* @returns ActionResult with success status
|
|
227
|
+
*/
|
|
228
|
+
async function scrollToElement(backend, elementId, behavior = 'instant', block = 'center') {
|
|
229
|
+
const startTime = Date.now();
|
|
230
|
+
try {
|
|
231
|
+
const scrolled = await backend.eval(`
|
|
232
|
+
(() => {
|
|
233
|
+
const el = window.sentience_registry && window.sentience_registry[${elementId}];
|
|
234
|
+
if (el && el.scrollIntoView) {
|
|
235
|
+
el.scrollIntoView({
|
|
236
|
+
behavior: '${behavior}',
|
|
237
|
+
block: '${block}',
|
|
238
|
+
inline: 'nearest'
|
|
239
|
+
});
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
return false;
|
|
243
|
+
})()
|
|
244
|
+
`);
|
|
245
|
+
// Wait for scroll animation
|
|
246
|
+
const waitTime = behavior === 'smooth' ? 300 : 50;
|
|
247
|
+
await sleep(waitTime);
|
|
248
|
+
const durationMs = measureDuration(startTime);
|
|
249
|
+
if (scrolled) {
|
|
250
|
+
return successResult(durationMs);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
return errorResult(durationMs, 'scroll_failed', 'Element not found in registry');
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (e) {
|
|
257
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
258
|
+
return errorResult(measureDuration(startTime), 'scroll_failed', reason);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Wait for page to reach stable state.
|
|
263
|
+
*
|
|
264
|
+
* @param backend - BrowserBackend implementation
|
|
265
|
+
* @param state - Target document.readyState
|
|
266
|
+
* @param timeoutMs - Maximum wait time
|
|
267
|
+
* @returns ActionResult with success status
|
|
268
|
+
*/
|
|
269
|
+
async function waitForStable(backend, state = 'complete', timeoutMs = 10000) {
|
|
270
|
+
const startTime = Date.now();
|
|
271
|
+
try {
|
|
272
|
+
await backend.waitReadyState(state, timeoutMs);
|
|
273
|
+
return successResult(measureDuration(startTime));
|
|
274
|
+
}
|
|
275
|
+
catch (e) {
|
|
276
|
+
const durationMs = measureDuration(startTime);
|
|
277
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
278
|
+
// Check if it's a timeout error
|
|
279
|
+
if (reason.includes('Timed out')) {
|
|
280
|
+
return errorResult(durationMs, 'timeout', reason);
|
|
281
|
+
}
|
|
282
|
+
return errorResult(durationMs, 'wait_failed', reason);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Helper sleep function.
|
|
287
|
+
*/
|
|
288
|
+
function sleep(ms) {
|
|
289
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/backends/actions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AA6HH,sBAkCC;AAqBD,4BA+BC;AAoBD,wBAyBC;AAWD,0CAuCC;AAUD,sCAsBC;AA7UD,oDAAwD;AAExD,MAAM,kBAAkB,GAA8C,IAAI,OAAO,EAAE,CAAC;AAEpF,KAAK,UAAU,yBAAyB,CACtC,OAAuB,EACvB,MAAgC,EAChC,YAA2B;IAE3B,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACrE,MAAM,GAAG,GAAG,OAA4B,CAAC;IACzC,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IAExD,MAAM,IAAI,GAAG,IAAA,oCAAoB,EAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IACxF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,SAAS,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,IAAI,CAAC,qBAAqB,GAAG,CAAC;QAAE,MAAM,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAE5E,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,IAAW,CAAC;AACrB,CAAC;AAqBD;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,MAAmB;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC5C,kDAAkD;QAClD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,uBAAuB;IACvB,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,SAAiB;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,UAAkB;IACvC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,aAAa;KACvB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,UAAkB,EAAE,IAAY,EAAE,MAAc;IACnE,OAAO;QACL,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KACxB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACI,KAAK,UAAU,KAAK,CACzB,OAAuB,EACvB,MAAmB,EACnB,SAAsB,MAAM,EAC5B,aAAqB,CAAC,EACtB,YAAqB,IAAI,EACzB,YAA2B;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,UAA2C,CAAC;IAEhD,IAAI,CAAC;QACH,wCAAwC;QACxC,IAAI,SAAS,EAAE,CAAC;YACd,UAAU,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YAC9E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9B,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB;YAC3C,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAEnD,OAAO,EAAE,GAAG,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC9E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO;YACL,GAAG,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC;YAClE,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACI,KAAK,UAAU,QAAQ,CAC5B,OAAuB,EACvB,IAAY,EACZ,MAAoB,EACpB,aAAsB,KAAK;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,2BAA2B;QAC3B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB;QACpC,CAAC;QAED,sCAAsC;QACtC,IAAI,UAAU,EAAE,CAAC;YACf,wBAAwB;YACxB,MAAM,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACxD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,gBAAgB;QAChB,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE7B,OAAO,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,MAAM,CAC1B,OAAuB,EACvB,SAAiB,GAAG,EACpB,MAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,IAAI,CAAqB,CAAC;QAC1B,IAAI,CAAqB,CAAC;QAE1B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAElC,4BAA4B;QAC5B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,OAAO,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,eAAe,CACnC,OAAuB,EACvB,SAAiB,EACjB,WAA2B,SAAS,EACpC,QAAqB,QAAQ;IAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;;4EAEoC,SAAS;;;yBAG5D,QAAQ;sBACX,KAAK;;;;;;;KAOtB,CAAC,CAAC;QAEH,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEtB,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,WAAW,CAAC,UAAU,EAAE,eAAe,EAAE,+BAA+B,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,aAAa,CACjC,OAAuB,EACvB,QAAoC,UAAU,EAC9C,YAAoB,KAAK;IAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAE/C,OAAO,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE1D,gCAAgC;QAChC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,OAAO,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,WAAW,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-use adapter for Sentience SDK.
|
|
3
|
+
*
|
|
4
|
+
* This module provides BrowserUseAdapter which wraps browser-use's BrowserSession
|
|
5
|
+
* and provides a CDPBackend for Sentience operations.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { BrowserUseAdapter, BrowserUseCDPTransport } from './backends/browser-use-adapter';
|
|
9
|
+
*
|
|
10
|
+
* // Create adapter with browser-use session
|
|
11
|
+
* const adapter = new BrowserUseAdapter(session);
|
|
12
|
+
* const backend = await adapter.createBackend();
|
|
13
|
+
*
|
|
14
|
+
* // Use backend for Sentience operations
|
|
15
|
+
* const viewport = await backend.refreshPageInfo();
|
|
16
|
+
* await backend.mouseClick(100, 200);
|
|
17
|
+
*/
|
|
18
|
+
import { CDPBackend, CDPTransport } from './cdp-backend';
|
|
19
|
+
/**
|
|
20
|
+
* CDP transport implementation for browser-use.
|
|
21
|
+
*
|
|
22
|
+
* Wraps browser-use's CDP client to provide the CDPTransport interface.
|
|
23
|
+
* Uses cdp-use library pattern: cdpClient.send.Domain.method(params={}, sessionId=)
|
|
24
|
+
*/
|
|
25
|
+
export declare class BrowserUseCDPTransport implements CDPTransport {
|
|
26
|
+
private client;
|
|
27
|
+
private sessionId;
|
|
28
|
+
/**
|
|
29
|
+
* Initialize transport with browser-use CDP client.
|
|
30
|
+
*
|
|
31
|
+
* @param cdpClient - browser-use's CDP client (from cdpSession.cdpClient)
|
|
32
|
+
* @param sessionId - CDP session ID (from cdpSession.sessionId)
|
|
33
|
+
*/
|
|
34
|
+
constructor(cdpClient: unknown, sessionId: string);
|
|
35
|
+
/**
|
|
36
|
+
* Send CDP command using browser-use's cdp-use client.
|
|
37
|
+
*
|
|
38
|
+
* Translates method name like "Runtime.evaluate" to
|
|
39
|
+
* cdpClient.send.Runtime.evaluate(params={...}, sessionId=...).
|
|
40
|
+
*
|
|
41
|
+
* @param method - CDP method name, e.g., "Runtime.evaluate"
|
|
42
|
+
* @param params - Method parameters
|
|
43
|
+
* @returns CDP response dict
|
|
44
|
+
*/
|
|
45
|
+
send(method: string, params?: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Adapter to use Sentience with browser-use's BrowserSession.
|
|
49
|
+
*
|
|
50
|
+
* This adapter:
|
|
51
|
+
* 1. Wraps browser-use's CDP client with BrowserUseCDPTransport
|
|
52
|
+
* 2. Creates CDPBackend for Sentience operations
|
|
53
|
+
* 3. Provides access to the underlying page for extension calls
|
|
54
|
+
*
|
|
55
|
+
* Example:
|
|
56
|
+
* import { BrowserSession, BrowserProfile } from 'browser-use';
|
|
57
|
+
* import { getExtensionDir } from 'sentience';
|
|
58
|
+
* import { BrowserUseAdapter } from './backends/browser-use-adapter';
|
|
59
|
+
*
|
|
60
|
+
* // Setup browser-use with Sentience extension
|
|
61
|
+
* const profile = new BrowserProfile({ args: [`--load-extension=${getExtensionDir()}`] });
|
|
62
|
+
* const session = new BrowserSession({ browserProfile: profile });
|
|
63
|
+
* await session.start();
|
|
64
|
+
*
|
|
65
|
+
* // Create adapter and backend
|
|
66
|
+
* const adapter = new BrowserUseAdapter(session);
|
|
67
|
+
* const backend = await adapter.createBackend();
|
|
68
|
+
*
|
|
69
|
+
* // Navigate (using browser-use)
|
|
70
|
+
* const page = await session.getCurrentPage();
|
|
71
|
+
* await page.goto('https://example.com');
|
|
72
|
+
*
|
|
73
|
+
* // Use backend for precise clicking
|
|
74
|
+
* await backend.mouseClick(100, 200);
|
|
75
|
+
*/
|
|
76
|
+
export declare class BrowserUseAdapter {
|
|
77
|
+
private session;
|
|
78
|
+
private backend;
|
|
79
|
+
private transport;
|
|
80
|
+
/**
|
|
81
|
+
* Initialize adapter with browser-use BrowserSession.
|
|
82
|
+
*
|
|
83
|
+
* @param session - browser-use BrowserSession instance
|
|
84
|
+
*/
|
|
85
|
+
constructor(session: unknown);
|
|
86
|
+
/**
|
|
87
|
+
* Get the current Playwright page from browser-use.
|
|
88
|
+
*
|
|
89
|
+
* This is needed for Sentience snapshot() which calls window.sentience.snapshot().
|
|
90
|
+
*
|
|
91
|
+
* @returns Playwright Page object
|
|
92
|
+
*/
|
|
93
|
+
get page(): unknown;
|
|
94
|
+
/**
|
|
95
|
+
* Get the current Playwright page (async).
|
|
96
|
+
*
|
|
97
|
+
* @returns Playwright Page object
|
|
98
|
+
*/
|
|
99
|
+
getPageAsync(): Promise<unknown>;
|
|
100
|
+
/**
|
|
101
|
+
* API key for Sentience API (for snapshot compatibility).
|
|
102
|
+
*
|
|
103
|
+
* Returns null since browser-use users pass apiKey via SnapshotOptions.
|
|
104
|
+
*/
|
|
105
|
+
get apiKey(): string | null;
|
|
106
|
+
/**
|
|
107
|
+
* API URL for Sentience API (for snapshot compatibility).
|
|
108
|
+
*
|
|
109
|
+
* Returns null to use default.
|
|
110
|
+
*/
|
|
111
|
+
get apiUrl(): string | null;
|
|
112
|
+
/**
|
|
113
|
+
* Create CDP backend for Sentience operations.
|
|
114
|
+
*
|
|
115
|
+
* This method:
|
|
116
|
+
* 1. Gets or creates a CDP session from browser-use
|
|
117
|
+
* 2. Creates BrowserUseCDPTransport to wrap the CDP client
|
|
118
|
+
* 3. Creates CDPBackend with the transport
|
|
119
|
+
*
|
|
120
|
+
* @returns CDPBackend instance ready for use
|
|
121
|
+
* @throws Error if CDP session cannot be created
|
|
122
|
+
*/
|
|
123
|
+
createBackend(): Promise<CDPBackend>;
|
|
124
|
+
/**
|
|
125
|
+
* Get the CDP transport (creates backend if needed).
|
|
126
|
+
*
|
|
127
|
+
* @returns BrowserUseCDPTransport instance
|
|
128
|
+
*/
|
|
129
|
+
getTransport(): Promise<BrowserUseCDPTransport>;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=browser-use-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-use-adapter.d.ts","sourceRoot":"","sources":["../../src/backends/browser-use-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEzD;;;;;GAKG;AACH,qBAAa,sBAAuB,YAAW,YAAY;IACzD,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAS;IAE1B;;;;;OAKG;gBACS,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM;IAKjD;;;;;;;;;OASG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAuC/F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,SAAS,CAAuC;IAExD;;;;OAIG;gBACS,OAAO,EAAE,OAAO;IAI5B;;;;;;OAMG;IACH,IAAI,IAAI,IAAI,OAAO,CAiBlB;IAED;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAStC;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED;;;;;;;;;;OAUG;IACG,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAgC1C;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,sBAAsB,CAAC;CAMtD"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Browser-use adapter for Sentience SDK.
|
|
4
|
+
*
|
|
5
|
+
* This module provides BrowserUseAdapter which wraps browser-use's BrowserSession
|
|
6
|
+
* and provides a CDPBackend for Sentience operations.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { BrowserUseAdapter, BrowserUseCDPTransport } from './backends/browser-use-adapter';
|
|
10
|
+
*
|
|
11
|
+
* // Create adapter with browser-use session
|
|
12
|
+
* const adapter = new BrowserUseAdapter(session);
|
|
13
|
+
* const backend = await adapter.createBackend();
|
|
14
|
+
*
|
|
15
|
+
* // Use backend for Sentience operations
|
|
16
|
+
* const viewport = await backend.refreshPageInfo();
|
|
17
|
+
* await backend.mouseClick(100, 200);
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.BrowserUseAdapter = exports.BrowserUseCDPTransport = void 0;
|
|
21
|
+
const cdp_backend_1 = require("./cdp-backend");
|
|
22
|
+
/**
|
|
23
|
+
* CDP transport implementation for browser-use.
|
|
24
|
+
*
|
|
25
|
+
* Wraps browser-use's CDP client to provide the CDPTransport interface.
|
|
26
|
+
* Uses cdp-use library pattern: cdpClient.send.Domain.method(params={}, sessionId=)
|
|
27
|
+
*/
|
|
28
|
+
class BrowserUseCDPTransport {
|
|
29
|
+
/**
|
|
30
|
+
* Initialize transport with browser-use CDP client.
|
|
31
|
+
*
|
|
32
|
+
* @param cdpClient - browser-use's CDP client (from cdpSession.cdpClient)
|
|
33
|
+
* @param sessionId - CDP session ID (from cdpSession.sessionId)
|
|
34
|
+
*/
|
|
35
|
+
constructor(cdpClient, sessionId) {
|
|
36
|
+
this.client = cdpClient;
|
|
37
|
+
this.sessionId = sessionId;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Send CDP command using browser-use's cdp-use client.
|
|
41
|
+
*
|
|
42
|
+
* Translates method name like "Runtime.evaluate" to
|
|
43
|
+
* cdpClient.send.Runtime.evaluate(params={...}, sessionId=...).
|
|
44
|
+
*
|
|
45
|
+
* @param method - CDP method name, e.g., "Runtime.evaluate"
|
|
46
|
+
* @param params - Method parameters
|
|
47
|
+
* @returns CDP response dict
|
|
48
|
+
*/
|
|
49
|
+
async send(method, params) {
|
|
50
|
+
// Split method into domain and method name
|
|
51
|
+
// e.g., "Runtime.evaluate" -> ("Runtime", "evaluate")
|
|
52
|
+
const parts = method.split('.', 2);
|
|
53
|
+
if (parts.length !== 2) {
|
|
54
|
+
throw new Error(`Invalid CDP method format: ${method}`);
|
|
55
|
+
}
|
|
56
|
+
const [domainName, methodName] = parts;
|
|
57
|
+
// Get the domain object from cdpClient.send
|
|
58
|
+
const clientAny = this.client;
|
|
59
|
+
const send = clientAny.send;
|
|
60
|
+
if (!send) {
|
|
61
|
+
throw new Error('CDP client does not have a send property');
|
|
62
|
+
}
|
|
63
|
+
const domain = send[domainName];
|
|
64
|
+
if (!domain) {
|
|
65
|
+
throw new Error(`Unknown CDP domain: ${domainName}`);
|
|
66
|
+
}
|
|
67
|
+
// Get the method from the domain
|
|
68
|
+
const methodFunc = domain[methodName];
|
|
69
|
+
if (!methodFunc || typeof methodFunc !== 'function') {
|
|
70
|
+
throw new Error(`Unknown CDP method: ${method}`);
|
|
71
|
+
}
|
|
72
|
+
// Call the method with params and session_id
|
|
73
|
+
const result = await methodFunc({
|
|
74
|
+
params: params || {},
|
|
75
|
+
session_id: this.sessionId,
|
|
76
|
+
});
|
|
77
|
+
// cdp-use returns the result directly or null
|
|
78
|
+
return result ?? {};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.BrowserUseCDPTransport = BrowserUseCDPTransport;
|
|
82
|
+
/**
|
|
83
|
+
* Adapter to use Sentience with browser-use's BrowserSession.
|
|
84
|
+
*
|
|
85
|
+
* This adapter:
|
|
86
|
+
* 1. Wraps browser-use's CDP client with BrowserUseCDPTransport
|
|
87
|
+
* 2. Creates CDPBackend for Sentience operations
|
|
88
|
+
* 3. Provides access to the underlying page for extension calls
|
|
89
|
+
*
|
|
90
|
+
* Example:
|
|
91
|
+
* import { BrowserSession, BrowserProfile } from 'browser-use';
|
|
92
|
+
* import { getExtensionDir } from 'sentience';
|
|
93
|
+
* import { BrowserUseAdapter } from './backends/browser-use-adapter';
|
|
94
|
+
*
|
|
95
|
+
* // Setup browser-use with Sentience extension
|
|
96
|
+
* const profile = new BrowserProfile({ args: [`--load-extension=${getExtensionDir()}`] });
|
|
97
|
+
* const session = new BrowserSession({ browserProfile: profile });
|
|
98
|
+
* await session.start();
|
|
99
|
+
*
|
|
100
|
+
* // Create adapter and backend
|
|
101
|
+
* const adapter = new BrowserUseAdapter(session);
|
|
102
|
+
* const backend = await adapter.createBackend();
|
|
103
|
+
*
|
|
104
|
+
* // Navigate (using browser-use)
|
|
105
|
+
* const page = await session.getCurrentPage();
|
|
106
|
+
* await page.goto('https://example.com');
|
|
107
|
+
*
|
|
108
|
+
* // Use backend for precise clicking
|
|
109
|
+
* await backend.mouseClick(100, 200);
|
|
110
|
+
*/
|
|
111
|
+
class BrowserUseAdapter {
|
|
112
|
+
/**
|
|
113
|
+
* Initialize adapter with browser-use BrowserSession.
|
|
114
|
+
*
|
|
115
|
+
* @param session - browser-use BrowserSession instance
|
|
116
|
+
*/
|
|
117
|
+
constructor(session) {
|
|
118
|
+
this.backend = null;
|
|
119
|
+
this.transport = null;
|
|
120
|
+
this.session = session;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get the current Playwright page from browser-use.
|
|
124
|
+
*
|
|
125
|
+
* This is needed for Sentience snapshot() which calls window.sentience.snapshot().
|
|
126
|
+
*
|
|
127
|
+
* @returns Playwright Page object
|
|
128
|
+
*/
|
|
129
|
+
get page() {
|
|
130
|
+
const sessionAny = this.session;
|
|
131
|
+
// browser-use stores page in session
|
|
132
|
+
// Access pattern may vary by browser-use version
|
|
133
|
+
if ('page' in sessionAny) {
|
|
134
|
+
return sessionAny.page;
|
|
135
|
+
}
|
|
136
|
+
if ('_page' in sessionAny) {
|
|
137
|
+
return sessionAny._page;
|
|
138
|
+
}
|
|
139
|
+
if ('getCurrentPage' in sessionAny) {
|
|
140
|
+
// This is async, but we need sync access for property
|
|
141
|
+
// Caller should use getPageAsync() instead
|
|
142
|
+
throw new Error('Use await adapter.getPageAsync() to get the page');
|
|
143
|
+
}
|
|
144
|
+
throw new Error('Could not find page in browser-use session');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get the current Playwright page (async).
|
|
148
|
+
*
|
|
149
|
+
* @returns Playwright Page object
|
|
150
|
+
*/
|
|
151
|
+
async getPageAsync() {
|
|
152
|
+
const sessionAny = this.session;
|
|
153
|
+
if ('getCurrentPage' in sessionAny && typeof sessionAny.getCurrentPage === 'function') {
|
|
154
|
+
return await sessionAny.getCurrentPage();
|
|
155
|
+
}
|
|
156
|
+
return this.page;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* API key for Sentience API (for snapshot compatibility).
|
|
160
|
+
*
|
|
161
|
+
* Returns null since browser-use users pass apiKey via SnapshotOptions.
|
|
162
|
+
*/
|
|
163
|
+
get apiKey() {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* API URL for Sentience API (for snapshot compatibility).
|
|
168
|
+
*
|
|
169
|
+
* Returns null to use default.
|
|
170
|
+
*/
|
|
171
|
+
get apiUrl() {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create CDP backend for Sentience operations.
|
|
176
|
+
*
|
|
177
|
+
* This method:
|
|
178
|
+
* 1. Gets or creates a CDP session from browser-use
|
|
179
|
+
* 2. Creates BrowserUseCDPTransport to wrap the CDP client
|
|
180
|
+
* 3. Creates CDPBackend with the transport
|
|
181
|
+
*
|
|
182
|
+
* @returns CDPBackend instance ready for use
|
|
183
|
+
* @throws Error if CDP session cannot be created
|
|
184
|
+
*/
|
|
185
|
+
async createBackend() {
|
|
186
|
+
if (this.backend !== null) {
|
|
187
|
+
return this.backend;
|
|
188
|
+
}
|
|
189
|
+
const sessionAny = this.session;
|
|
190
|
+
// Get CDP session from browser-use
|
|
191
|
+
// browser-use uses: cdpSession = await session.getOrCreateCdpSession()
|
|
192
|
+
if (!('getOrCreateCdpSession' in sessionAny) ||
|
|
193
|
+
typeof sessionAny.getOrCreateCdpSession !== 'function') {
|
|
194
|
+
throw new Error('browser-use session does not have getOrCreateCdpSession method. ' +
|
|
195
|
+
"Make sure you're using a compatible version of browser-use.");
|
|
196
|
+
}
|
|
197
|
+
const cdpSession = (await sessionAny.getOrCreateCdpSession());
|
|
198
|
+
// Extract CDP client and session ID
|
|
199
|
+
const cdpClient = cdpSession.cdpClient;
|
|
200
|
+
const sessionId = cdpSession.sessionId;
|
|
201
|
+
// Create transport and backend
|
|
202
|
+
this.transport = new BrowserUseCDPTransport(cdpClient, sessionId);
|
|
203
|
+
this.backend = new cdp_backend_1.CDPBackend(this.transport);
|
|
204
|
+
return this.backend;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get the CDP transport (creates backend if needed).
|
|
208
|
+
*
|
|
209
|
+
* @returns BrowserUseCDPTransport instance
|
|
210
|
+
*/
|
|
211
|
+
async getTransport() {
|
|
212
|
+
if (this.transport === null) {
|
|
213
|
+
await this.createBackend();
|
|
214
|
+
}
|
|
215
|
+
return this.transport;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
exports.BrowserUseAdapter = BrowserUseAdapter;
|
|
219
|
+
//# sourceMappingURL=browser-use-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-use-adapter.js","sourceRoot":"","sources":["../../src/backends/browser-use-adapter.ts"],"names":[],"mappings":"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"}
|