cairn-engine 1.0.0 → 1.2.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.
package/README.md CHANGED
@@ -55,6 +55,14 @@ Every layer is replaceable: bring your own `Driver` (e.g. Playwright), `Critic`,
55
55
  assertions / `actions` for what doesn't fit the built-ins. Nothing forces your product
56
56
  through only what we decided.
57
57
 
58
+ **Browser or extension (no Node)?** `runScenario` and the default Chrome DevTools MCP driver
59
+ need Node. Import the browser-safe core from `cairn-engine/browser` and compose `runHarness`
60
+ with your own `Driver` (e.g. one over `chrome.debugger`) plus a fetch-based `LlmClient`:
61
+
62
+ ```ts
63
+ import { runHarness, StaticPlanner, AssertionCritic, AnthropicLlmClient } from "cairn-engine/browser";
64
+ ```
65
+
58
66
  No API key needed if you have **Claude Code** installed (cairn shells out to it); set
59
67
  `ANTHROPIC_API_KEY` to use the Anthropic API instead.
60
68
 
@@ -2,7 +2,5 @@
2
2
  import type { ContextProvider } from "../../core/ports.js";
3
3
  import type { Context } from "../../core/types.js";
4
4
  export declare class InlineContextProvider implements ContextProvider {
5
- private readonly baseUrl?;
6
- constructor(baseUrl?: string | undefined);
7
5
  provide(task: string): Promise<Context>;
8
6
  }
@@ -1,10 +1,6 @@
1
1
  export class InlineContextProvider {
2
- baseUrl;
3
- constructor(baseUrl) {
4
- this.baseUrl = baseUrl;
5
- }
6
2
  async provide(task) {
7
- return { intent: task, baseUrl: this.baseUrl };
3
+ return { intent: task };
8
4
  }
9
5
  }
10
6
  //# sourceMappingURL=inline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"inline.js","sourceRoot":"","sources":["../../../src/adapters/context/inline.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAG,CAAC;IAEjD,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;CACF"}
1
+ {"version":3,"file":"inline.js","sourceRoot":"","sources":["../../../src/adapters/context/inline.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,qBAAqB;IAChC,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
1
  /** Deterministic Critic for the replay path — checks assertions against evidence, no LLM (invariant #4). */
2
- import type { Critic } from "../../core/ports.js";
3
- import type { Assertion, AssertionResult, Evidence, Verdict } from "../../core/types.js";
2
+ import type { AssertionHandler, Critic } from "../../core/ports.js";
3
+ import type { Assertion, AssertionResult, Context, Evidence, Verdict } from "../../core/types.js";
4
4
  /** A product-defined check for a `{ kind: "custom", name }` assertion — the host decides what success means. */
5
5
  export type CustomCheck = (params: Record<string, unknown>, evidence: Evidence) => boolean | {
6
6
  passed: boolean;
@@ -10,12 +10,26 @@ export type CustomCheck = (params: Record<string, unknown>, evidence: Evidence)
10
10
  detail?: string;
11
11
  }>;
12
12
  export type CustomChecks = Record<string, CustomCheck>;
13
- /** Resolve any assertion — a registered `custom` handler, else the built-in mechanical check. */
14
- export declare function resolveAssertion(assertion: Assertion, evidence: Evidence, custom?: CustomChecks): Promise<AssertionResult>;
15
13
  /** Evaluate one mechanical assertion. `expect` is not mechanical — returns unsupported (LlmCritic handles it). */
16
14
  export declare function checkAssertion(assertion: Assertion, evidence: Evidence): AssertionResult;
17
- export declare class AssertionCritic implements Critic {
15
+ /** Built-in mechanical checks every kind except product `custom` (`expect` yields its LlmCritic hint). */
16
+ export declare class MechanicalAssertionHandler implements AssertionHandler {
17
+ supports(assertion: Assertion): boolean;
18
+ judge(assertion: Assertion, evidence: Evidence): AssertionResult;
19
+ }
20
+ /** Product-defined `{ kind: "custom", name }` checks via a name→check registry. */
21
+ export declare class CustomAssertionHandler implements AssertionHandler {
18
22
  private readonly custom;
23
+ constructor(custom?: CustomChecks);
24
+ supports(assertion: Assertion): boolean;
25
+ judge(assertion: Assertion, evidence: Evidence): Promise<AssertionResult>;
26
+ }
27
+ /** Route one assertion to the first handler that supports it (mirror of the Execute-stage step dispatch). */
28
+ export declare function judgeAssertion(handlers: AssertionHandler[], assertion: Assertion, evidence: Evidence, ctx?: Context): Promise<AssertionResult>;
29
+ /** Resolve any assertion — a registered `custom` handler, else the built-in mechanical check. */
30
+ export declare function resolveAssertion(assertion: Assertion, evidence: Evidence, custom?: CustomChecks): Promise<AssertionResult>;
31
+ export declare class AssertionCritic implements Critic {
32
+ private readonly handlers;
19
33
  /** @param custom product-defined checks for `custom` assertions, keyed by name. */
20
34
  constructor(custom?: CustomChecks);
21
35
  judge(evidence: Evidence, assertions: Assertion[]): Promise<Verdict>;
@@ -1,14 +1,3 @@
1
- /** Resolve any assertion — a registered `custom` handler, else the built-in mechanical check. */
2
- export async function resolveAssertion(assertion, evidence, custom = {}) {
3
- if (assertion.kind === "custom") {
4
- const handler = custom[assertion.name];
5
- if (!handler)
6
- return { assertion, passed: false, detail: `no custom check registered for "${assertion.name}"` };
7
- const r = await handler(assertion.params ?? {}, evidence);
8
- return typeof r === "boolean" ? { assertion, passed: r } : { assertion, passed: r.passed, detail: r.detail };
9
- }
10
- return checkAssertion(assertion, evidence);
11
- }
12
1
  /** Requests whose failure is noise, not a regression — excluded from `no-failed-requests`. */
13
2
  function isBenignRequest(url) {
14
3
  return /\/favicon\.ico(\?|$)/i.test(url) || /\/robots\.txt(\?|$)/i.test(url);
@@ -52,14 +41,53 @@ export function checkAssertion(assertion, evidence) {
52
41
  return { assertion, passed: false, detail: `custom check "${assertion.name}" needs a registered handler` };
53
42
  }
54
43
  }
55
- export class AssertionCritic {
44
+ /** Built-in mechanical checks — every kind except product `custom` (`expect` yields its LlmCritic hint). */
45
+ export class MechanicalAssertionHandler {
46
+ supports(assertion) {
47
+ return assertion.kind !== "custom";
48
+ }
49
+ judge(assertion, evidence) {
50
+ return checkAssertion(assertion, evidence);
51
+ }
52
+ }
53
+ /** Product-defined `{ kind: "custom", name }` checks via a name→check registry. */
54
+ export class CustomAssertionHandler {
56
55
  custom;
57
- /** @param custom product-defined checks for `custom` assertions, keyed by name. */
58
56
  constructor(custom = {}) {
59
57
  this.custom = custom;
60
58
  }
59
+ supports(assertion) {
60
+ return assertion.kind === "custom";
61
+ }
62
+ async judge(assertion, evidence) {
63
+ if (assertion.kind !== "custom")
64
+ throw new Error(`custom handler received "${assertion.kind}" assertion`);
65
+ const check = this.custom[assertion.name];
66
+ if (!check)
67
+ return { assertion, passed: false, detail: `no custom check registered for "${assertion.name}"` };
68
+ const r = await check(assertion.params ?? {}, evidence);
69
+ return typeof r === "boolean" ? { assertion, passed: r } : { assertion, passed: r.passed, detail: r.detail };
70
+ }
71
+ }
72
+ /** Route one assertion to the first handler that supports it (mirror of the Execute-stage step dispatch). */
73
+ export async function judgeAssertion(handlers, assertion, evidence, ctx) {
74
+ const handler = handlers.find((h) => h.supports(assertion));
75
+ if (!handler)
76
+ return { assertion, passed: false, detail: `no critic handles "${assertion.kind}"` };
77
+ return handler.judge(assertion, evidence, ctx);
78
+ }
79
+ /** Resolve any assertion — a registered `custom` handler, else the built-in mechanical check. */
80
+ export function resolveAssertion(assertion, evidence, custom = {}) {
81
+ return judgeAssertion([new MechanicalAssertionHandler(), new CustomAssertionHandler(custom)], assertion, evidence);
82
+ }
83
+ export class AssertionCritic {
84
+ handlers;
85
+ /** @param custom product-defined checks for `custom` assertions, keyed by name. */
86
+ constructor(custom = {}) {
87
+ this.handlers = [new MechanicalAssertionHandler(), new CustomAssertionHandler(custom)];
88
+ }
61
89
  async judge(evidence, assertions) {
62
- const results = await Promise.all(assertions.map((a) => resolveAssertion(a, evidence, this.custom)));
90
+ const results = await Promise.all(assertions.map((a) => judgeAssertion(this.handlers, a, evidence)));
63
91
  return { passed: results.every((r) => r.passed), results };
64
92
  }
65
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../../src/adapters/critics/assertion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../../src/adapters/critics/assertion.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,17 @@
1
1
  import type { CustomChecks } from "./assertion.js";
2
- import type { Critic, LlmClient } from "../../core/ports.js";
3
- import type { Assertion, Evidence, Verdict } from "../../core/types.js";
2
+ import type { AssertionHandler, Critic, LlmClient } from "../../core/ports.js";
3
+ import type { Assertion, AssertionResult, Context, Evidence, Verdict } from "../../core/types.js";
4
4
  /** Compact, judge-friendly rendering of the three evidence layers. */
5
5
  export declare function summarizeEvidence(evidence: Evidence): string;
6
- export declare class LlmCritic implements Critic {
6
+ /** Judges natural-language `expect` criteria with an LLM, grounded in the evidence and task intent. */
7
+ export declare class ExpectAssertionHandler implements AssertionHandler {
7
8
  private readonly llm;
8
- private readonly custom;
9
+ constructor(llm: LlmClient);
10
+ supports(assertion: Assertion): boolean;
11
+ judge(assertion: Assertion, evidence: Evidence, ctx?: Context): Promise<AssertionResult>;
12
+ }
13
+ export declare class LlmCritic implements Critic {
14
+ private readonly handlers;
9
15
  constructor(llm: LlmClient, custom?: CustomChecks);
10
- private judgeExpect;
11
- judge(evidence: Evidence, assertions: Assertion[]): Promise<Verdict>;
16
+ judge(evidence: Evidence, assertions: Assertion[], ctx?: Context): Promise<Verdict>;
12
17
  }
@@ -2,9 +2,10 @@
2
2
  * Critic that judges natural-language `expect` criteria with an LLM and delegates mechanical
3
3
  * assertions to the deterministic checker. The LLM runs ONLY for `expect`, so a scenario with
4
4
  * none makes zero LLM calls and stays deterministic (invariant #4). Judgment is grounded in the
5
- * three-layer evidence (design §6), behind the LlmClient seam (invariant #5).
5
+ * three-layer evidence (design §6) and, when a ContextProvider supplied one, the task intent
6
+ * behind the LlmClient seam (invariant #5).
6
7
  */
7
- import { resolveAssertion } from "./assertion.js";
8
+ import { CustomAssertionHandler, MechanicalAssertionHandler, judgeAssertion } from "./assertion.js";
8
9
  const SYSTEM = "You are a QA critic. Given observed evidence from a browser run and a success " +
9
10
  "criterion, decide whether the criterion is satisfied. Judge only from the evidence; " +
10
11
  'do not assume. Respond with strict JSON, no prose, no code fences: {"passed":true|false,"detail":"<short reason>"}.';
@@ -35,22 +36,30 @@ function parseVerdict(text) {
35
36
  const obj = JSON.parse(s.slice(start, end + 1));
36
37
  return { passed: obj.passed === true, detail: typeof obj.detail === "string" ? obj.detail : undefined };
37
38
  }
38
- export class LlmCritic {
39
+ /** Judges natural-language `expect` criteria with an LLM, grounded in the evidence and task intent. */
40
+ export class ExpectAssertionHandler {
39
41
  llm;
40
- custom;
41
- constructor(llm, custom = {}) {
42
+ constructor(llm) {
42
43
  this.llm = llm;
43
- this.custom = custom;
44
44
  }
45
- async judgeExpect(criterion, evidence, assertion) {
46
- const prompt = [
47
- `Success criterion: ${criterion}`,
45
+ supports(assertion) {
46
+ return assertion.kind === "expect";
47
+ }
48
+ async judge(assertion, evidence, ctx) {
49
+ if (assertion.kind !== "expect")
50
+ throw new Error(`expect handler received "${assertion.kind}" assertion`);
51
+ const lines = [
52
+ `Success criterion: ${assertion.criterion}`,
48
53
  ``,
49
54
  `Evidence:`,
50
55
  summarizeEvidence(evidence),
51
56
  ``,
52
57
  `Is the criterion satisfied? Respond with JSON only.`,
53
- ].join("\n");
58
+ ];
59
+ // Ground the judgment in the run's intent when a ContextProvider supplied one.
60
+ if (ctx?.intent)
61
+ lines.unshift(`Task intent: ${ctx.intent}`, ``);
62
+ const prompt = lines.join("\n");
54
63
  try {
55
64
  const reply = await this.llm.complete(prompt, { system: SYSTEM });
56
65
  const v = parseVerdict(reply);
@@ -60,10 +69,20 @@ export class LlmCritic {
60
69
  return { assertion, passed: false, detail: `LLM judgment failed: ${err instanceof Error ? err.message : String(err)}` };
61
70
  }
62
71
  }
63
- async judge(evidence, assertions) {
64
- const results = await Promise.all(assertions.map((a) => a.kind === "expect"
65
- ? this.judgeExpect(a.criterion, evidence, a)
66
- : resolveAssertion(a, evidence, this.custom)));
72
+ }
73
+ export class LlmCritic {
74
+ handlers;
75
+ constructor(llm, custom = {}) {
76
+ // `expect` → LLM (first, so it wins); everything else falls through to the same
77
+ // mechanical/custom handlers AssertionCritic uses. The two critics differ only here.
78
+ this.handlers = [
79
+ new ExpectAssertionHandler(llm),
80
+ new MechanicalAssertionHandler(),
81
+ new CustomAssertionHandler(custom),
82
+ ];
83
+ }
84
+ async judge(evidence, assertions, ctx) {
85
+ const results = await Promise.all(assertions.map((a) => judgeAssertion(this.handlers, a, evidence, ctx)));
67
86
  return { passed: results.every((r) => r.passed), results };
68
87
  }
69
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/adapters/critics/llm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/adapters/critics/llm.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,14 @@ export declare class ChromeDevToolsDriver implements Driver {
26
26
  goto(url: string): Promise<void>;
27
27
  click(target: Target): Promise<void>;
28
28
  doubleClick(target: Target): Promise<void>;
29
+ /**
30
+ * Run an interactive MCP action, accepting any JS dialog it triggers. A `confirm`/`alert`/`prompt`
31
+ * opens a dialog the MCP can't interact through (no per-action hook) — the call errors and the run
32
+ * would wedge. The action's own handler already fired, so accept the dialog and treat it as done
33
+ * (#17). Generic over the action, so a dialog from a click, a form submit (Enter), a select, etc.
34
+ * is handled the same way — no per-verb special-casing.
35
+ */
36
+ private callAccepting;
29
37
  hover(target: Target): Promise<void>;
30
38
  type(target: Target, text: string): Promise<void>;
31
39
  select(target: Target, value: string): Promise<void>;
@@ -41,6 +49,8 @@ export declare class ChromeDevToolsDriver implements Driver {
41
49
  locate(target: Target): Promise<Target>;
42
50
  private resolveUid;
43
51
  }
52
+ /** True if an MCP error means a click opened a JS dialog (confirm/alert/prompt) that now blocks. */
53
+ export declare function isOpenDialog(err: unknown): boolean;
44
54
  /** `uid=1_3 link "Learn more" …` → {role:"link", name:"Learn more"} for named rows. */
45
55
  export declare function parseElements(snapshot: string): PageElement[];
46
56
  export interface SnapshotRow {
@@ -108,30 +108,48 @@ export class ChromeDevToolsDriver {
108
108
  await this.trackPages();
109
109
  }
110
110
  async click(target) {
111
- await this.call("click", { uid: await this.resolveUid(target) });
111
+ await this.callAccepting("click", { uid: await this.resolveUid(target) });
112
112
  this.snapshotCache = undefined;
113
113
  await this.followNewTab();
114
114
  }
115
115
  async doubleClick(target) {
116
- await this.call("click", { uid: await this.resolveUid(target), dblClick: true });
116
+ await this.callAccepting("click", { uid: await this.resolveUid(target), dblClick: true });
117
117
  this.snapshotCache = undefined;
118
118
  await this.followNewTab();
119
119
  }
120
+ /**
121
+ * Run an interactive MCP action, accepting any JS dialog it triggers. A `confirm`/`alert`/`prompt`
122
+ * opens a dialog the MCP can't interact through (no per-action hook) — the call errors and the run
123
+ * would wedge. The action's own handler already fired, so accept the dialog and treat it as done
124
+ * (#17). Generic over the action, so a dialog from a click, a form submit (Enter), a select, etc.
125
+ * is handled the same way — no per-verb special-casing.
126
+ */
127
+ async callAccepting(name, args) {
128
+ try {
129
+ await this.call(name, args);
130
+ }
131
+ catch (err) {
132
+ if (!isOpenDialog(err))
133
+ throw err;
134
+ await this.call("handle_dialog", { action: "accept" });
135
+ }
136
+ }
120
137
  async hover(target) {
121
138
  await this.call("hover", { uid: await this.resolveUid(target) });
122
139
  this.snapshotCache = undefined;
123
140
  }
124
141
  async type(target, text) {
125
- await this.call("fill", { uid: await this.resolveUid(target), value: text });
142
+ await this.callAccepting("fill", { uid: await this.resolveUid(target), value: text });
126
143
  this.snapshotCache = undefined;
127
144
  }
128
145
  async select(target, value) {
129
146
  // chrome-devtools-mcp's `fill` selects an option when the element is a <select>.
130
- await this.call("fill", { uid: await this.resolveUid(target), value });
147
+ await this.callAccepting("fill", { uid: await this.resolveUid(target), value });
131
148
  this.snapshotCache = undefined;
132
149
  }
133
150
  async pressKey(key) {
134
- await this.call("press_key", { key });
151
+ // a form submit (Enter) can trigger a confirm() — handle it like any other action.
152
+ await this.callAccepting("press_key", { key });
135
153
  this.snapshotCache = undefined;
136
154
  }
137
155
  async scroll(direction = "down") {
@@ -232,6 +250,11 @@ export class ChromeDevToolsDriver {
232
250
  }
233
251
  }
234
252
  // --- parsers for chrome-devtools-mcp's text output -------------------------------
253
+ /** True if an MCP error means a click opened a JS dialog (confirm/alert/prompt) that now blocks. */
254
+ export function isOpenDialog(err) {
255
+ const m = err instanceof Error ? err.message : String(err);
256
+ return /open dialog/i.test(m) || /handle_dialog/i.test(m);
257
+ }
235
258
  /** `uid=1_3 link "Learn more" …` → {role:"link", name:"Learn more"} for named rows. */
236
259
  export function parseElements(snapshot) {
237
260
  const out = [];
@@ -1 +1 @@
1
- {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../src/adapters/drivers/chrome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../src/adapters/drivers/chrome.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAWjF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEnF,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,0FAA0F;AAC1F,iGAAiG;AACjG,wFAAwF;AACxF,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,4BAA4B,EAAE,YAAY,CAAC,CAAC;AAWpE,MAAM,OAAO,oBAAoB;IAOF;IANrB,MAAM,CAAU;IAChB,SAAS,CAAwB;IACjC,UAAU,CAAU;IACpB,aAAa,CAAU,CAAC,uEAAuE;IACtF,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/C,YAA6B,OAA4B,EAAE;QAA9B,SAAI,GAAJ,IAAI,CAA0B;IAAG,CAAC;IAEvD,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC;YACH,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED,0GAA0G;IAClG,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/D,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC,gCAAgC;YAClE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED,kGAAkG;IAC1F,KAAK,CAAC,WAAW,CAAI,CAAa,EAAE,EAAU,EAAE,KAAa;QACnE,IAAI,KAAgD,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;gBACxB,CAAC;gBACD,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;oBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtF,CAAC,CAAC;aACH,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7F,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;YACzC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,WAAW;YACzC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ;SACjC,CAAC,CAAC;QACH,oFAAoF;QACpF,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YACvB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CACpB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,MAAM,EACpC,6BAA6B,CAC9B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,sCAAsC;YAC/E,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,OAAgC,EAAE;QACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CACjC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,EAC7B,OAAO,IAAI,EAAE,CACd,CAA4E,CAAC;QAC9E,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;aAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,GAAG,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACzD,6EAA6E;QAC7E,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,IAA6B;QACrE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YAClC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,IAAY;QACrC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,KAAa;QACxC,iFAAiF;QACjF,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,mFAAmF;QACnF,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAA2B,MAAM;QAC5C,MAAM,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjC,QAAQ,EAAE,8BAA8B,IAAI,8BAA8B;SAC3E,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CACjC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,EAC1E,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,EAC7B,qBAAqB,CACtB,CAA4E,CAAC;YAC9E,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9F,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,QAAQ,IAAI,WAAW,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC,CAAC,gDAAgD;QACpE,CAAC;IACH,CAAC;IAED,4GAA4G;IACpG,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;YAAE,IAAI,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,aAAa,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAyB,EAAE;QACtC,iFAAiF;QACjF,oFAAoF;QACpF,6DAA6D;QAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;QACrC,uFAAuF;QACvF,mFAAmF;QACnF,8DAA8D;QAC9D,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC5E,IAAI,UAAU,GAAG,CAAC,IAAI,KAAK,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC;oBACrD,UAAU,GAAG,KAAK,CAAC;oBACnB,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3B,CAAC;qBAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,IAAI,MAAM,EAAE,CAAC;oBAC9C,OAAO,CAAC,wDAAwD;gBAClE,CAAC;gBACD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;SACnC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEpF,OAAO;YACL,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;YAC/D,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE;SAC3E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,6DAA6D;QACtF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtC,MAAM,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,qDAAqD;IACjG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,OAAO,MAAM,CAAC,CAAC,+CAA+C;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACtF,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,MAAc;QACrC,MAAM,GAAG,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,oFAAoF;AAEpF,oGAAoG;AACpG,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,sGAAsG;AACtG,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACtD,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAmB,EAAE,MAAc;IAClE,MAAM,MAAM,GAAG,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;IAC1E,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;QAC7E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACzG,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC1B,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;IACrC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY;IAC1D,OAAO,gBAAgB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC/D,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACvD,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,UAA8B,EAAE,QAAgB;IAC3E,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,YAAY,CAAC,UAAU,CAAC,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACnC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,SAAS;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACnD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACpD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -4,5 +4,5 @@ import type { Context, Scenario } from "../../core/types.js";
4
4
  export declare class StaticPlanner implements Planner {
5
5
  private readonly scenario;
6
6
  constructor(scenario: Scenario);
7
- plan(_ctx: Context): Promise<Scenario>;
7
+ plan(ctx: Context): Promise<Scenario>;
8
8
  }
@@ -3,8 +3,10 @@ export class StaticPlanner {
3
3
  constructor(scenario) {
4
4
  this.scenario = scenario;
5
5
  }
6
- async plan(_ctx) {
7
- return this.scenario;
6
+ async plan(ctx) {
7
+ // A custom ContextProvider can relabel the run through intent; on the default
8
+ // replay path the task is scenario.name, so intent === name and this is a no-op.
9
+ return { ...this.scenario, name: ctx.intent || this.scenario.name };
8
10
  }
9
11
  }
10
12
  //# sourceMappingURL=static.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static.js","sourceRoot":"","sources":["../../../src/adapters/planners/static.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAEnD,KAAK,CAAC,IAAI,CAAC,IAAa;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../../../src/adapters/planners/static.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAEnD,KAAK,CAAC,IAAI,CAAC,GAAY;QACrB,8EAA8E;QAC9E,iFAAiF;QACjF,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Browser-safe surface of cairn-engine — the runtime-agnostic core plus the pure adapters,
3
+ * for environments without Node (a Chrome extension, a web app). Excludes the Node-only
4
+ * adapters (Chrome DevTools MCP driver, Claude CLI client, fs-based reporters / skill store)
5
+ * and `runScenario`, which statically wires them.
6
+ *
7
+ * Compose `runHarness` with your own `Driver` (e.g. a CDP/extension driver) and, for discover or
8
+ * `expect`, a fetch-based `LlmClient` (`AnthropicLlmClient`). Same core, different hands.
9
+ */
10
+ export * from "./core/types.js";
11
+ export * from "./core/ports.js";
12
+ export { runHarness } from "./core/pipeline.js";
13
+ export type { RunHarnessOptions } from "./core/pipeline.js";
14
+ export { BuiltinStepHandler, CustomStepHandler, defaultStepHandlers } from "./core/steps.js";
15
+ export { InlineContextProvider } from "./adapters/context/inline.js";
16
+ export { StaticPlanner } from "./adapters/planners/static.js";
17
+ export { AssertionCritic, checkAssertion, resolveAssertion, judgeAssertion, MechanicalAssertionHandler, CustomAssertionHandler, } from "./adapters/critics/assertion.js";
18
+ export type { CustomCheck, CustomChecks } from "./adapters/critics/assertion.js";
19
+ export { LlmCritic, ExpectAssertionHandler, summarizeEvidence } from "./adapters/critics/llm.js";
20
+ export { ConsoleReporter } from "./adapters/reporters/console.js";
21
+ export { FakeDriver } from "./adapters/drivers/fake.js";
22
+ export { SelfHealingDriver, parseHealChoice } from "./adapters/drivers/self-heal.js";
23
+ export type { Heal, SelfHealOptions } from "./adapters/drivers/self-heal.js";
24
+ export { AnthropicLlmClient } from "./adapters/llm/anthropic.js";
25
+ export { discover, parseDecision } from "./core/discover.js";
26
+ export type { DiscoverOptions, Decision } from "./core/discover.js";
27
+ export { scoreTarget, scoreScenario, weakTargets } from "./core/freeze.js";
28
+ export type { TargetScore, ScoredTarget } from "./core/freeze.js";
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Browser-safe surface of cairn-engine — the runtime-agnostic core plus the pure adapters,
3
+ * for environments without Node (a Chrome extension, a web app). Excludes the Node-only
4
+ * adapters (Chrome DevTools MCP driver, Claude CLI client, fs-based reporters / skill store)
5
+ * and `runScenario`, which statically wires them.
6
+ *
7
+ * Compose `runHarness` with your own `Driver` (e.g. a CDP/extension driver) and, for discover or
8
+ * `expect`, a fetch-based `LlmClient` (`AnthropicLlmClient`). Same core, different hands.
9
+ */
10
+ export * from "./core/types.js";
11
+ export * from "./core/ports.js";
12
+ export { runHarness } from "./core/pipeline.js";
13
+ export { BuiltinStepHandler, CustomStepHandler, defaultStepHandlers } from "./core/steps.js";
14
+ export { InlineContextProvider } from "./adapters/context/inline.js";
15
+ export { StaticPlanner } from "./adapters/planners/static.js";
16
+ export { AssertionCritic, checkAssertion, resolveAssertion, judgeAssertion, MechanicalAssertionHandler, CustomAssertionHandler, } from "./adapters/critics/assertion.js";
17
+ export { LlmCritic, ExpectAssertionHandler, summarizeEvidence } from "./adapters/critics/llm.js";
18
+ export { ConsoleReporter } from "./adapters/reporters/console.js";
19
+ export { FakeDriver } from "./adapters/drivers/fake.js";
20
+ export { SelfHealingDriver, parseHealChoice } from "./adapters/drivers/self-heal.js";
21
+ export { AnthropicLlmClient } from "./adapters/llm/anthropic.js";
22
+ export { discover, parseDecision } from "./core/discover.js";
23
+ export { scoreTarget, scoreScenario, weakTargets } from "./core/freeze.js";
24
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/cli.js CHANGED
@@ -15,6 +15,7 @@
15
15
  import { readFile, writeFile } from "node:fs/promises";
16
16
  import { runScenario, needsLlmCritic } from "./run.js";
17
17
  import { discover } from "./core/discover.js";
18
+ import { weakTargets } from "./core/freeze.js";
18
19
  import { ConsoleReporter } from "./adapters/reporters/console.js";
19
20
  import { JsonReporter } from "./adapters/reporters/json.js";
20
21
  import { ChromeDevToolsDriver } from "./adapters/drivers/chrome.js";
@@ -124,6 +125,13 @@ async function cmdDiscover(positionals, flags) {
124
125
  console.log(`\ndiscovered scenario "${scenario.name}" — ${scenario.steps.length} steps:`);
125
126
  for (const step of scenario.steps)
126
127
  console.log(` · ${JSON.stringify(step)}`);
128
+ // #14: flag weak (text-only) targets at freeze time, before a UI rename forces a self-heal.
129
+ const weak = weakTargets(scenario);
130
+ if (weak.length) {
131
+ console.log(`\n⚠ ${weak.length} weak target(s) — a UI rename may force a self-heal; strengthen up front:`);
132
+ for (const w of weak)
133
+ console.log(` · step ${w.stepIndex + 1} (${w.step.kind}): ${w.score.reason}`);
134
+ }
127
135
  const freeze = flagStr(flags, "freeze");
128
136
  if (freeze) {
129
137
  await writeFile(freeze, JSON.stringify({ name: scenario.name, scenario }, null, 2), "utf8");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Freeze-time target stability scoring (#14). A frozen target's locators decide how well replay
3
+ * survives UI change: a text-only target breaks on a rename and forces a `self-heal` (LLM re-entry
4
+ * — cost + non-determinism); a `selector` or a `role`+`index` fallback survives it. Scoring and
5
+ * warning at freeze time lets the author strengthen weak targets up front, lowering the self-heal
6
+ * trigger rate. Pure — no I/O, no LLM (invariant #4).
7
+ */
8
+ import type { Scenario, Step, Target } from "./types.js";
9
+ export interface TargetScore {
10
+ /** 0..1 estimate of how well the target survives UI change. */
11
+ score: number;
12
+ /** below the warn threshold — likely to force a self-heal later. */
13
+ weak: boolean;
14
+ reason: string;
15
+ }
16
+ /** Score how well a single frozen target survives UI change. */
17
+ export declare function scoreTarget(target: Target): TargetScore;
18
+ /** A step's target paired with its stability score. */
19
+ export interface ScoredTarget {
20
+ stepIndex: number;
21
+ step: Step;
22
+ target: Target;
23
+ score: TargetScore;
24
+ }
25
+ /** Score every located step in a scenario — caller decides what to do with the weak ones. */
26
+ export declare function scoreScenario(scenario: Scenario): ScoredTarget[];
27
+ /** The weak targets in a scenario — flag these at freeze time so the author can strengthen them. */
28
+ export declare function weakTargets(scenario: Scenario): ScoredTarget[];
@@ -0,0 +1,41 @@
1
+ const SELECTOR = 1; // CSS / test-id — most stable across UI change
2
+ const RESILIENT = 0.7; // role + structural index — survives a rename
3
+ const TEXT_ONLY = 0.3; // accessible name only — a rename breaks it
4
+ const NONE = 0; // nothing to locate by
5
+ /** Score how well a single frozen target survives UI change. */
6
+ export function scoreTarget(target) {
7
+ if (target.selector) {
8
+ return { score: SELECTOR, weak: false, reason: "selector — stable across UI change" };
9
+ }
10
+ const hasIndex = target.role !== undefined && target.index !== undefined;
11
+ if (hasIndex) {
12
+ const how = target.text ? "text + role/index fallback" : "role + structural index";
13
+ return { score: RESILIENT, weak: false, reason: how };
14
+ }
15
+ if (target.text) {
16
+ return {
17
+ score: TEXT_ONLY,
18
+ weak: true,
19
+ reason: "text-only — a rename will force a self-heal; add a role/index fallback or a selector",
20
+ };
21
+ }
22
+ return { score: NONE, weak: true, reason: "no locator" };
23
+ }
24
+ function stepTarget(step) {
25
+ return "target" in step ? step.target : undefined;
26
+ }
27
+ /** Score every located step in a scenario — caller decides what to do with the weak ones. */
28
+ export function scoreScenario(scenario) {
29
+ const out = [];
30
+ scenario.steps.forEach((step, stepIndex) => {
31
+ const target = stepTarget(step);
32
+ if (target)
33
+ out.push({ stepIndex, step, target, score: scoreTarget(target) });
34
+ });
35
+ return out;
36
+ }
37
+ /** The weak targets in a scenario — flag these at freeze time so the author can strengthen them. */
38
+ export function weakTargets(scenario) {
39
+ return scoreScenario(scenario).filter((s) => s.score.weak);
40
+ }
41
+ //# sourceMappingURL=freeze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freeze.js","sourceRoot":"","sources":["../../src/core/freeze.ts"],"names":[],"mappings":"AAiBA,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,+CAA+C;AACnE,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,8CAA8C;AACrE,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,4CAA4C;AACnE,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,uBAAuB;AAEvC,gEAAgE;AAChE,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC;IACzE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,yBAAyB,CAAC;QACnF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,sFAAsF;SAC/F,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC3D,CAAC;AAUD,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,aAAa,CAAC,QAAkB;IAC9C,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC"}
@@ -3,10 +3,8 @@
3
3
  * is injected (invariant #2); with a fixed-scenario Planner + deterministic Critic, no LLM
4
4
  * runs (invariant #4).
5
5
  */
6
- import type { Driver, Harness } from "./ports.js";
6
+ import type { CustomAction, Harness, StepHandler } from "./ports.js";
7
7
  import type { Result, StepProgress } from "./types.js";
8
- /** A product-defined interaction for a `{ kind: "custom", name }` step — composes the Driver. */
9
- export type CustomAction = (driver: Driver, params: Record<string, unknown>) => Promise<void>;
10
8
  /**
11
9
  * Seams a host (CLI, desktop app, CI) plugs into — the engine emits/accepts, the host
12
10
  * decides what to do. `onStep` for a live timeline, `captureScreenshots` for visual
@@ -17,6 +15,9 @@ export interface RunHarnessOptions {
17
15
  signal?: AbortSignal;
18
16
  onStep?: (progress: StepProgress) => void;
19
17
  captureScreenshots?: boolean;
18
+ /** Product-defined interactions for `{ kind: "custom", name }` steps, registered by name. */
20
19
  actions?: Record<string, CustomAction>;
20
+ /** Replace the Execute-stage dispatch chain entirely (advanced); defaults to built-ins + `actions`. */
21
+ stepHandlers?: StepHandler[];
21
22
  }
22
23
  export declare function runHarness(harness: Harness, task: string, opts?: RunHarnessOptions): Promise<Result>;
@@ -1,42 +1,11 @@
1
- async function executeStep(driver, step, actions) {
1
+ import { defaultStepHandlers } from "./steps.js";
2
+ /** Route one step to the first handler that supports it; record success/failure either way. */
3
+ async function executeStep(handlers, step, driver) {
2
4
  try {
3
- switch (step.kind) {
4
- case "goto":
5
- await driver.goto(step.url);
6
- break;
7
- case "click":
8
- await driver.click(step.target);
9
- break;
10
- case "doubleClick":
11
- await driver.doubleClick(step.target);
12
- break;
13
- case "hover":
14
- await driver.hover(step.target);
15
- break;
16
- case "type":
17
- await driver.type(step.target, step.text);
18
- break;
19
- case "select":
20
- await driver.select(step.target, step.value);
21
- break;
22
- case "pressKey":
23
- await driver.pressKey(step.key);
24
- break;
25
- case "scroll":
26
- await driver.scroll(step.direction);
27
- break;
28
- case "custom": {
29
- const handler = actions[step.name];
30
- if (!handler)
31
- throw new Error(`no handler registered for custom action "${step.name}"`);
32
- await handler(driver, step.params ?? {});
33
- break;
34
- }
35
- default: {
36
- const unhandled = step;
37
- throw new Error(`unhandled step kind: ${JSON.stringify(unhandled)}`);
38
- }
39
- }
5
+ const handler = handlers.find((h) => h.supports(step));
6
+ if (!handler)
7
+ throw new Error(`no step handler for kind "${step.kind}"`);
8
+ await handler.execute(step, driver);
40
9
  return { step, ok: true };
41
10
  }
42
11
  catch (err) {
@@ -45,6 +14,7 @@ async function executeStep(driver, step, actions) {
45
14
  }
46
15
  export async function runHarness(harness, task, opts = {}) {
47
16
  const { context, planner, driver, critic, reporter } = harness;
17
+ const handlers = opts.stepHandlers ?? defaultStepHandlers(opts.actions ?? {});
48
18
  const ctx = await context.provide(task);
49
19
  const scenario = await planner.plan(ctx);
50
20
  // Drive steps; stop on the first failure but still observe the resulting state.
@@ -52,7 +22,7 @@ export async function runHarness(harness, task, opts = {}) {
52
22
  try {
53
23
  for (const step of scenario.steps) {
54
24
  opts.signal?.throwIfAborted(); // cooperative cancellation between steps (host owns Stop)
55
- const result = await executeStep(driver, step, opts.actions ?? {});
25
+ const result = await executeStep(handlers, step, driver);
56
26
  actions.push(result);
57
27
  if (opts.onStep) {
58
28
  const screenshot = opts.captureScreenshots ? await driver.screenshot().catch(() => undefined) : undefined;
@@ -68,7 +38,7 @@ export async function runHarness(harness, task, opts = {}) {
68
38
  ...observed,
69
39
  execution: { ...observed.execution, actions, blocked: actions.some((a) => !a.ok) },
70
40
  };
71
- const verdict = await critic.judge(evidence, scenario.assertions);
41
+ const verdict = await critic.judge(evidence, scenario.assertions, ctx);
72
42
  const out = { scenario: scenario.name, context: ctx, evidence, verdict };
73
43
  await reporter.emit(out);
74
44
  return out;
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * The ports of the cairn engine (invariant #2: add behavior by implementing one of these,
3
3
  * never by branching inside a stage). Core depends only on these; `../adapters` implement them.
4
4
  */
5
- import type { Assertion, Context, Evidence, PageElement, Result, Scenario, SettleOptions, Target, Verdict } from "./types.js";
5
+ import type { Assertion, AssertionResult, Context, Evidence, PageElement, Result, Scenario, SettleOptions, Step, Target, Verdict } from "./types.js";
6
6
  /** Grounding from any source (NL, git diff, ticket, RAG). */
7
7
  export interface ContextProvider {
8
8
  provide(task: string): Promise<Context>;
@@ -34,6 +34,17 @@ export interface Driver {
34
34
  observe(): Promise<Evidence>;
35
35
  close(): Promise<void>;
36
36
  }
37
+ /** A product-defined interaction for a `{ kind: "custom", name }` step — composes the Driver. */
38
+ export type CustomAction = (driver: Driver, params: Record<string, unknown>) => Promise<void>;
39
+ /**
40
+ * One link in the Execute stage's dispatch chain (invariant #2): the pipeline routes each Step
41
+ * to the first handler that `supports` it, instead of branching inside the stage. Built-in kinds
42
+ * and product `custom` actions resolve through this one seam (Spring `HandlerAdapter`-style).
43
+ */
44
+ export interface StepHandler {
45
+ supports(step: Step): boolean;
46
+ execute(step: Step, driver: Driver): Promise<void>;
47
+ }
37
48
  export interface Skill {
38
49
  name: string;
39
50
  scenario: Scenario;
@@ -41,9 +52,19 @@ export interface Skill {
41
52
  export interface SkillStore {
42
53
  resolve(name: string): Promise<Skill | undefined>;
43
54
  }
44
- /** Judges evidence against assertions (mechanical, baseline, or LLM). */
55
+ /**
56
+ * One link in the Judge stage's dispatch chain (mirror of StepHandler): a Critic routes each
57
+ * Assertion to the first handler that `supports` it. Mechanical, product `custom`, and LLM
58
+ * `expect` checks compose as separate handlers — critics differ only by which they register.
59
+ * Optional `ctx` grounds LLM judgment (e.g. the task intent); deterministic handlers ignore it.
60
+ */
61
+ export interface AssertionHandler {
62
+ supports(assertion: Assertion): boolean;
63
+ judge(assertion: Assertion, evidence: Evidence, ctx?: Context): AssertionResult | Promise<AssertionResult>;
64
+ }
65
+ /** Judges evidence against assertions (mechanical, baseline, or LLM). Optional `ctx` grounds LLM judgment (e.g. the task intent); deterministic critics ignore it, so replay stays deterministic (invariant #4). */
45
66
  export interface Critic {
46
- judge(evidence: Evidence, assertions: Assertion[]): Promise<Verdict>;
67
+ judge(evidence: Evidence, assertions: Assertion[], ctx?: Context): Promise<Verdict>;
47
68
  }
48
69
  /** Emits a result anywhere — console, json, an arbitrary tracker. */
49
70
  export interface Reporter {
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Execute-stage step handlers (invariant #2). The pipeline routes each Step to the first
3
+ * handler that `supports` it (DispatcherServlet-style) — built-in kinds and product-defined
4
+ * `custom` actions resolve through the same `StepHandler` seam, so adding an action means
5
+ * registering a handler, never editing a stage. Depends only on core ports/types.
6
+ */
7
+ import type { CustomAction, Driver, StepHandler } from "./ports.js";
8
+ import type { Step } from "./types.js";
9
+ /** Handles cairn's built-in step vocabulary — every kind except product-defined `custom`. */
10
+ export declare class BuiltinStepHandler implements StepHandler {
11
+ supports(step: Step): boolean;
12
+ execute(step: Step, driver: Driver): Promise<void>;
13
+ }
14
+ /** Handles product-defined `{ kind: "custom", name }` steps via a name→action registry. */
15
+ export declare class CustomStepHandler implements StepHandler {
16
+ private readonly actions;
17
+ constructor(actions?: Record<string, CustomAction>);
18
+ supports(step: Step): boolean;
19
+ execute(step: Step, driver: Driver): Promise<void>;
20
+ }
21
+ /** The engine's default Execute-stage chain: built-ins first, then product `custom` actions. */
22
+ export declare function defaultStepHandlers(actions?: Record<string, CustomAction>): StepHandler[];
@@ -0,0 +1,99 @@
1
+ const WAIT_POLL_MS = 200;
2
+ const WAIT_TIMEOUT_MS = 10_000;
3
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
4
+ /** Handles cairn's built-in step vocabulary — every kind except product-defined `custom`. */
5
+ export class BuiltinStepHandler {
6
+ supports(step) {
7
+ return step.kind !== "custom";
8
+ }
9
+ async execute(step, driver) {
10
+ switch (step.kind) {
11
+ case "goto":
12
+ return driver.goto(step.url);
13
+ case "click":
14
+ return driver.click(step.target);
15
+ case "doubleClick":
16
+ return driver.doubleClick(step.target);
17
+ case "hover":
18
+ return driver.hover(step.target);
19
+ case "type":
20
+ return driver.type(step.target, step.text);
21
+ case "select":
22
+ return driver.select(step.target, step.value);
23
+ case "pressKey":
24
+ return driver.pressKey(step.key);
25
+ case "scroll":
26
+ return driver.scroll(step.direction);
27
+ case "waitFor":
28
+ return waitForCondition(driver, step.until, step.timeoutMs);
29
+ case "custom":
30
+ // Owned by CustomStepHandler; reaching here means a handler-ordering bug, not bad input.
31
+ throw new Error(`built-in handler received custom step "${step.name}"`);
32
+ default: {
33
+ // Exhaustiveness guard: a new Step kind that no case handles fails to compile here.
34
+ const unhandled = step;
35
+ throw new Error(`unhandled step kind: ${JSON.stringify(unhandled)}`);
36
+ }
37
+ }
38
+ }
39
+ }
40
+ /** Handles product-defined `{ kind: "custom", name }` steps via a name→action registry. */
41
+ export class CustomStepHandler {
42
+ actions;
43
+ constructor(actions = {}) {
44
+ this.actions = actions;
45
+ }
46
+ supports(step) {
47
+ return step.kind === "custom";
48
+ }
49
+ async execute(step, driver) {
50
+ if (step.kind !== "custom")
51
+ throw new Error(`custom handler received "${step.kind}" step`);
52
+ const action = this.actions[step.name];
53
+ if (!action)
54
+ throw new Error(`no handler registered for custom action "${step.name}"`);
55
+ await action(driver, step.params ?? {});
56
+ }
57
+ }
58
+ /** The engine's default Execute-stage chain: built-ins first, then product `custom` actions. */
59
+ export function defaultStepHandlers(actions = {}) {
60
+ return [new BuiltinStepHandler(), new CustomStepHandler(actions)];
61
+ }
62
+ /**
63
+ * Poll the Driver's own observation until every field of `until` holds, or throw on timeout.
64
+ * Uses only `observe()`/`snapshot()`, so any Driver works and replay stays deterministic (no LLM,
65
+ * invariant #4). This is the explicit-wait primitive the heuristic `settle()` can't express —
66
+ * e.g. "wait until /me returns 200" before the next step, instead of racing the app's readiness.
67
+ */
68
+ async function waitForCondition(driver, until, timeoutMs = WAIT_TIMEOUT_MS) {
69
+ const deadline = Date.now() + timeoutMs;
70
+ for (;;) {
71
+ if (await conditionMet(driver, until))
72
+ return;
73
+ if (Date.now() >= deadline) {
74
+ throw new Error(`waitFor timed out after ${timeoutMs}ms: ${JSON.stringify(until)}`);
75
+ }
76
+ await sleep(WAIT_POLL_MS);
77
+ }
78
+ }
79
+ async function conditionMet(driver, until) {
80
+ if (until.url !== undefined || until.requestStatus !== undefined) {
81
+ const { execution, logic } = await driver.observe();
82
+ if (until.url !== undefined && !(execution.finalUrl ?? "").includes(until.url))
83
+ return false;
84
+ if (until.requestStatus) {
85
+ const { urlIncludes, status } = until.requestStatus;
86
+ if (!logic.requests.some((r) => r.url.includes(urlIncludes) && r.status === status))
87
+ return false;
88
+ }
89
+ }
90
+ if (until.text !== undefined) {
91
+ const needle = until.text.trim().toLowerCase();
92
+ const els = await driver.snapshot();
93
+ const hit = els.some((e) => (!until.role || e.role === until.role) && e.name.toLowerCase().includes(needle));
94
+ if (!hit)
95
+ return false;
96
+ }
97
+ return true;
98
+ }
99
+ //# sourceMappingURL=steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/core/steps.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  /** Domain types for the pipeline (Context → Plan → Execute → Judge → Report). App-agnostic by invariant #1. */
2
2
  export interface Context {
3
3
  intent: string;
4
- baseUrl?: string;
5
- notes?: string[];
6
4
  }
7
5
  export type Step = {
8
6
  kind: "goto";
@@ -31,12 +29,35 @@ export type Step = {
31
29
  kind: "scroll";
32
30
  direction?: "down" | "up";
33
31
  }
32
+ /** Block until the app reaches a condition (auth ready, a request, an element) before continuing.
33
+ * Deterministic — polls the Driver's own observation, no LLM (invariant #4). */
34
+ | {
35
+ kind: "waitFor";
36
+ until: WaitUntil;
37
+ timeoutMs?: number;
38
+ }
34
39
  /** A product-defined interaction: the host registers a handler for `name`. */
35
40
  | {
36
41
  kind: "custom";
37
42
  name: string;
38
43
  params?: Record<string, unknown>;
39
44
  };
45
+ /**
46
+ * A condition a `waitFor` step blocks on. All provided fields must hold (AND). Checked against the
47
+ * Driver's `observe()`/`snapshot()` — so any Driver supports it without a new port method.
48
+ */
49
+ export interface WaitUntil {
50
+ /** the final URL includes this substring */
51
+ url?: string;
52
+ /** a captured request whose URL includes `urlIncludes` reached `status` */
53
+ requestStatus?: {
54
+ urlIncludes: string;
55
+ status: number;
56
+ };
57
+ /** an element with this accessible name is present (optionally constrained by `role`) */
58
+ text?: string;
59
+ role?: string;
60
+ }
40
61
  /**
41
62
  * Locate an element by intent, not a driver handle. A frozen target carries several
42
63
  * locators so replay survives UI change without falling back to the LLM:
package/dist/index.d.ts CHANGED
@@ -2,14 +2,15 @@
2
2
  export * from "./core/types.js";
3
3
  export * from "./core/ports.js";
4
4
  export { runHarness } from "./core/pipeline.js";
5
- export type { RunHarnessOptions, CustomAction } from "./core/pipeline.js";
5
+ export type { RunHarnessOptions } from "./core/pipeline.js";
6
+ export { BuiltinStepHandler, CustomStepHandler, defaultStepHandlers } from "./core/steps.js";
6
7
  export { runScenario, needsLlmCritic, applyHeals } from "./run.js";
7
8
  export type { RunScenarioOptions, RunScenarioResult } from "./run.js";
8
9
  export { InlineContextProvider } from "./adapters/context/inline.js";
9
10
  export { StaticPlanner } from "./adapters/planners/static.js";
10
- export { AssertionCritic, checkAssertion, resolveAssertion } from "./adapters/critics/assertion.js";
11
+ export { AssertionCritic, checkAssertion, resolveAssertion, judgeAssertion, MechanicalAssertionHandler, CustomAssertionHandler, } from "./adapters/critics/assertion.js";
11
12
  export type { CustomCheck, CustomChecks } from "./adapters/critics/assertion.js";
12
- export { LlmCritic, summarizeEvidence } from "./adapters/critics/llm.js";
13
+ export { LlmCritic, ExpectAssertionHandler, summarizeEvidence } from "./adapters/critics/llm.js";
13
14
  export { ConsoleReporter } from "./adapters/reporters/console.js";
14
15
  export { JsonReporter } from "./adapters/reporters/json.js";
15
16
  export { FakeDriver } from "./adapters/drivers/fake.js";
@@ -22,3 +23,5 @@ export { createLlmClient } from "./adapters/llm/factory.js";
22
23
  export { FileSkillStore, loadSkillFile } from "./adapters/skills/file-store.js";
23
24
  export { discover, parseDecision } from "./core/discover.js";
24
25
  export type { DiscoverOptions, Decision } from "./core/discover.js";
26
+ export { scoreTarget, scoreScenario, weakTargets } from "./core/freeze.js";
27
+ export type { TargetScore, ScoredTarget } from "./core/freeze.js";
package/dist/index.js CHANGED
@@ -2,11 +2,12 @@
2
2
  export * from "./core/types.js";
3
3
  export * from "./core/ports.js";
4
4
  export { runHarness } from "./core/pipeline.js";
5
+ export { BuiltinStepHandler, CustomStepHandler, defaultStepHandlers } from "./core/steps.js";
5
6
  export { runScenario, needsLlmCritic, applyHeals } from "./run.js";
6
7
  export { InlineContextProvider } from "./adapters/context/inline.js";
7
8
  export { StaticPlanner } from "./adapters/planners/static.js";
8
- export { AssertionCritic, checkAssertion, resolveAssertion } from "./adapters/critics/assertion.js";
9
- export { LlmCritic, summarizeEvidence } from "./adapters/critics/llm.js";
9
+ export { AssertionCritic, checkAssertion, resolveAssertion, judgeAssertion, MechanicalAssertionHandler, CustomAssertionHandler, } from "./adapters/critics/assertion.js";
10
+ export { LlmCritic, ExpectAssertionHandler, summarizeEvidence } from "./adapters/critics/llm.js";
10
11
  export { ConsoleReporter } from "./adapters/reporters/console.js";
11
12
  export { JsonReporter } from "./adapters/reporters/json.js";
12
13
  export { FakeDriver } from "./adapters/drivers/fake.js";
@@ -17,4 +18,5 @@ export { AnthropicLlmClient } from "./adapters/llm/anthropic.js";
17
18
  export { createLlmClient } from "./adapters/llm/factory.js";
18
19
  export { FileSkillStore, loadSkillFile } from "./adapters/skills/file-store.js";
19
20
  export { discover, parseDecision } from "./core/discover.js";
21
+ export { scoreTarget, scoreScenario, weakTargets } from "./core/freeze.js";
20
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEpG,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/run.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { CustomAction } from "./core/pipeline.js";
1
+ import type { CustomAction } from "./core/ports.js";
2
2
  import type { CustomChecks } from "./adapters/critics/assertion.js";
3
3
  import type { ContextProvider, Critic, Driver, LlmClient, Reporter } from "./core/ports.js";
4
4
  import type { Heal } from "./adapters/drivers/self-heal.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cairn-engine",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "An engine for self-healing E2E browser tests — discovered once by an AI, replayed deterministically.",
5
5
  "keywords": [
6
6
  "e2e",
@@ -29,7 +29,14 @@
29
29
  "cairn": "./dist/cli.js"
30
30
  },
31
31
  "exports": {
32
- ".": "./dist/index.js"
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "default": "./dist/index.js"
35
+ },
36
+ "./browser": {
37
+ "types": "./dist/browser.d.ts",
38
+ "default": "./dist/browser.js"
39
+ }
33
40
  },
34
41
  "files": [
35
42
  "dist",