@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,530 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Verification primitives for agent assertion loops.
|
|
4
|
+
*
|
|
5
|
+
* This module provides assertion predicates and outcome types for runtime verification
|
|
6
|
+
* in agent loops. Assertions evaluate against the current browser state (snapshot/url)
|
|
7
|
+
* and record results into the trace.
|
|
8
|
+
*
|
|
9
|
+
* Key concepts:
|
|
10
|
+
* - AssertOutcome: Result of evaluating an assertion
|
|
11
|
+
* - AssertContext: Context provided to assertion predicates (snapshot, url, stepId)
|
|
12
|
+
* - Predicate: Callable that takes context and returns outcome
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { urlMatches, exists, AssertContext } from './verification';
|
|
17
|
+
*
|
|
18
|
+
* // Create predicates
|
|
19
|
+
* const onSearchPage = urlMatches(/\/s\?k=/);
|
|
20
|
+
* const resultsLoaded = exists("text~'Results'");
|
|
21
|
+
*
|
|
22
|
+
* // Evaluate against context
|
|
23
|
+
* const ctx: AssertContext = { snapshot, url: "https://example.com/s?k=shoes" };
|
|
24
|
+
* const outcome = onSearchPage(ctx);
|
|
25
|
+
* console.log(outcome.passed); // true
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.downloadCompleted = downloadCompleted;
|
|
30
|
+
exports.urlMatches = urlMatches;
|
|
31
|
+
exports.urlContains = urlContains;
|
|
32
|
+
exports.exists = exists;
|
|
33
|
+
exports.notExists = notExists;
|
|
34
|
+
exports.elementCount = elementCount;
|
|
35
|
+
exports.allOf = allOf;
|
|
36
|
+
exports.anyOf = anyOf;
|
|
37
|
+
exports.custom = custom;
|
|
38
|
+
exports.isEnabled = isEnabled;
|
|
39
|
+
exports.isDisabled = isDisabled;
|
|
40
|
+
exports.isChecked = isChecked;
|
|
41
|
+
exports.isUnchecked = isUnchecked;
|
|
42
|
+
exports.valueEquals = valueEquals;
|
|
43
|
+
exports.valueContains = valueContains;
|
|
44
|
+
exports.isExpanded = isExpanded;
|
|
45
|
+
exports.isCollapsed = isCollapsed;
|
|
46
|
+
const query_1 = require("./query");
|
|
47
|
+
/**
|
|
48
|
+
* Convert QuerySelector to string for display/logging.
|
|
49
|
+
*/
|
|
50
|
+
function selectorToString(selector) {
|
|
51
|
+
return typeof selector === 'string' ? selector : JSON.stringify(selector);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Predicate that passes if a browser download has completed.
|
|
55
|
+
*
|
|
56
|
+
* Notes:
|
|
57
|
+
* - This relies on `AssertContext.downloads` being populated by the runtime/browser.
|
|
58
|
+
*/
|
|
59
|
+
function downloadCompleted(filenameSubstring) {
|
|
60
|
+
return (ctx) => {
|
|
61
|
+
const downloads = ctx.downloads ?? [];
|
|
62
|
+
for (const d of downloads) {
|
|
63
|
+
if (String(d?.status ?? '') !== 'completed')
|
|
64
|
+
continue;
|
|
65
|
+
const fname = String(d?.filename ?? d?.suggested_filename ?? '');
|
|
66
|
+
if (!filenameSubstring || fname.includes(filenameSubstring)) {
|
|
67
|
+
return { passed: true, reason: '', details: { download: d } };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
passed: false,
|
|
72
|
+
reason: filenameSubstring
|
|
73
|
+
? `no completed download matched: ${filenameSubstring}`
|
|
74
|
+
: 'no completed downloads',
|
|
75
|
+
details: { filenameSubstring, downloads },
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create a predicate that checks if current URL matches a regex pattern.
|
|
81
|
+
*
|
|
82
|
+
* @param pattern - Regular expression pattern or string to match against URL
|
|
83
|
+
* @returns Predicate function that evaluates URL matching
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const pred = urlMatches(/\/search\?q=/);
|
|
88
|
+
* const ctx = { snapshot: null, url: "https://example.com/search?q=shoes", stepId: null };
|
|
89
|
+
* const outcome = pred(ctx);
|
|
90
|
+
* console.log(outcome.passed); // true
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
function urlMatches(pattern) {
|
|
94
|
+
const rx = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
|
|
95
|
+
return (ctx) => {
|
|
96
|
+
const url = ctx.url || '';
|
|
97
|
+
const ok = rx.test(url);
|
|
98
|
+
return {
|
|
99
|
+
passed: ok,
|
|
100
|
+
reason: ok ? '' : `url did not match pattern: ${pattern}`,
|
|
101
|
+
details: { pattern: String(pattern), url: url.substring(0, 200) },
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create a predicate that checks if current URL contains a substring.
|
|
107
|
+
*
|
|
108
|
+
* @param substring - String to search for in URL
|
|
109
|
+
* @returns Predicate function that evaluates URL containment
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* const pred = urlContains("/cart");
|
|
114
|
+
* const ctx = { snapshot: null, url: "https://example.com/cart/checkout", stepId: null };
|
|
115
|
+
* const outcome = pred(ctx);
|
|
116
|
+
* console.log(outcome.passed); // true
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
function urlContains(substring) {
|
|
120
|
+
return (ctx) => {
|
|
121
|
+
const url = ctx.url || '';
|
|
122
|
+
const ok = url.includes(substring);
|
|
123
|
+
return {
|
|
124
|
+
passed: ok,
|
|
125
|
+
reason: ok ? '' : `url does not contain: ${substring}`,
|
|
126
|
+
details: { substring, url: url.substring(0, 200) },
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a predicate that checks if elements matching selector exist.
|
|
132
|
+
*
|
|
133
|
+
* Uses the SDK's query engine to find matching elements.
|
|
134
|
+
*
|
|
135
|
+
* @param selector - Semantic selector string (e.g., "role=button text~'Sign in'")
|
|
136
|
+
* @returns Predicate function that evaluates element existence
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const pred = exists("text~'Results'");
|
|
141
|
+
* // Will check if snapshot contains elements with "Results" in text
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
function exists(selector) {
|
|
145
|
+
const selectorStr = selectorToString(selector);
|
|
146
|
+
return (ctx) => {
|
|
147
|
+
const snap = ctx.snapshot;
|
|
148
|
+
if (!snap) {
|
|
149
|
+
return {
|
|
150
|
+
passed: false,
|
|
151
|
+
reason: 'no snapshot available',
|
|
152
|
+
details: { selector: selectorStr, reason_code: 'no_snapshot' },
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
156
|
+
const ok = matches.length > 0;
|
|
157
|
+
return {
|
|
158
|
+
passed: ok,
|
|
159
|
+
reason: ok ? '' : `no elements matched selector: ${selectorStr}`,
|
|
160
|
+
details: {
|
|
161
|
+
selector: selectorStr,
|
|
162
|
+
matched: matches.length,
|
|
163
|
+
reason_code: ok ? 'ok' : 'no_match',
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Create a predicate that checks that NO elements match the selector.
|
|
170
|
+
*
|
|
171
|
+
* Useful for asserting that error messages, loading spinners, etc. are gone.
|
|
172
|
+
*
|
|
173
|
+
* @param selector - Semantic selector string
|
|
174
|
+
* @returns Predicate function that evaluates element non-existence
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```typescript
|
|
178
|
+
* const pred = notExists("text~'Loading'");
|
|
179
|
+
* // Will pass if no elements contain "Loading" text
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
function notExists(selector) {
|
|
183
|
+
const selectorStr = selectorToString(selector);
|
|
184
|
+
return (ctx) => {
|
|
185
|
+
const snap = ctx.snapshot;
|
|
186
|
+
if (!snap) {
|
|
187
|
+
return {
|
|
188
|
+
passed: false,
|
|
189
|
+
reason: 'no snapshot available',
|
|
190
|
+
details: { selector: selectorStr, reason_code: 'no_snapshot' },
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
194
|
+
const ok = matches.length === 0;
|
|
195
|
+
return {
|
|
196
|
+
passed: ok,
|
|
197
|
+
reason: ok ? '' : `found ${matches.length} elements matching: ${selectorStr}`,
|
|
198
|
+
details: {
|
|
199
|
+
selector: selectorStr,
|
|
200
|
+
matched: matches.length,
|
|
201
|
+
reason_code: ok ? 'ok' : 'unexpected_match',
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Create a predicate that checks the number of matching elements.
|
|
208
|
+
*
|
|
209
|
+
* @param selector - Semantic selector string
|
|
210
|
+
* @param options - Count constraints
|
|
211
|
+
* @returns Predicate function that evaluates element count
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```typescript
|
|
215
|
+
* const pred = elementCount("role=button", { minCount: 1, maxCount: 5 });
|
|
216
|
+
* // Will pass if 1-5 buttons found
|
|
217
|
+
* ```
|
|
218
|
+
*/
|
|
219
|
+
function elementCount(selector, options = {}) {
|
|
220
|
+
const { minCount = 0, maxCount } = options;
|
|
221
|
+
const selectorStr = selectorToString(selector);
|
|
222
|
+
return (ctx) => {
|
|
223
|
+
const snap = ctx.snapshot;
|
|
224
|
+
if (!snap) {
|
|
225
|
+
return {
|
|
226
|
+
passed: false,
|
|
227
|
+
reason: 'no snapshot available',
|
|
228
|
+
details: { selector: selectorStr, minCount, maxCount },
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
232
|
+
const count = matches.length;
|
|
233
|
+
let ok = count >= minCount;
|
|
234
|
+
if (maxCount !== undefined) {
|
|
235
|
+
ok = ok && count <= maxCount;
|
|
236
|
+
}
|
|
237
|
+
let reason = '';
|
|
238
|
+
if (!ok) {
|
|
239
|
+
if (maxCount !== undefined) {
|
|
240
|
+
reason = `expected ${minCount}-${maxCount} elements, found ${count}`;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
reason = `expected at least ${minCount} elements, found ${count}`;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
passed: ok,
|
|
248
|
+
reason,
|
|
249
|
+
details: {
|
|
250
|
+
selector: selectorStr,
|
|
251
|
+
matched: count,
|
|
252
|
+
minCount,
|
|
253
|
+
maxCount,
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Create a predicate that passes only if ALL sub-predicates pass.
|
|
260
|
+
*
|
|
261
|
+
* @param predicates - Predicate functions to combine with AND logic
|
|
262
|
+
* @returns Combined predicate
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* ```typescript
|
|
266
|
+
* const pred = allOf(urlContains("/cart"), exists("text~'Checkout'"));
|
|
267
|
+
* // Will pass only if both conditions are true
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
function allOf(...predicates) {
|
|
271
|
+
return (ctx) => {
|
|
272
|
+
const failedReasons = [];
|
|
273
|
+
const allDetails = [];
|
|
274
|
+
for (const p of predicates) {
|
|
275
|
+
const outcome = p(ctx);
|
|
276
|
+
allDetails.push(outcome.details);
|
|
277
|
+
if (!outcome.passed) {
|
|
278
|
+
failedReasons.push(outcome.reason);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const ok = failedReasons.length === 0;
|
|
282
|
+
return {
|
|
283
|
+
passed: ok,
|
|
284
|
+
reason: failedReasons.join('; '),
|
|
285
|
+
details: { subPredicates: allDetails, failedCount: failedReasons.length },
|
|
286
|
+
};
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Create a predicate that passes if ANY sub-predicate passes.
|
|
291
|
+
*
|
|
292
|
+
* @param predicates - Predicate functions to combine with OR logic
|
|
293
|
+
* @returns Combined predicate
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* ```typescript
|
|
297
|
+
* const pred = anyOf(exists("text~'Success'"), exists("text~'Complete'"));
|
|
298
|
+
* // Will pass if either condition is true
|
|
299
|
+
* ```
|
|
300
|
+
*/
|
|
301
|
+
function anyOf(...predicates) {
|
|
302
|
+
return (ctx) => {
|
|
303
|
+
const allReasons = [];
|
|
304
|
+
const allDetails = [];
|
|
305
|
+
for (let i = 0; i < predicates.length; i++) {
|
|
306
|
+
const outcome = predicates[i](ctx);
|
|
307
|
+
allDetails.push(outcome.details);
|
|
308
|
+
if (outcome.passed) {
|
|
309
|
+
return {
|
|
310
|
+
passed: true,
|
|
311
|
+
reason: '',
|
|
312
|
+
details: { subPredicates: allDetails, matchedAtIndex: i },
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
allReasons.push(outcome.reason);
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
passed: false,
|
|
319
|
+
reason: `none of ${predicates.length} predicates passed: ${allReasons.join('; ')}`,
|
|
320
|
+
details: { subPredicates: allDetails },
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Create a predicate from a custom function.
|
|
326
|
+
*
|
|
327
|
+
* @param checkFn - Function that takes AssertContext and returns boolean
|
|
328
|
+
* @param label - Label for debugging/display
|
|
329
|
+
* @returns Predicate wrapping the custom function
|
|
330
|
+
*
|
|
331
|
+
* @example
|
|
332
|
+
* ```typescript
|
|
333
|
+
* const pred = custom(
|
|
334
|
+
* (ctx) => ctx.snapshot !== null && ctx.snapshot.elements.length > 10,
|
|
335
|
+
* "has_many_elements"
|
|
336
|
+
* );
|
|
337
|
+
* ```
|
|
338
|
+
*/
|
|
339
|
+
function custom(checkFn, label = 'custom') {
|
|
340
|
+
return (ctx) => {
|
|
341
|
+
try {
|
|
342
|
+
const ok = checkFn(ctx);
|
|
343
|
+
return {
|
|
344
|
+
passed: ok,
|
|
345
|
+
reason: ok ? '' : `custom check '${label}' returned false`,
|
|
346
|
+
details: { label },
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
catch (e) {
|
|
350
|
+
return {
|
|
351
|
+
passed: false,
|
|
352
|
+
reason: `custom check '${label}' raised exception: ${e}`,
|
|
353
|
+
details: { label, error: String(e) },
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
// ============================================================================
|
|
359
|
+
// v1 state-aware predicates (deterministic, schema-driven)
|
|
360
|
+
// ============================================================================
|
|
361
|
+
function isEnabled(selector) {
|
|
362
|
+
const selectorStr = selectorToString(selector);
|
|
363
|
+
return (ctx) => {
|
|
364
|
+
const snap = ctx.snapshot;
|
|
365
|
+
if (!snap) {
|
|
366
|
+
return { passed: false, reason: 'no snapshot available', details: { selector: selectorStr } };
|
|
367
|
+
}
|
|
368
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
369
|
+
if (matches.length === 0) {
|
|
370
|
+
return {
|
|
371
|
+
passed: false,
|
|
372
|
+
reason: `no elements matched selector: ${selectorStr}`,
|
|
373
|
+
details: { selector: selectorStr, matched: 0, reason_code: 'no_match' },
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
const ok = matches.some(m => m.disabled !== true);
|
|
377
|
+
return {
|
|
378
|
+
passed: ok,
|
|
379
|
+
reason: ok ? '' : `all matched elements are disabled: ${selectorStr}`,
|
|
380
|
+
details: {
|
|
381
|
+
selector: selectorStr,
|
|
382
|
+
matched: matches.length,
|
|
383
|
+
reason_code: ok ? 'ok' : 'state_mismatch',
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
function isDisabled(selector) {
|
|
389
|
+
const selectorStr = selectorToString(selector);
|
|
390
|
+
return (ctx) => {
|
|
391
|
+
const snap = ctx.snapshot;
|
|
392
|
+
if (!snap) {
|
|
393
|
+
return { passed: false, reason: 'no snapshot available', details: { selector: selectorStr } };
|
|
394
|
+
}
|
|
395
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
396
|
+
const ok = matches.some(m => m.disabled === true);
|
|
397
|
+
return {
|
|
398
|
+
passed: ok,
|
|
399
|
+
reason: ok ? '' : `no matched elements are disabled: ${selectorStr}`,
|
|
400
|
+
details: {
|
|
401
|
+
selector: selectorStr,
|
|
402
|
+
matched: matches.length,
|
|
403
|
+
reason_code: ok ? 'ok' : 'state_mismatch',
|
|
404
|
+
},
|
|
405
|
+
};
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
function isChecked(selector) {
|
|
409
|
+
const selectorStr = selectorToString(selector);
|
|
410
|
+
return (ctx) => {
|
|
411
|
+
const snap = ctx.snapshot;
|
|
412
|
+
if (!snap) {
|
|
413
|
+
return { passed: false, reason: 'no snapshot available', details: { selector: selectorStr } };
|
|
414
|
+
}
|
|
415
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
416
|
+
const ok = matches.some(m => m.checked === true);
|
|
417
|
+
return {
|
|
418
|
+
passed: ok,
|
|
419
|
+
reason: ok ? '' : `no matched elements are checked: ${selectorStr}`,
|
|
420
|
+
details: {
|
|
421
|
+
selector: selectorStr,
|
|
422
|
+
matched: matches.length,
|
|
423
|
+
reason_code: ok ? 'ok' : 'state_mismatch',
|
|
424
|
+
},
|
|
425
|
+
};
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
function isUnchecked(selector) {
|
|
429
|
+
const selectorStr = selectorToString(selector);
|
|
430
|
+
return (ctx) => {
|
|
431
|
+
const snap = ctx.snapshot;
|
|
432
|
+
if (!snap) {
|
|
433
|
+
return { passed: false, reason: 'no snapshot available', details: { selector: selectorStr } };
|
|
434
|
+
}
|
|
435
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
436
|
+
const ok = matches.some(m => m.checked !== true);
|
|
437
|
+
return {
|
|
438
|
+
passed: ok,
|
|
439
|
+
reason: ok ? '' : `all matched elements are checked: ${selectorStr}`,
|
|
440
|
+
details: {
|
|
441
|
+
selector: selectorStr,
|
|
442
|
+
matched: matches.length,
|
|
443
|
+
reason_code: ok ? 'ok' : 'state_mismatch',
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
function valueEquals(selector, expected) {
|
|
449
|
+
const selectorStr = selectorToString(selector);
|
|
450
|
+
return (ctx) => {
|
|
451
|
+
const snap = ctx.snapshot;
|
|
452
|
+
if (!snap) {
|
|
453
|
+
return { passed: false, reason: 'no snapshot available', details: { selector: selectorStr } };
|
|
454
|
+
}
|
|
455
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
456
|
+
const ok = matches.some(m => (m.value ?? '') === expected);
|
|
457
|
+
return {
|
|
458
|
+
passed: ok,
|
|
459
|
+
reason: ok ? '' : `no matched elements had value == '${expected}'`,
|
|
460
|
+
details: {
|
|
461
|
+
selector: selectorStr,
|
|
462
|
+
expected,
|
|
463
|
+
matched: matches.length,
|
|
464
|
+
reason_code: ok ? 'ok' : 'state_mismatch',
|
|
465
|
+
},
|
|
466
|
+
};
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
function valueContains(selector, substring) {
|
|
470
|
+
const selectorStr = selectorToString(selector);
|
|
471
|
+
return (ctx) => {
|
|
472
|
+
const snap = ctx.snapshot;
|
|
473
|
+
if (!snap) {
|
|
474
|
+
return { passed: false, reason: 'no snapshot available', details: { selector: selectorStr } };
|
|
475
|
+
}
|
|
476
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
477
|
+
const ok = matches.some(m => (m.value ?? '').toLowerCase().includes(substring.toLowerCase()));
|
|
478
|
+
return {
|
|
479
|
+
passed: ok,
|
|
480
|
+
reason: ok ? '' : `no matched elements had value containing '${substring}'`,
|
|
481
|
+
details: {
|
|
482
|
+
selector: selectorStr,
|
|
483
|
+
substring,
|
|
484
|
+
matched: matches.length,
|
|
485
|
+
reason_code: ok ? 'ok' : 'state_mismatch',
|
|
486
|
+
},
|
|
487
|
+
};
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
function isExpanded(selector) {
|
|
491
|
+
const selectorStr = selectorToString(selector);
|
|
492
|
+
return (ctx) => {
|
|
493
|
+
const snap = ctx.snapshot;
|
|
494
|
+
if (!snap) {
|
|
495
|
+
return { passed: false, reason: 'no snapshot available', details: { selector: selectorStr } };
|
|
496
|
+
}
|
|
497
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
498
|
+
const ok = matches.some(m => m.expanded === true);
|
|
499
|
+
return {
|
|
500
|
+
passed: ok,
|
|
501
|
+
reason: ok ? '' : `no matched elements are expanded: ${selectorStr}`,
|
|
502
|
+
details: {
|
|
503
|
+
selector: selectorStr,
|
|
504
|
+
matched: matches.length,
|
|
505
|
+
reason_code: ok ? 'ok' : 'state_mismatch',
|
|
506
|
+
},
|
|
507
|
+
};
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
function isCollapsed(selector) {
|
|
511
|
+
const selectorStr = selectorToString(selector);
|
|
512
|
+
return (ctx) => {
|
|
513
|
+
const snap = ctx.snapshot;
|
|
514
|
+
if (!snap) {
|
|
515
|
+
return { passed: false, reason: 'no snapshot available', details: { selector: selectorStr } };
|
|
516
|
+
}
|
|
517
|
+
const matches = (0, query_1.query)(snap, selector);
|
|
518
|
+
const ok = matches.some(m => m.expanded !== true);
|
|
519
|
+
return {
|
|
520
|
+
passed: ok,
|
|
521
|
+
reason: ok ? '' : `all matched elements are expanded: ${selectorStr}`,
|
|
522
|
+
details: {
|
|
523
|
+
selector: selectorStr,
|
|
524
|
+
matched: matches.length,
|
|
525
|
+
reason_code: ok ? 'ok' : 'state_mismatch',
|
|
526
|
+
},
|
|
527
|
+
};
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vision executor primitives (shared parsing/execution helpers).
|
|
3
|
+
*
|
|
4
|
+
* This is used by higher-level agents when falling back to a vision model to propose
|
|
5
|
+
* coordinate-based actions.
|
|
6
|
+
*/
|
|
7
|
+
export type VisionExecutorActionKind = 'click_xy' | 'click_rect' | 'press' | 'type' | 'finish';
|
|
8
|
+
export interface VisionExecutorAction {
|
|
9
|
+
kind: VisionExecutorActionKind;
|
|
10
|
+
args: Record<string, any>;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseVisionExecutorAction(text: string): VisionExecutorAction;
|
|
13
|
+
export declare function executeVisionExecutorAction(params: {
|
|
14
|
+
backend: any;
|
|
15
|
+
page?: any;
|
|
16
|
+
action: VisionExecutorAction;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=vision-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-executor.d.ts","sourceRoot":"","sources":["../src/vision-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/F,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CA0B5E;AAED,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,EAAE,oBAAoB,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vision executor primitives (shared parsing/execution helpers).
|
|
4
|
+
*
|
|
5
|
+
* This is used by higher-level agents when falling back to a vision model to propose
|
|
6
|
+
* coordinate-based actions.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.parseVisionExecutorAction = parseVisionExecutorAction;
|
|
10
|
+
exports.executeVisionExecutorAction = executeVisionExecutorAction;
|
|
11
|
+
function parseVisionExecutorAction(text) {
|
|
12
|
+
const t = String(text || '')
|
|
13
|
+
.replace(/```[\w]*\n?/g, '')
|
|
14
|
+
.trim();
|
|
15
|
+
if (/^FINISH\s*\(\s*\)\s*$/i.test(t))
|
|
16
|
+
return { kind: 'finish', args: {} };
|
|
17
|
+
let m = t.match(/^PRESS\s*\(\s*["']([^"']+)["']\s*\)\s*$/i);
|
|
18
|
+
if (m)
|
|
19
|
+
return { kind: 'press', args: { key: m[1] } };
|
|
20
|
+
m = t.match(/^TYPE\s*\(\s*["']([\s\S]*?)["']\s*\)\s*$/i);
|
|
21
|
+
if (m)
|
|
22
|
+
return { kind: 'type', args: { text: m[1] } };
|
|
23
|
+
m = t.match(/^CLICK_XY\s*\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*\)\s*$/i);
|
|
24
|
+
if (m)
|
|
25
|
+
return { kind: 'click_xy', args: { x: Number(m[1]), y: Number(m[2]) } };
|
|
26
|
+
m = t.match(/^CLICK_RECT\s*\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*\)\s*$/i);
|
|
27
|
+
if (m)
|
|
28
|
+
return {
|
|
29
|
+
kind: 'click_rect',
|
|
30
|
+
args: { x: Number(m[1]), y: Number(m[2]), w: Number(m[3]), h: Number(m[4]) },
|
|
31
|
+
};
|
|
32
|
+
throw new Error(`unrecognized vision action: ${t.slice(0, 200)}`);
|
|
33
|
+
}
|
|
34
|
+
async function executeVisionExecutorAction(params) {
|
|
35
|
+
const { backend, page, action } = params;
|
|
36
|
+
if (action.kind === 'click_xy') {
|
|
37
|
+
await backend.mouse_click(Number(action.args.x), Number(action.args.y));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (action.kind === 'click_rect') {
|
|
41
|
+
const cx = Number(action.args.x) + Number(action.args.w) / 2;
|
|
42
|
+
const cy = Number(action.args.y) + Number(action.args.h) / 2;
|
|
43
|
+
await backend.mouse_click(cx, cy);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (action.kind === 'press') {
|
|
47
|
+
if (!page)
|
|
48
|
+
throw new Error('PRESS requires a Playwright page');
|
|
49
|
+
await page.keyboard.press(String(action.args.key));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (action.kind === 'type') {
|
|
53
|
+
await backend.type_text(String(action.args.text));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (action.kind === 'finish')
|
|
57
|
+
return;
|
|
58
|
+
throw new Error(`unknown vision action kind: ${action.kind}`);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=vision-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-executor.js","sourceRoot":"","sources":["../src/vision-executor.ts"],"names":[],"mappings":"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"}
|