@mlola/browser-core 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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/action-space.d.ts +36 -0
  4. package/dist/action-space.d.ts.map +1 -0
  5. package/dist/action-space.js +264 -0
  6. package/dist/action-space.js.map +1 -0
  7. package/dist/budget.d.ts +32 -0
  8. package/dist/budget.d.ts.map +1 -0
  9. package/dist/budget.js +127 -0
  10. package/dist/budget.js.map +1 -0
  11. package/dist/decision-validation.d.ts +31 -0
  12. package/dist/decision-validation.d.ts.map +1 -0
  13. package/dist/decision-validation.js +114 -0
  14. package/dist/decision-validation.js.map +1 -0
  15. package/dist/executor.d.ts +37 -0
  16. package/dist/executor.d.ts.map +1 -0
  17. package/dist/executor.js +209 -0
  18. package/dist/executor.js.map +1 -0
  19. package/dist/fallback.d.ts +19 -0
  20. package/dist/fallback.d.ts.map +1 -0
  21. package/dist/fallback.js +36 -0
  22. package/dist/fallback.js.map +1 -0
  23. package/dist/index.d.ts +10 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +10 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/orchestrator.d.ts +50 -0
  28. package/dist/orchestrator.d.ts.map +1 -0
  29. package/dist/orchestrator.js +1168 -0
  30. package/dist/orchestrator.js.map +1 -0
  31. package/dist/state.d.ts +12 -0
  32. package/dist/state.d.ts.map +1 -0
  33. package/dist/state.js +60 -0
  34. package/dist/state.js.map +1 -0
  35. package/dist/text.d.ts +34 -0
  36. package/dist/text.d.ts.map +1 -0
  37. package/dist/text.js +137 -0
  38. package/dist/text.js.map +1 -0
  39. package/dist/verifier.d.ts +41 -0
  40. package/dist/verifier.d.ts.map +1 -0
  41. package/dist/verifier.js +237 -0
  42. package/dist/verifier.js.map +1 -0
  43. package/package.json +58 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MLola
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # @mlola/browser-core
2
+
3
+ The orchestration engine of the [MLola Browser Runtime](https://mlola.com/browser-runtime):
4
+ task loop, dynamic action space, safe executor, verification and recovery.
5
+
6
+ ```ts
7
+ import { TaskOrchestrator, buildActionSpace, verifyStep } from "@mlola/browser-core";
8
+ ```
9
+
10
+ Most users want the SDK instead: [`@mlola/browser-runtime`](https://www.npmjs.com/package/@mlola/browser-runtime).
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Candidate builder: observation → dynamic typed action space (PRD §14).
3
+ *
4
+ * Only compatible targets are exposed per operation, so the decision model
5
+ * picks from small, correct sets instead of a combinatorial action list.
6
+ * Blocking UI gets priority (PRD §37).
7
+ */
8
+ import type { ActionSpace, BrowserSnapshot } from "@mlola/browser-protocol";
9
+ export interface ActionSpaceLimits {
10
+ click: number;
11
+ type: number;
12
+ select: number;
13
+ option: number;
14
+ openTab: number;
15
+ download: number;
16
+ upload: number;
17
+ tab: number;
18
+ }
19
+ export declare const DEFAULT_SPACE_LIMITS: ActionSpaceLimits;
20
+ export interface ActionSpaceInput {
21
+ snapshot: BrowserSnapshot;
22
+ /** Uploads denied by policy means the head is not offered at all. */
23
+ uploadAllowed: boolean;
24
+ /** Goal text, used only to rank candidates on large pages (deterministic). */
25
+ goal?: string;
26
+ limits?: Partial<ActionSpaceLimits>;
27
+ }
28
+ export declare const buildActionSpace: (input: ActionSpaceInput) => ActionSpace;
29
+ /** Deterministic count summary for traces. */
30
+ export declare const spaceSummary: (space: ActionSpace) => {
31
+ operations: string[];
32
+ headSizes: Record<string, number>;
33
+ quarantined: number;
34
+ };
35
+ export declare const isBlockedSet: (space: ActionSpace) => boolean;
36
+ //# sourceMappingURL=action-space.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-space.d.ts","sourceRoot":"","sources":["../src/action-space.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAKhB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,oBAAoB,EAAE,iBASlC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,qEAAqE;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrC;AA4DD,eAAO,MAAM,gBAAgB,GAAI,OAAO,gBAAgB,KAAG,WAsK1D,CAAC;AAwCF,8CAA8C;AAC9C,eAAO,MAAM,YAAY,GAAI,OAAO,WAAW,KAAG;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAM/H,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,WAAW,KAAG,OAAsD,CAAC"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Candidate builder: observation → dynamic typed action space (PRD §14).
3
+ *
4
+ * Only compatible targets are exposed per operation, so the decision model
5
+ * picks from small, correct sets instead of a combinatorial action list.
6
+ * Blocking UI gets priority (PRD §37).
7
+ */
8
+ import { headForOperation } from "@mlola/browser-protocol";
9
+ export const DEFAULT_SPACE_LIMITS = {
10
+ click: 80,
11
+ type: 30,
12
+ select: 12,
13
+ option: 40,
14
+ openTab: 20,
15
+ download: 60,
16
+ upload: 10,
17
+ tab: 15,
18
+ };
19
+ const shortLabel = (node) => {
20
+ const label = node.label.replace(/\s+/g, " ").trim();
21
+ const base = label.length > 90 ? `${label.slice(0, 89)}…` : label;
22
+ return base.length > 0 ? base : `(${node.role} without label)`;
23
+ };
24
+ const describeCandidate = (node, extra) => {
25
+ const parts = [`${node.role}`, JSON.stringify(shortLabel(node))];
26
+ if (node.value && node.value.length > 0 && node.role !== "textbox" && node.role !== "searchbox") {
27
+ parts.push(`value=${JSON.stringify(node.value.slice(0, 40))}`);
28
+ }
29
+ if (node.placeholder)
30
+ parts.push(`placeholder=${JSON.stringify(node.placeholder.slice(0, 40))}`);
31
+ if (node.flags.offscreen)
32
+ parts.push("(offscreen)");
33
+ if (extra)
34
+ parts.push(extra);
35
+ return parts.join(" ");
36
+ };
37
+ /** Candidate ordering: visible first, then goal relevance, then document order. */
38
+ const orderNodes = (nodes, keywords = []) => [...nodes].sort((a, b) => {
39
+ if (a.flags.visible !== b.flags.visible)
40
+ return a.flags.visible ? -1 : 1;
41
+ const ra = relevance(a.label, keywords);
42
+ const rb = relevance(b.label, keywords);
43
+ if (ra !== rb)
44
+ return rb - ra;
45
+ return a.index - b.index;
46
+ });
47
+ const STOPWORDS = new Set([
48
+ "the", "and", "for", "with", "that", "this", "from", "into", "your", "you", "a", "an", "to", "of", "in", "on",
49
+ "my", "me", "it", "is", "are", "be", "then", "after", "before", "please", "can", "could", "would", "should",
50
+ "get", "go", "do", "make", "sure", "them", "its", "our", "their",
51
+ ]);
52
+ const goalKeywords = (goal) => {
53
+ if (!goal)
54
+ return [];
55
+ return [
56
+ ...new Set(goal
57
+ .toLowerCase()
58
+ .replace(/[^\p{L}\p{N}\s-]/gu, " ")
59
+ .split(/\s+/)
60
+ .filter((word) => word.length >= 4 && !STOPWORDS.has(word))),
61
+ ];
62
+ };
63
+ const relevance = (label, keywords) => {
64
+ if (keywords.length === 0)
65
+ return 0;
66
+ const lower = label.toLowerCase();
67
+ let score = 0;
68
+ for (const keyword of keywords) {
69
+ if (lower.includes(keyword))
70
+ score += 1;
71
+ }
72
+ return score;
73
+ };
74
+ const hasOp = (node, op) => node.operations.includes(op);
75
+ export const buildActionSpace = (input) => {
76
+ const { snapshot } = input;
77
+ const limits = { ...DEFAULT_SPACE_LIMITS, ...(input.limits ?? {}) };
78
+ const nodes = snapshot.nodes;
79
+ const keywords = goalKeywords(input.goal);
80
+ const heads = {};
81
+ const quarantined = [];
82
+ const operations = [];
83
+ const clickNodes = orderNodes(nodes.filter((n) => hasOp(n, "CLICK") && !n.flags.disabled && !n.flags.inert), keywords);
84
+ const typeNodes = orderNodes(nodes.filter((n) => hasOp(n, "TYPE_TEXT") && !n.flags.disabled && !n.flags.readonly), keywords);
85
+ const selectNodes = orderNodes(nodes.filter((n) => hasOp(n, "SELECT") && !n.flags.disabled), keywords);
86
+ const downloadNodes = orderNodes(nodes.filter((n) => hasOp(n, "DOWNLOAD") && !n.flags.disabled), keywords);
87
+ const uploadNodes = orderNodes(nodes.filter((n) => hasOp(n, "UPLOAD") && !n.flags.disabled), keywords);
88
+ const openTabNodes = orderNodes(nodes.filter((n) => n.role === "link" && n.href !== undefined && (n.kind === "_blank" || n.kind === "new-tab")), keywords);
89
+ const blocking = snapshot.blockingUi;
90
+ const isNativeDialog = blocking !== undefined &&
91
+ blocking.nodeIndexes.length === 0 &&
92
+ ["alert", "confirm", "prompt", "beforeunload", "unknown"].includes(blocking.kind);
93
+ const blockingNodeOrder = blocking?.nodeIndexes ?? [];
94
+ const blockedSet = new Set(blockingNodeOrder);
95
+ // ── Blocking UI priority (PRD §37): while a modal or dialog is open, the
96
+ // action space is restricted to resolving it.
97
+ if (blocking && blockingNodeOrder.length > 0) {
98
+ const modalNodes = blockingNodeOrder
99
+ .map((i) => nodes.find((n) => n.index === i))
100
+ .filter((n) => n !== undefined);
101
+ heads.click_target = modalNodes.map((n) => candidateForNode(n));
102
+ if (heads.click_target.length > 0)
103
+ operations.push("CLICK");
104
+ operations.push("WAIT", "BLOCKED", "ASK_USER");
105
+ return { operations, heads, headForOperation: buildHeadMap(operations), quarantined };
106
+ }
107
+ if (isNativeDialog) {
108
+ operations.push("DISMISS_DIALOG");
109
+ if (blocking.kind !== "prompt")
110
+ operations.push("ACCEPT_DIALOG");
111
+ operations.push("WAIT", "BLOCKED", "ASK_USER");
112
+ return { operations, heads, headForOperation: buildHeadMap(operations), quarantined };
113
+ }
114
+ // ── Control-level quarantine (PRD §22.4): a control sitting next to
115
+ // agent-directed instruction text is not offered at all.
116
+ const quarantinedNodes = new Set();
117
+ const quarantineNode = (node, reason) => {
118
+ if (quarantinedNodes.has(node.nodeId))
119
+ return;
120
+ quarantinedNodes.add(node.nodeId);
121
+ quarantined.push({
122
+ key: String(node.index),
123
+ label: node.label,
124
+ nodeIndex: node.index,
125
+ nodeId: node.nodeId,
126
+ provenance: "untrusted_page_content",
127
+ quarantined: true,
128
+ quarantineReason: reason,
129
+ });
130
+ };
131
+ for (const node of nodes) {
132
+ if (node.flags.suspicious) {
133
+ quarantineNode(node, "control is adjacent to agent-directed instruction text");
134
+ }
135
+ }
136
+ const usable = (node) => !quarantinedNodes.has(node.nodeId);
137
+ // ── Normal space ──────────────────────────────────────────────────────────
138
+ const clicks = dedupe(clickNodes.filter(usable)).slice(0, limits.click);
139
+ if (clicks.length > 0) {
140
+ heads.click_target = clicks.map((n) => candidateForNode(n));
141
+ operations.push("CLICK");
142
+ }
143
+ const types = dedupe(typeNodes.filter(usable)).slice(0, limits.type);
144
+ if (types.length > 0) {
145
+ heads.type_text_target = types.map((n) => candidateForNode(n));
146
+ operations.push("TYPE_TEXT");
147
+ }
148
+ const selects = dedupe(selectNodes.filter(usable)).slice(0, limits.select);
149
+ const selectCandidates = [];
150
+ for (const node of selects) {
151
+ const options = (node.options ?? []).filter((o) => !o.disabled).slice(0, limits.option);
152
+ const selected = node.options?.find((o) => o.selected);
153
+ for (const option of options) {
154
+ selectCandidates.push({
155
+ key: `${node.index}:${option.index}`,
156
+ label: `${describeCandidate(node)} → option ${JSON.stringify(option.label)}${option.selected ? " (currently selected)" : ""}`,
157
+ nodeIndex: node.index,
158
+ nodeId: node.nodeId,
159
+ optionIndex: option.index,
160
+ optionValue: option.value,
161
+ provenance: node.provenance,
162
+ });
163
+ }
164
+ }
165
+ if (selectCandidates.length > 0) {
166
+ heads.select_target = selectCandidates;
167
+ operations.push("SELECT");
168
+ }
169
+ const downloads = dedupe(downloadNodes.filter(usable)).slice(0, limits.download);
170
+ if (downloads.length > 0) {
171
+ heads.download_target = downloads.map((n) => candidateForNode(n));
172
+ operations.push("DOWNLOAD");
173
+ }
174
+ const uploads = input.uploadAllowed ? dedupe(uploadNodes.filter(usable)).slice(0, limits.upload) : [];
175
+ if (uploads.length > 0) {
176
+ heads.upload_target = uploads.map((n) => {
177
+ const accept = n.accept ? ` accept=${n.accept}` : "";
178
+ return candidateForNode(n, `${accept} (upload artifact)`);
179
+ });
180
+ operations.push("UPLOAD");
181
+ }
182
+ const openTabs = dedupe(openTabNodes.filter(usable)).slice(0, limits.openTab);
183
+ if (openTabs.length > 0) {
184
+ heads.open_tab_target = openTabs.map((n, i) => ({
185
+ key: `L${i + 1}`,
186
+ label: `${describeCandidate(n)} → ${truncateUrl(n.href ?? "")}`,
187
+ nodeIndex: n.index,
188
+ nodeId: n.nodeId,
189
+ url: n.href,
190
+ provenance: n.provenance,
191
+ }));
192
+ operations.push("OPEN_TAB");
193
+ }
194
+ const otherTabs = snapshot.tabs.filter((t) => !t.active).slice(0, limits.tab);
195
+ if (otherTabs.length > 0) {
196
+ heads.switch_tab_target = otherTabs.map((t) => ({
197
+ key: t.id,
198
+ label: `tab ${t.id} ${JSON.stringify(t.title || t.url)} (${t.ownership})${t.url ? ` url=${truncateUrl(t.url)}` : ""}`,
199
+ tabId: t.id,
200
+ provenance: "browser_runtime",
201
+ }));
202
+ operations.push("SWITCH_TAB");
203
+ }
204
+ const viewport = snapshot.viewport;
205
+ const canScrollDown = viewport.scrollY + viewport.height < viewport.documentHeight - 8;
206
+ const canScrollUp = viewport.scrollY > 8;
207
+ if (canScrollDown)
208
+ operations.push("SCROLL_DOWN");
209
+ if (canScrollUp)
210
+ operations.push("SCROLL_UP");
211
+ if (snapshot.history?.canGoBack)
212
+ operations.push("BACK");
213
+ if (snapshot.history?.canGoForward)
214
+ operations.push("FORWARD");
215
+ operations.push("WAIT", "DONE", "BLOCKED", "ASK_USER");
216
+ return { operations, heads, headForOperation: buildHeadMap(operations), quarantined };
217
+ };
218
+ const candidateForNode = (node, extra) => ({
219
+ key: String(node.index),
220
+ label: `${node.index}: ${describeCandidate(node, extra)}`,
221
+ nodeIndex: node.index,
222
+ nodeId: node.nodeId,
223
+ provenance: node.provenance,
224
+ });
225
+ const dedupe = (nodes) => {
226
+ const seen = new Set();
227
+ const out = [];
228
+ for (const n of nodes) {
229
+ if (seen.has(n.nodeId))
230
+ continue;
231
+ seen.add(n.nodeId);
232
+ out.push(n);
233
+ }
234
+ return out;
235
+ };
236
+ const truncateUrl = (url) => {
237
+ try {
238
+ const parsed = new URL(url);
239
+ const path = `${parsed.pathname}${parsed.search}`;
240
+ return `${parsed.host}${path.length > 60 ? `${path.slice(0, 59)}…` : path}`;
241
+ }
242
+ catch {
243
+ return url.slice(0, 80);
244
+ }
245
+ };
246
+ const buildHeadMap = (operations) => {
247
+ const map = {};
248
+ for (const op of operations) {
249
+ const head = headForOperation(op);
250
+ if (head)
251
+ map[op] = head;
252
+ }
253
+ return map;
254
+ };
255
+ /** Deterministic count summary for traces. */
256
+ export const spaceSummary = (space) => {
257
+ const headSizes = {};
258
+ for (const [head, candidates] of Object.entries(space.heads)) {
259
+ headSizes[head] = candidates?.length ?? 0;
260
+ }
261
+ return { operations: [...space.operations], headSizes, quarantined: space.quarantined.length };
262
+ };
263
+ export const isBlockedSet = (space) => space.operations.includes("DONE") === false;
264
+ //# sourceMappingURL=action-space.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-space.js","sourceRoot":"","sources":["../src/action-space.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Budget manager (PRD §45).
3
+ *
4
+ * Every task has explicit budgets. The manager can continue, degrade, ask the
5
+ * user, or fail cleanly — and never silently overruns.
6
+ */
7
+ import type { BudgetSnapshot, BudgetVerdict, Budgets, CostRates, ProviderRole, Usage } from "@mlola/browser-protocol";
8
+ export interface BudgetManagerOptions {
9
+ budgets?: Partial<Budgets>;
10
+ costRates?: Partial<Record<ProviderRole, CostRates>>;
11
+ now?: () => number;
12
+ }
13
+ export declare class BudgetManager {
14
+ #private;
15
+ readonly budgets: Budgets;
16
+ constructor(opts?: BudgetManagerOptions);
17
+ get snapshot(): BudgetSnapshot;
18
+ stepCompleted(): void;
19
+ charge(role: ProviderRole, usage?: Usage): number;
20
+ recoveryAttempt(): void;
21
+ humanHelp(): void;
22
+ /** Warnings at 80% of a budget; used for BUDGET_WARNING events. */
23
+ warnings(): {
24
+ reason: string;
25
+ level: "warn" | "critical";
26
+ }[];
27
+ /** The pre-step gate. */
28
+ check(): BudgetVerdict;
29
+ /** Whether fallback providers may still be used (degrade tier). */
30
+ fallbackAllowed(): boolean;
31
+ }
32
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEtH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IACrD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAWd,IAAI,GAAE,oBAAyB;IAO3C,IAAI,QAAQ,IAAI,cAAc,CAS7B;IAED,aAAa,IAAI,IAAI;IAIrB,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM;IAOjD,eAAe,IAAI,IAAI;IAIvB,SAAS,IAAI,IAAI;IAIjB,mEAAmE;IACnE,QAAQ,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,EAAE;IA0B5D,yBAAyB;IACzB,KAAK,IAAI,aAAa;IAsCtB,mEAAmE;IACnE,eAAe,IAAI,OAAO;CAO3B"}
package/dist/budget.js ADDED
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Budget manager (PRD §45).
3
+ *
4
+ * Every task has explicit budgets. The manager can continue, degrade, ask the
5
+ * user, or fail cleanly — and never silently overruns.
6
+ */
7
+ import { DEFAULT_BUDGETS, estimateCost } from "@mlola/browser-protocol";
8
+ export class BudgetManager {
9
+ budgets;
10
+ #steps = 0;
11
+ #calls = { decision: 0, planner: 0, text: 0, vision: 0 };
12
+ #costUsd = 0;
13
+ #recoveryAttempts = 0;
14
+ #humanHelpRequests = 0;
15
+ #startedAt;
16
+ #now;
17
+ #costRates;
18
+ #warned = new Set();
19
+ constructor(opts = {}) {
20
+ this.budgets = { ...DEFAULT_BUDGETS, ...(opts.budgets ?? {}) };
21
+ this.#now = opts.now ?? (() => Date.now());
22
+ this.#startedAt = this.#now();
23
+ this.#costRates = opts.costRates ?? {};
24
+ }
25
+ get snapshot() {
26
+ return {
27
+ steps: this.#steps,
28
+ calls: { ...this.#calls },
29
+ costUsd: this.#costUsd,
30
+ durationMs: this.#now() - this.#startedAt,
31
+ recoveryAttempts: this.#recoveryAttempts,
32
+ humanHelpRequests: this.#humanHelpRequests,
33
+ };
34
+ }
35
+ stepCompleted() {
36
+ this.#steps += 1;
37
+ }
38
+ charge(role, usage) {
39
+ this.#calls[role] += usage?.calls ?? 1;
40
+ const cost = estimateCost(usage ?? { provider: role }, this.#costRates[role]);
41
+ this.#costUsd += cost;
42
+ return cost;
43
+ }
44
+ recoveryAttempt() {
45
+ this.#recoveryAttempts += 1;
46
+ }
47
+ humanHelp() {
48
+ this.#humanHelpRequests += 1;
49
+ }
50
+ /** Warnings at 80% of a budget; used for BUDGET_WARNING events. */
51
+ warnings() {
52
+ const out = [];
53
+ const s = this.snapshot;
54
+ const check = (name, used, max) => {
55
+ if (max <= 0)
56
+ return;
57
+ const ratio = used / max;
58
+ const key = `${name}:${ratio >= 1 ? "critical" : ratio >= 0.8 ? "warn" : ""}`;
59
+ if (ratio >= 0.8 && !this.#warned.has(key)) {
60
+ this.#warned.add(key);
61
+ out.push({
62
+ reason: `${name} at ${used}/${max}`,
63
+ level: ratio >= 1 ? "critical" : "warn",
64
+ });
65
+ }
66
+ };
67
+ check("steps", s.steps, this.budgets.maxSteps);
68
+ check("decision calls", s.calls.decision, this.budgets.maxDecisionCalls);
69
+ check("planner calls", s.calls.planner, this.budgets.maxPlannerCalls);
70
+ check("text calls", s.calls.text, this.budgets.maxTextCalls);
71
+ check("vision calls", s.calls.vision, this.budgets.maxVisionCalls);
72
+ check("duration ms", s.durationMs, this.budgets.maxDurationMs);
73
+ check("recovery attempts", s.recoveryAttempts, this.budgets.maxRecoveryAttemptsTotal);
74
+ check("human helps", s.humanHelpRequests, this.budgets.maxHumanHelpRequests);
75
+ return out;
76
+ }
77
+ /** The pre-step gate. */
78
+ check() {
79
+ const s = this.snapshot;
80
+ if (s.steps >= this.budgets.maxSteps) {
81
+ return { kind: "fail", reason: `step budget exhausted (${this.budgets.maxSteps})`, code: "BUDGET_EXHAUSTED" };
82
+ }
83
+ if (s.durationMs >= this.budgets.maxDurationMs) {
84
+ return {
85
+ kind: "fail",
86
+ reason: `duration budget exhausted (${Math.round(this.budgets.maxDurationMs / 1000)}s)`,
87
+ code: "BUDGET_EXHAUSTED",
88
+ };
89
+ }
90
+ if (s.calls.decision >= this.budgets.maxDecisionCalls) {
91
+ return {
92
+ kind: "fail",
93
+ reason: `decision budget exhausted (${this.budgets.maxDecisionCalls})`,
94
+ code: "BUDGET_EXHAUSTED",
95
+ };
96
+ }
97
+ if (s.calls.planner >= this.budgets.maxPlannerCalls && s.calls.planner > 0) {
98
+ // Degrade: continue on the fast path, no more planning.
99
+ return { kind: "degrade", reason: `planner budget exhausted (${this.budgets.maxPlannerCalls})` };
100
+ }
101
+ if (s.humanHelpRequests >= this.budgets.maxHumanHelpRequests) {
102
+ return {
103
+ kind: "fail",
104
+ reason: `human help budget exhausted (${this.budgets.maxHumanHelpRequests})`,
105
+ code: "BUDGET_EXHAUSTED",
106
+ };
107
+ }
108
+ if (this.#costUsd >= this.budgets.maxCostUsd) {
109
+ return s.calls.planner > 0
110
+ ? { kind: "degrade", reason: `cost budget reached ($${this.#costUsd.toFixed(4)})` }
111
+ : { kind: "ask_user", reason: `cost budget reached ($${this.#costUsd.toFixed(4)})` };
112
+ }
113
+ return { kind: "continue" };
114
+ }
115
+ /** Whether fallback providers may still be used (degrade tier). */
116
+ fallbackAllowed() {
117
+ const s = this.snapshot;
118
+ if (s.calls.planner >= this.budgets.maxPlannerCalls)
119
+ return false;
120
+ if (this.#costUsd >= this.budgets.maxCostUsd)
121
+ return false;
122
+ if (s.durationMs >= this.budgets.maxDurationMs * 0.95)
123
+ return false;
124
+ return true;
125
+ }
126
+ }
127
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Decision response validation (PRD §16).
3
+ *
4
+ * Provider output is never trusted blindly: the selected choice must exist and
5
+ * be top-ranked, probabilities must be well-formed, and the target must belong
6
+ * to the selected operation's head. An invalid response is discarded and turns
7
+ * into a provider error for the recovery ladder.
8
+ */
9
+ import type { ActionSpace, DecisionOutput, OperationId, TargetHeadId } from "@mlola/browser-protocol";
10
+ export interface ValidationIssue {
11
+ code: string;
12
+ detail: string;
13
+ }
14
+ export interface ValidationResult {
15
+ ok: boolean;
16
+ issues: ValidationIssue[];
17
+ /** Warnings do not invalidate a decision; they are recorded in the trace. */
18
+ warnings: ValidationIssue[];
19
+ targetHead?: TargetHeadId;
20
+ targetKey?: string;
21
+ }
22
+ export interface ValidationOptions {
23
+ /** Minimum operation confidence; 0 disables the check. */
24
+ minOperationConfidence?: number;
25
+ minTargetConfidence?: number;
26
+ /** Require the selected choice to be the argmax of its probabilities. */
27
+ requireTopChoice?: boolean;
28
+ }
29
+ export declare const validateDecision: (decision: DecisionOutput, space: ActionSpace, opts?: ValidationOptions) => ValidationResult;
30
+ export declare const terminalOperation: (op: OperationId) => boolean;
31
+ //# sourceMappingURL=decision-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-validation.d.ts","sourceRoot":"","sources":["../src/decision-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGtG,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAID,eAAO,MAAM,gBAAgB,GAC3B,UAAU,cAAc,EACxB,OAAO,WAAW,EAClB,OAAM,iBAAsB,KAC3B,gBAsEF,CAAC;AAiEF,eAAO,MAAM,iBAAiB,GAAI,IAAI,WAAW,KAAG,OACI,CAAC"}