@mlola/decision-jev 0.1.0

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.
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Offline decision providers for tests, evals and demos.
3
+ *
4
+ * Neither of these is a decision model. `ScriptedDecisionProvider` replays a
5
+ * fixed sequence through the full runtime (validation, policy, execution,
6
+ * verification); `KeywordDecisionProvider` is a deterministic keyword baseline
7
+ * used for offline demos and as the PRD §56 C baseline. The product fast path
8
+ * is the Jev provider.
9
+ */
10
+ import { RuntimeError, actionSignature, headForOperation, } from "@mlola/browser-protocol";
11
+ export class ScriptedDecisionProvider {
12
+ name;
13
+ seen = [];
14
+ #steps;
15
+ #index = 0;
16
+ constructor(steps, name = "scripted") {
17
+ this.#steps = [...steps];
18
+ this.name = name;
19
+ }
20
+ get remaining() {
21
+ return this.#steps.length - this.#index;
22
+ }
23
+ async decide(input) {
24
+ this.seen.push(input);
25
+ const entry = this.#steps[this.#index];
26
+ if (!entry) {
27
+ throw new RuntimeError("PROVIDER_FAILURE", "scripted provider has no steps left", { retryable: false });
28
+ }
29
+ const raw = typeof entry === "function" ? await entry(input) : entry;
30
+ const step = this.#resolveTarget(raw, input.actionSpace);
31
+ this.#index += 1;
32
+ const warning = this.#validate(step, input.actionSpace);
33
+ return {
34
+ operation: step.operation,
35
+ operationProbabilities: { [step.operation]: 1 },
36
+ operationConfidence: 1,
37
+ ...(step.target !== undefined ? { target: step.target } : {}),
38
+ ...(step.target !== undefined ? { targetProbabilities: { [step.target]: 1 }, targetConfidence: 1 } : {}),
39
+ latencyMs: 0,
40
+ provider: this.name,
41
+ raw: { scriptIndex: this.#index - 1, note: step.note, ...(warning ? { warning } : {}) },
42
+ };
43
+ }
44
+ #resolveTarget(step, space) {
45
+ if (step.target !== undefined || step.targetLabel === undefined)
46
+ return step;
47
+ const head = headForOperation(step.operation);
48
+ if (!head)
49
+ return step;
50
+ const candidates = space.heads[head] ?? [];
51
+ const matcher = typeof step.targetLabel === "string"
52
+ ? (label) => label.toLowerCase().includes(step.targetLabel.toString().toLowerCase())
53
+ : (label) => step.targetLabel.test(label);
54
+ const match = candidates.find((candidate) => matcher(candidate.label));
55
+ if (!match) {
56
+ throw new RuntimeError("PROVIDER_FAILURE", `script step ${step.operation}: no offered target matches ${String(step.targetLabel)}`, { retryable: false });
57
+ }
58
+ return { ...step, target: match.key };
59
+ }
60
+ #validate(step, space) {
61
+ if (!space.operations.includes(step.operation)) {
62
+ return `operation ${step.operation} is not offered`;
63
+ }
64
+ const head = headForOperation(step.operation);
65
+ if (head) {
66
+ const keys = (space.heads[head] ?? []).map((c) => c.key);
67
+ if (step.target === undefined)
68
+ return `operation ${step.operation} needs a target from ${head}`;
69
+ if (!keys.includes(step.target))
70
+ return `target ${step.target} is not in ${head} (${keys.join(", ")})`;
71
+ }
72
+ return undefined;
73
+ }
74
+ }
75
+ /* ─────────────────────────────── Keyword baseline ─────────────────────────── */
76
+ const STOPWORDS = new Set([
77
+ "the", "and", "for", "with", "that", "this", "from", "into", "your", "you", "the", "a", "an", "to", "of", "in",
78
+ "on", "my", "me", "it", "is", "are", "be", "then", "after", "before", "please", "can", "could", "would",
79
+ "should", "download", "upload", "open", "find", "get", "go", "do", "make", "sure", "latest", "new", "first",
80
+ ]);
81
+ const INTENT = {
82
+ download: /\b(download|unduh|export|save|fetch|tarik|ambil)\b/i,
83
+ upload: /\b(upload|unggah|attach|lampirkan|submit|kirim)\b/i,
84
+ search: /\b(search|find|look\s+up|cari|ketik|type|enter|masukkan|isi)\b/i,
85
+ login: /\b(log\s?in|sign\s?in|masuk|authenticate|auth)\b/i,
86
+ next: /\b(next|continue|lanjut|proceed|berikutnya)\b/i,
87
+ accept: /\b(accept|agree|allow|setuju|terima|ok|got\s+it)\b/i,
88
+ };
89
+ export class KeywordDecisionProvider {
90
+ name;
91
+ #minScore;
92
+ #attempts = new Map();
93
+ constructor(options = {}) {
94
+ this.name = options.name ?? "keyword-baseline";
95
+ this.#minScore = options.minScore ?? 3;
96
+ }
97
+ async decide(input) {
98
+ const space = input.actionSpace;
99
+ const keywords = this.#keywords(input.goal);
100
+ const goalLower = input.goal.toLowerCase();
101
+ const intent = {
102
+ download: INTENT.download.test(input.goal),
103
+ upload: INTENT.upload.test(input.goal),
104
+ search: INTENT.search.test(input.goal),
105
+ login: INTENT.login.test(input.goal),
106
+ next: INTENT.next.test(input.goal),
107
+ accept: INTENT.accept.test(input.goal),
108
+ };
109
+ // A single-artifact download goal is done once a verified artifact exists:
110
+ // the baseline has no memory of intent beyond this, and repeating downloads
111
+ // is never what the user asked for.
112
+ if (intent.download && space.operations.includes("DONE")) {
113
+ const obtained = input.artifacts.filter((artifact) => artifact.verified);
114
+ if (obtained.length > 0) {
115
+ return {
116
+ operation: "DONE",
117
+ operationProbabilities: { DONE: 1 },
118
+ operationConfidence: 1,
119
+ latencyMs: 0,
120
+ provider: this.name,
121
+ raw: { why: `already obtained ${obtained.map((a) => a.id).join(", ")}` },
122
+ };
123
+ }
124
+ }
125
+ const scored = [];
126
+ const nodeByIndex = new Map(input.snapshot.nodes.map((node) => [node.index, node]));
127
+ for (const operation of space.operations) {
128
+ const head = headForOperation(operation);
129
+ const candidates = head ? (space.heads[head] ?? []) : [];
130
+ if (head && candidates.length === 0)
131
+ continue;
132
+ if (!head) {
133
+ // Target-less operations: only chosen when nothing better exists.
134
+ const base = {
135
+ BACK: 0,
136
+ FORWARD: 0,
137
+ WAIT: 0,
138
+ DONE: 0,
139
+ BLOCKED: 0,
140
+ ASK_USER: 0,
141
+ ACCEPT_DIALOG: intent.accept ? 6 : 2,
142
+ DISMISS_DIALOG: 1,
143
+ SCROLL_UP: 0,
144
+ SCROLL_DOWN: intent.next ? 2 : 1,
145
+ };
146
+ scored.push({ operation, score: base[operation] ?? 0, why: "targetless" });
147
+ continue;
148
+ }
149
+ for (const candidate of candidates) {
150
+ const label = candidate.label.toLowerCase();
151
+ let score = this.#labelScore(label, keywords);
152
+ const signature = `${operation}:${candidate.key}`;
153
+ const attempts = this.#attempts.get(signature) ?? 0;
154
+ score -= attempts * 4;
155
+ if (operation === "DOWNLOAD") {
156
+ score += intent.download ? 6 : 1;
157
+ if (/invoice|faktur|tagihan|receipt|kuitansi|statement|report|laporan/.test(label))
158
+ score += 2;
159
+ }
160
+ if (operation === "UPLOAD") {
161
+ score += intent.upload ? 6 : 1;
162
+ if (input.artifacts.length === 0)
163
+ score -= 6;
164
+ }
165
+ if (operation === "TYPE_TEXT") {
166
+ score += intent.search || intent.login ? 2 : 0;
167
+ if (goalLower.includes("search") && /search|cari|query|kata\s+kunci/.test(label))
168
+ score += 3;
169
+ if (intent.login && /email|user|username|password|kata\s+sandi/.test(label))
170
+ score += 3;
171
+ // Prefer filling an empty credential/identity field over submitting.
172
+ const node = candidate.nodeIndex !== undefined ? nodeByIndex.get(candidate.nodeIndex) : undefined;
173
+ const empty = node?.value === undefined || node.value.length === 0;
174
+ if (empty && /email|user|username|password|kata\s+sandi|search|cari|query/.test(label))
175
+ score += 5;
176
+ if (!empty)
177
+ score -= 5;
178
+ }
179
+ if (operation === "CLICK") {
180
+ if (/search|cari|submit|go|kirim|continue|next|lanjut|sign\s?in|log\s?in|masuk/.test(label))
181
+ score += 2;
182
+ if (intent.login && /sign\s?in|log\s?in|masuk/.test(label))
183
+ score += 4;
184
+ if (intent.next && /next|continue|lanjut|berikutnya|→|>$/.test(label))
185
+ score += 3;
186
+ if (intent.accept && /accept|agree|allow|setuju|terima|ok|got\s+it|close|tutup/.test(label))
187
+ score += 4;
188
+ if (/invoice|faktur|tagihan|receipt|kuitansi/.test(label))
189
+ score += intent.download ? 2 : 0;
190
+ }
191
+ if (operation === "SELECT")
192
+ score += 1;
193
+ if (operation === "SWITCH_TAB")
194
+ score += intent.next ? 1 : 0;
195
+ scored.push({ operation, candidate, score, why: candidate.label.slice(0, 80) });
196
+ }
197
+ }
198
+ scored.sort((a, b) => b.score - a.score);
199
+ const best = scored.find((s) => s.score >= this.#minScore && supported(s.operation, space));
200
+ const chosen = best ?? this.#fallback(space) ?? scored[0];
201
+ if (!chosen) {
202
+ throw new RuntimeError("PROVIDER_FAILURE", "no operation is available", { retryable: false });
203
+ }
204
+ if (chosen.candidate) {
205
+ const signature = `${chosen.operation}:${chosen.candidate.key}`;
206
+ this.#attempts.set(signature, (this.#attempts.get(signature) ?? 0) + 1);
207
+ }
208
+ // Operation probabilities come from the best candidate per operation, so the
209
+ // selected operation is always the top choice (PRD §16).
210
+ const bestByOperation = new Map();
211
+ for (const entry of scored) {
212
+ const current = bestByOperation.get(entry.operation);
213
+ const value = Math.max(0, entry.score);
214
+ if (current === undefined || value > current)
215
+ bestByOperation.set(entry.operation, value);
216
+ }
217
+ const total = [...bestByOperation.values()].reduce((sum, value) => sum + value, 0) || 1;
218
+ const distribution = {};
219
+ for (const [operation, score] of bestByOperation) {
220
+ distribution[operation] = score / total;
221
+ }
222
+ return {
223
+ operation: chosen.operation,
224
+ operationProbabilities: distribution,
225
+ operationConfidence: best ? 0.4 : 0.2,
226
+ ...(chosen.candidate ? { target: chosen.candidate.key } : {}),
227
+ ...(chosen.candidate ? { targetProbabilities: {}, targetConfidence: 0.4 } : {}),
228
+ latencyMs: 0,
229
+ provider: this.name,
230
+ raw: { why: chosen.why, score: chosen.score },
231
+ };
232
+ }
233
+ #fallback(space) {
234
+ const order = ["SCROLL_DOWN", "WAIT", "DONE"];
235
+ for (const operation of order) {
236
+ if (space.operations.includes(operation))
237
+ return { operation, score: 0, why: "fallback" };
238
+ }
239
+ const first = space.operations[0];
240
+ return first ? { operation: first, score: 0, why: "first offered" } : undefined;
241
+ }
242
+ #keywords(goal) {
243
+ return [
244
+ ...new Set(goal
245
+ .toLowerCase()
246
+ .replace(/[^\p{L}\p{N}\s-]/gu, " ")
247
+ .split(/\s+/)
248
+ .filter((w) => w.length >= 4 && !STOPWORDS.has(w))),
249
+ ];
250
+ }
251
+ #labelScore(label, keywords) {
252
+ let score = 0;
253
+ for (const keyword of keywords) {
254
+ if (label.includes(keyword))
255
+ score += label.split(/\s+/).includes(keyword) ? 3 : 2;
256
+ }
257
+ return score;
258
+ }
259
+ }
260
+ const supported = (operation, space) => space.operations.includes(operation);
261
+ /** Signature helper re-exported for tests that assert loop behaviour. */
262
+ export { actionSignature };
263
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@mlola/decision-jev",
3
+ "version": "0.1.0",
4
+ "description": "TypeSafe Jev fast-path decision provider, dynamic action space and decision validation.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "development": "./src/index.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./testing": {
16
+ "types": "./dist/testing/index.d.ts",
17
+ "development": "./src/testing/index.ts",
18
+ "default": "./dist/testing/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "LICENSE",
24
+ "README.md"
25
+ ],
26
+ "sideEffects": false,
27
+ "engines": {
28
+ "node": ">=22.18"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/mlolahq/browser-runtime.git"
33
+ },
34
+ "homepage": "https://mlola.com/browser-runtime",
35
+ "bugs": {
36
+ "url": "https://github.com/mlolahq/browser-runtime.git/issues"
37
+ },
38
+ "keywords": [
39
+ "browser-automation",
40
+ "browser-agent",
41
+ "runtime",
42
+ "playwright",
43
+ "agent",
44
+ "jev",
45
+ "llm",
46
+ "automation"
47
+ ],
48
+ "scripts": {
49
+ "build": "tsc -b"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "dependencies": {
55
+ "@mlola/browser-protocol": "0.1.0"
56
+ }
57
+ }