@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
@@ -0,0 +1,114 @@
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 { headForOperation } from "@mlola/browser-protocol";
10
+ const SUM_TOLERANCE = 0.12;
11
+ export const validateDecision = (decision, space, opts = {}) => {
12
+ const issues = [];
13
+ const warnings = [];
14
+ if (!space.operations.includes(decision.operation)) {
15
+ issues.push({
16
+ code: "UNKNOWN_OPERATION",
17
+ detail: `operation "${decision.operation}" is not in the offered space (${space.operations.join(", ")})`,
18
+ });
19
+ return { ok: false, issues, warnings };
20
+ }
21
+ const opResult = checkChoices(`operation`, decision.operation, space.operations, decision.operationProbabilities, decision.operationConfidence, { min: opts.minOperationConfidence ?? 0, requireTop: opts.requireTopChoice ?? true });
22
+ issues.push(...opResult.issues);
23
+ warnings.push(...opResult.warnings);
24
+ const head = headForOperation(decision.operation);
25
+ if (head === undefined) {
26
+ if (decision.target !== undefined) {
27
+ warnings.push({
28
+ code: "UNEXPECTED_TARGET",
29
+ detail: `operation ${decision.operation} takes no target but a target was returned`,
30
+ });
31
+ }
32
+ return { ok: issues.length === 0, issues, warnings };
33
+ }
34
+ const candidates = space.heads[head] ?? [];
35
+ if (candidates.length === 0) {
36
+ issues.push({
37
+ code: "EMPTY_TARGET_HEAD",
38
+ detail: `operation ${decision.operation} has no compatible targets`,
39
+ });
40
+ return { ok: false, issues, warnings };
41
+ }
42
+ if (decision.target === undefined || decision.target.length === 0) {
43
+ issues.push({
44
+ code: "MISSING_TARGET",
45
+ detail: `operation ${decision.operation} requires a target from ${head}`,
46
+ });
47
+ return { ok: false, issues, warnings };
48
+ }
49
+ const keys = candidates.map((c) => c.key);
50
+ const targetResult = checkChoices(`target for ${head}`, decision.target, keys, decision.targetProbabilities, decision.targetConfidence, { min: opts.minTargetConfidence ?? 0, requireTop: opts.requireTopChoice ?? true });
51
+ issues.push(...targetResult.issues);
52
+ warnings.push(...targetResult.warnings);
53
+ return {
54
+ ok: issues.length === 0,
55
+ issues,
56
+ warnings,
57
+ targetHead: head,
58
+ targetKey: decision.target,
59
+ };
60
+ };
61
+ const checkChoices = (what, selected, allowed, probabilities, confidence, opts) => {
62
+ const issues = [];
63
+ const warnings = [];
64
+ if (!allowed.includes(selected)) {
65
+ issues.push({ code: "UNKNOWN_CHOICE", detail: `${what}: choice "${selected}" is not offered` });
66
+ return { issues, warnings };
67
+ }
68
+ if (confidence !== undefined) {
69
+ if (!Number.isFinite(confidence) || confidence < 0 || confidence > 1) {
70
+ issues.push({
71
+ code: "BAD_CONFIDENCE",
72
+ detail: `${what}: confidence ${confidence} is not in [0,1]`,
73
+ });
74
+ }
75
+ else if (opts.min > 0 && confidence < opts.min) {
76
+ issues.push({
77
+ code: "LOW_CONFIDENCE",
78
+ detail: `${what}: confidence ${confidence.toFixed(3)} < minimum ${opts.min}`,
79
+ });
80
+ }
81
+ }
82
+ if (probabilities !== undefined) {
83
+ const entries = Object.entries(probabilities);
84
+ let sum = 0;
85
+ for (const [key, value] of entries) {
86
+ if (!Number.isFinite(value) || value < 0 || value > 1) {
87
+ issues.push({ code: "BAD_PROBABILITY", detail: `${what}: probability ${key}=${value} is invalid` });
88
+ continue;
89
+ }
90
+ sum += value;
91
+ if (!allowed.includes(key)) {
92
+ warnings.push({ code: "EXTRA_PROBABILITY", detail: `${what}: probability key "${key}" is not offered` });
93
+ }
94
+ }
95
+ if (entries.length > 0 && Math.abs(sum - 1) > SUM_TOLERANCE) {
96
+ warnings.push({
97
+ code: "PROBABILITY_SUM",
98
+ detail: `${what}: probabilities sum to ${sum.toFixed(3)}`,
99
+ });
100
+ }
101
+ if (opts.requireTop && entries.length > 0) {
102
+ const top = entries.reduce((a, b) => (b[1] > a[1] ? b : a));
103
+ if (top[0] !== selected && top[1] > (probabilities[selected] ?? 0) + 0.02) {
104
+ issues.push({
105
+ code: "SELECTED_NOT_TOP",
106
+ detail: `${what}: selected "${selected}" but top choice is "${top[0]}" (${top[1].toFixed(3)})`,
107
+ });
108
+ }
109
+ }
110
+ }
111
+ return { issues, warnings };
112
+ };
113
+ export const terminalOperation = (op) => op === "DONE" || op === "BLOCKED" || op === "ASK_USER";
114
+ //# sourceMappingURL=decision-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-validation.js","sourceRoot":"","sources":["../src/decision-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAwB3D,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,QAAwB,EACxB,KAAkB,EAClB,OAA0B,EAAE,EACV,EAAE;IACpB,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,cAAc,QAAQ,CAAC,SAAS,kCAAkC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SACzG,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAC3B,WAAW,EACX,QAAQ,CAAC,SAAS,EAClB,KAAK,CAAC,UAA+B,EACrC,QAAQ,CAAC,sBAAsB,EAC/B,QAAQ,CAAC,mBAAmB,EAC5B,EAAE,GAAG,EAAE,IAAI,CAAC,sBAAsB,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI,EAAE,CACrF,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,mBAAmB;gBACzB,MAAM,EAAE,aAAa,QAAQ,CAAC,SAAS,4CAA4C;aACpF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,aAAa,QAAQ,CAAC,SAAS,4BAA4B;SACpE,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,aAAa,QAAQ,CAAC,SAAS,2BAA2B,IAAI,EAAE;SACzE,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,YAAY,CAC/B,cAAc,IAAI,EAAE,EACpB,QAAQ,CAAC,MAAM,EACf,IAAI,EACJ,QAAQ,CAAC,mBAAmB,EAC5B,QAAQ,CAAC,gBAAgB,EACzB,EAAE,GAAG,EAAE,IAAI,CAAC,mBAAmB,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAClF,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM;QACN,QAAQ;QACR,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,QAAQ,CAAC,MAAM;KAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CACnB,IAAY,EACZ,QAAgB,EAChB,OAA0B,EAC1B,aAAiD,EACjD,UAA8B,EAC9B,IAA0C,EACkB,EAAE;IAC9D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,aAAa,QAAQ,kBAAkB,EAAE,CAAC,CAAC;QAChG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,GAAG,IAAI,gBAAgB,UAAU,kBAAkB;aAC5D,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,GAAG,IAAI,gBAAgB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,IAAI,iBAAiB,GAAG,IAAI,KAAK,aAAa,EAAE,CAAC,CAAC;gBACpG,SAAS;YACX,CAAC;YACD,GAAG,IAAI,KAAK,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,sBAAsB,GAAG,kBAAkB,EAAE,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,iBAAiB;gBACvB,MAAM,EAAE,GAAG,IAAI,0BAA0B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;aAC1D,CAAC,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC1E,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,GAAG,IAAI,eAAe,QAAQ,wBAAwB,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;iBAC/F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAe,EAAW,EAAE,CAC5D,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,UAAU,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Safe executor (PRD §23, §24, §25, §26, §29).
3
+ *
4
+ * freshness → preflight (visibility, enabled, geometry, occlusion) →
5
+ * typed execution → bounded settle → fresh observation → verification
6
+ *
7
+ * Failures are classified, never retried blindly, and every step records
8
+ * enough evidence for the recovery ladder to choose a strategy.
9
+ */
10
+ import { RuntimeError } from "@mlola/browser-protocol";
11
+ import type { BrowserSnapshot, DecidedAction } from "@mlola/browser-protocol";
12
+ import type { ActionOutcome, BrowserBackend } from "@mlola/browser-backend";
13
+ import type { ArtifactRecord, ArtifactRegistry } from "@mlola/browser-artifacts";
14
+ import type { EventLog } from "@mlola/browser-trace";
15
+ import { type StepVerification } from "./verifier.ts";
16
+ export interface ExecutorOptions {
17
+ backend: BrowserBackend;
18
+ events: EventLog;
19
+ artifacts: ArtifactRegistry;
20
+ sessionId: string;
21
+ runId: string;
22
+ }
23
+ export interface ExecutorResult {
24
+ ok: boolean;
25
+ outcome: ActionOutcome;
26
+ /** Observation taken after the action; reusable as the next step's input. */
27
+ after: BrowserSnapshot;
28
+ verification: StepVerification;
29
+ artifact?: ArtifactRecord;
30
+ failure?: RuntimeError;
31
+ }
32
+ export declare class Executor {
33
+ #private;
34
+ constructor(opts: ExecutorOptions);
35
+ execute(decided: DecidedAction, before: BrowserSnapshot): Promise<ExecutorResult>;
36
+ }
37
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAuD,MAAM,yBAAyB,CAAC;AAC5G,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EAGd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,aAAa,CAAC;IACvB,6EAA6E;IAC7E,KAAK,EAAE,eAAe,CAAC;IACvB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,qBAAa,QAAQ;;gBAOP,IAAI,EAAE,eAAe;IAQ3B,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAwLxF"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Safe executor (PRD §23, §24, §25, §26, §29).
3
+ *
4
+ * freshness → preflight (visibility, enabled, geometry, occlusion) →
5
+ * typed execution → bounded settle → fresh observation → verification
6
+ *
7
+ * Failures are classified, never retried blindly, and every step records
8
+ * enough evidence for the recovery ladder to choose a strategy.
9
+ */
10
+ import { RuntimeError, failureRecord, mayHaveUnknownEffect, describeAction } from "@mlola/browser-protocol";
11
+ import { classifyError } from "@mlola/browser-recovery";
12
+ import { verifyStep } from "./verifier.js";
13
+ export class Executor {
14
+ #backend;
15
+ #events;
16
+ #artifacts;
17
+ #sessionId;
18
+ #runId;
19
+ constructor(opts) {
20
+ this.#backend = opts.backend;
21
+ this.#events = opts.events;
22
+ this.#artifacts = opts.artifacts;
23
+ this.#sessionId = opts.sessionId;
24
+ this.#runId = opts.runId;
25
+ }
26
+ async execute(decided, before) {
27
+ const action = decided.action;
28
+ // 1. Freshness + target validation (PRD §23, §24).
29
+ const preflight = await this.#backend.preflight(this.#sessionId, action);
30
+ if (!preflight.ok) {
31
+ const err = new RuntimeError(preflight.code ?? "TARGET_INVALID", preflight.detail ?? "preflight failed", {
32
+ evidence: preflight.evidence ?? {},
33
+ retryable: true,
34
+ });
35
+ this.#events.emit("ACTION_FAILED", { stepId: decided.stepId, action: describeAction(action), failure: failureRecord(err) });
36
+ return this.#failure(err, before, decided, preflight.evidence?.["snapshot"]);
37
+ }
38
+ // 2. Execute the typed action.
39
+ let outcome;
40
+ try {
41
+ if (action.op === "UPLOAD") {
42
+ this.#events.emit("UPLOAD_STARTED", {
43
+ artifactId: action.artifactId,
44
+ nodeId: action.ref.nodeId,
45
+ mechanism: action.mechanism,
46
+ });
47
+ }
48
+ outcome = await this.#backend.execute(this.#sessionId, action);
49
+ }
50
+ catch (err) {
51
+ const classified = classifyError(err, { unknownEffect: mayHaveUnknownEffect(action) });
52
+ const runtimeError = new RuntimeError(classified.code, classified.detail, {
53
+ cause: err,
54
+ unknownEffect: classified.unknownEffect,
55
+ });
56
+ this.#events.emit("ACTION_FAILED", { stepId: decided.stepId, action: describeAction(action), failure: failureRecord(runtimeError) });
57
+ if (action.op === "UPLOAD") {
58
+ this.#events.emit("UPLOAD_FAILED", { artifactId: action.artifactId, reason: classified.detail });
59
+ }
60
+ return this.#failure(runtimeError, before, decided);
61
+ }
62
+ // 3. Register a downloaded file as an artifact (PRD §35).
63
+ let artifact;
64
+ if (outcome.downloadedFile) {
65
+ const file = outcome.downloadedFile;
66
+ if (!file.completed || file.failure) {
67
+ this.#events.emit("DOWNLOAD_FAILED", { reason: file.failure ?? "download did not complete" });
68
+ }
69
+ else {
70
+ try {
71
+ artifact = await this.#artifacts.add({
72
+ filePath: file.path,
73
+ source: "download",
74
+ ...(file.suggestedName !== undefined ? { name: file.suggestedName } : {}),
75
+ ...(file.url !== undefined ? { sourceUrl: file.url } : {}),
76
+ });
77
+ const verification = await this.#artifacts.verify(artifact.id);
78
+ this.#events.emit("DOWNLOAD_COMPLETED", {
79
+ artifact: artifactSummary(artifact),
80
+ path: artifact.localPath,
81
+ latencyMs: outcome.latencyMs,
82
+ });
83
+ this.#events.emit("ARTIFACT_CREATED", { artifact: artifactSummary(artifact) });
84
+ if (verification.ok)
85
+ this.#events.emit("ARTIFACT_VERIFIED", { artifactId: artifact.id, detail: verification.detail });
86
+ }
87
+ catch (err) {
88
+ this.#events.emit("DOWNLOAD_FAILED", { reason: `failed to register artifact: ${String(err)}` });
89
+ }
90
+ }
91
+ }
92
+ // 4. Bounded settle + fresh observation; reused by the next step.
93
+ let after;
94
+ try {
95
+ after = await this.#backend.observe(this.#sessionId);
96
+ }
97
+ catch (err) {
98
+ const classified = classifyError(err, { unknownEffect: true });
99
+ const runtimeError = new RuntimeError(classified.code, classified.detail, {
100
+ cause: err,
101
+ unknownEffect: true,
102
+ });
103
+ return this.#failure(runtimeError, before, decided, undefined, outcome);
104
+ }
105
+ // 5. Deterministic verification.
106
+ const uploadEvidence = action.op === "UPLOAD" ? this.#uploadEvidence(action, after) : undefined;
107
+ const verification = verifyStep({
108
+ action,
109
+ before,
110
+ after,
111
+ outcome,
112
+ ...(artifact ? { artifact: artifactSummary(artifact) } : {}),
113
+ artifacts: this.#artifacts.summaries(),
114
+ ...(uploadEvidence !== undefined ? { uploadEvidence } : {}),
115
+ });
116
+ this.#events.emit("ACTION_EXECUTED", {
117
+ stepId: decided.stepId,
118
+ action: describeAction(action),
119
+ latencyMs: outcome.latencyMs,
120
+ ...(outcome.detail !== undefined ? { detail: outcome.detail } : {}),
121
+ ...(outcome.unknownEffect ? { unknownEffect: true } : {}),
122
+ });
123
+ if (action.op === "UPLOAD") {
124
+ if (verification.status === "verified") {
125
+ this.#events.emit("UPLOAD_COMPLETED", {
126
+ artifactId: action.artifactId,
127
+ evidence: uploadEvidence ?? verification.evidence.map((e) => e.detail).join("; "),
128
+ });
129
+ }
130
+ else {
131
+ this.#events.emit("UPLOAD_FAILED", {
132
+ artifactId: action.artifactId,
133
+ reason: verification.evidence.map((e) => e.detail).join("; "),
134
+ });
135
+ }
136
+ }
137
+ this.#events.emit("ACTION_VERIFIED", { stepId: decided.stepId, verification });
138
+ if (verification.noEffect) {
139
+ this.#events.emit("ACTION_NO_EFFECT", {
140
+ stepId: decided.stepId,
141
+ action: describeAction(action),
142
+ reason: verification.evidence.map((e) => e.detail).join("; "),
143
+ });
144
+ }
145
+ const ok = verification.status !== "refuted" && !outcome.unknownEffect;
146
+ return {
147
+ ok,
148
+ outcome,
149
+ after,
150
+ verification,
151
+ ...(artifact ? { artifact } : {}),
152
+ };
153
+ }
154
+ #uploadEvidence(action, after) {
155
+ const artifact = this.#artifacts.get(action.artifactId);
156
+ if (!artifact)
157
+ return undefined;
158
+ const name = artifact.name;
159
+ const stem = name.replace(/\.[^.]+$/, "");
160
+ const haystack = `${after.textSummary}\n${after.nodes.map((n) => `${n.label} ${n.value ?? ""}`).join("\n")}`;
161
+ if (name.length > 3 && haystack.toLowerCase().includes(name.toLowerCase())) {
162
+ return `file name "${name}" appears on the page`;
163
+ }
164
+ if (stem.length > 4 && haystack.toLowerCase().includes(stem.toLowerCase())) {
165
+ return `file name stem "${stem}" appears on the page`;
166
+ }
167
+ return undefined;
168
+ }
169
+ async #failure(error, before, decided, afterOverride, outcome) {
170
+ let after = afterOverride;
171
+ if (!after) {
172
+ try {
173
+ after = await this.#backend.observe(this.#sessionId);
174
+ }
175
+ catch {
176
+ after = before;
177
+ }
178
+ }
179
+ const verification = {
180
+ status: "unverified",
181
+ evidence: [
182
+ { kind: "runtime_event", ok: false, detail: error.message, at: Date.now() },
183
+ ],
184
+ };
185
+ return {
186
+ ok: false,
187
+ outcome: outcome ?? {
188
+ ok: false,
189
+ effect: "unknown",
190
+ latencyMs: 0,
191
+ ...(error.unknownEffect ? { unknownEffect: true } : {}),
192
+ },
193
+ after,
194
+ verification: verification,
195
+ failure: error,
196
+ // rethrow-free: the orchestrator decides the ladder
197
+ };
198
+ }
199
+ }
200
+ const artifactSummary = (record) => ({
201
+ id: record.id,
202
+ name: record.name,
203
+ mimeType: record.mimeType,
204
+ ...(record.documentType ? { documentType: record.documentType } : {}),
205
+ source: record.source,
206
+ verified: record.verified,
207
+ ...(record.sizeBytes !== undefined ? { sizeBytes: record.sizeBytes } : {}),
208
+ });
209
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Strong-model decision fallback (PRD §44).
3
+ *
4
+ * When the fast path cannot produce a valid decision, the planner role is asked
5
+ * to choose one operation (and target) from the *same* runtime-built action
6
+ * space. The answer is validated exactly like a fast-path answer: the model
7
+ * still never produces a selector, a coordinate or code.
8
+ */
9
+ import { type DecisionProvider, type PlannerProvider } from "@mlola/browser-protocol";
10
+ export interface FallbackDecisionProviderOptions {
11
+ planner: PlannerProvider;
12
+ /** Human-readable reason shown to the model. */
13
+ reason?: string;
14
+ }
15
+ export declare const createFallbackDecisionProvider: (planner: PlannerProvider, opts?: FallbackDecisionProviderOptions | {
16
+ planner: PlannerProvider;
17
+ reason?: string;
18
+ }) => DecisionProvider;
19
+ //# sourceMappingURL=fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAyD,KAAK,gBAAgB,EAA8B,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEzK,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,eAAe,CAAC;IACzB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,8BAA8B,GACzC,SAAS,eAAe,EACxB,OAAM,+BAA+B,GAAG;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAgB,KAClG,gBAyBD,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Strong-model decision fallback (PRD §44).
3
+ *
4
+ * When the fast path cannot produce a valid decision, the planner role is asked
5
+ * to choose one operation (and target) from the *same* runtime-built action
6
+ * space. The answer is validated exactly like a fast-path answer: the model
7
+ * still never produces a selector, a coordinate or code.
8
+ */
9
+ import { RuntimeError } from "@mlola/browser-protocol";
10
+ export const createFallbackDecisionProvider = (planner, opts = { planner }) => ({
11
+ name: `${planner.name}:fallback`,
12
+ async decide(input) {
13
+ if (!planner.chooseAction) {
14
+ throw new RuntimeError("PROVIDER_FAILURE", "planner provider does not support choosing an action", {
15
+ retryable: false,
16
+ });
17
+ }
18
+ const fallbackInput = {
19
+ ...input,
20
+ reason: opts.reason ?? input.failure ?? "fast path unavailable",
21
+ };
22
+ const chosen = await planner.chooseAction(fallbackInput);
23
+ return {
24
+ operation: chosen.operation,
25
+ operationProbabilities: {},
26
+ operationConfidence: 0,
27
+ ...(chosen.target !== undefined ? { target: chosen.target } : {}),
28
+ latencyMs: chosen.latencyMs,
29
+ provider: chosen.provider,
30
+ ...(chosen.model !== undefined ? { model: chosen.model } : {}),
31
+ ...(chosen.usage !== undefined ? { usage: chosen.usage } : {}),
32
+ ...(chosen.raw !== undefined ? { raw: chosen.raw } : {}),
33
+ };
34
+ },
35
+ });
36
+ //# sourceMappingURL=fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../src/fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAoH,MAAM,yBAAyB,CAAC;AAQzK,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,OAAwB,EACxB,OAAwF,EAAE,OAAO,EAAE,EACjF,EAAE,CAAC,CAAC;IACtB,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,WAAW;IAChC,KAAK,CAAC,MAAM,CAAC,KAAoB;QAC/B,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,sDAAsD,EAAE;gBACjG,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,aAAa,GAA0B;YAC3C,GAAG,KAAK;YACR,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,uBAAuB;SAChE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACzD,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,sBAAsB,EAAE,EAAE;YAC1B,mBAAmB,EAAE,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from "./action-space.ts";
2
+ export * from "./decision-validation.ts";
3
+ export * from "./budget.ts";
4
+ export * from "./executor.ts";
5
+ export * from "./text.ts";
6
+ export * from "./verifier.ts";
7
+ export * from "./state.ts";
8
+ export * from "./fallback.ts";
9
+ export * from "./orchestrator.ts";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export * from "./action-space.js";
2
+ export * from "./decision-validation.js";
3
+ export * from "./budget.js";
4
+ export * from "./executor.js";
5
+ export * from "./text.js";
6
+ export * from "./verifier.js";
7
+ export * from "./state.js";
8
+ export * from "./fallback.js";
9
+ export * from "./orchestrator.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Task orchestrator (PRD §8.1).
3
+ *
4
+ * Owns the run lifecycle: observation → action space → decision → policy →
5
+ * execution → verification → recovery, plus planning, memory, budgets, human
6
+ * intervention, artifacts and the event log.
7
+ *
8
+ * The loop is deliberately boring: every step is observable, every effect is
9
+ * verified, and no model has direct browser authority.
10
+ */
11
+ import { type ArtifactSummary, type CostRates, type DecisionProvider, type PlannerProvider, type PolicyConfig, type ProviderRole, type RunEvent, type RunResult, type RunStatus, type TaskSpec, type TextProvider, type VisionProvider } from "@mlola/browser-protocol";
12
+ import { ApprovalBroker } from "@mlola/browser-policy";
13
+ import { type HumanHelpHost } from "@mlola/browser-takeover";
14
+ import type { BrowserBackend } from "@mlola/browser-backend";
15
+ import { type ValidationOptions } from "./decision-validation.ts";
16
+ export interface OrchestratorProviders {
17
+ decision: DecisionProvider;
18
+ /** Strong-model fallback for decisions (planner role). */
19
+ fallbackDecision?: DecisionProvider;
20
+ text?: TextProvider;
21
+ planner?: PlannerProvider;
22
+ vision?: VisionProvider;
23
+ }
24
+ export interface OrchestratorOptions {
25
+ backend: BrowserBackend;
26
+ providers: OrchestratorProviders;
27
+ humanHelp?: HumanHelpHost;
28
+ approvals?: ApprovalBroker;
29
+ policy?: Partial<PolicyConfig>;
30
+ home?: string;
31
+ validation?: ValidationOptions;
32
+ costRates?: Partial<Record<ProviderRole, CostRates>>;
33
+ /** Screenshot policy (PRD §43). Default: off. */
34
+ screenshot?: "off" | "on-failure" | "always";
35
+ onEvent?: (event: RunEvent) => void;
36
+ now?: () => number;
37
+ }
38
+ export declare class TaskOrchestrator {
39
+ #private;
40
+ constructor(opts: OrchestratorOptions);
41
+ get status(): RunStatus;
42
+ get runId(): string;
43
+ get events(): readonly RunEvent[];
44
+ get artifacts(): readonly ArtifactSummary[];
45
+ pause(reason?: string): void;
46
+ resume(reason?: string): void;
47
+ cancel(reason?: string): void;
48
+ run(task: TaskSpec): Promise<RunResult>;
49
+ }
50
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAgBL,KAAK,eAAe,EAGpB,KAAK,SAAS,EAGd,KAAK,gBAAgB,EAIrB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,SAAS,EAEd,KAAK,QAAQ,EACb,KAAK,YAAY,EAGjB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,cAAc,EAMf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAA6C,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAUxG,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,wBAAwB,CAAC;AAE7E,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAOpF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IACrD,iDAAiD;IACjD,UAAU,CAAC,EAAE,KAAK,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAaD,qBAAa,gBAAgB;;gBA+Bf,IAAI,EAAE,mBAAmB;IAqBrC,IAAI,MAAM,IAAI,SAAS,CAEtB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,MAAM,IAAI,SAAS,QAAQ,EAAE,CAEhC;IAED,IAAI,SAAS,IAAI,SAAS,eAAe,EAAE,CAE1C;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAM5B,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAO7B,MAAM,CAAC,MAAM,SAAsB,GAAG,IAAI;IAMpC,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;CAoqC9C"}