cairn-engine 0.2.0 → 1.0.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 +27 -0
- package/dist/adapters/critics/assertion.d.ts +14 -0
- package/dist/adapters/critics/assertion.js +25 -2
- package/dist/adapters/critics/assertion.js.map +1 -1
- package/dist/adapters/critics/llm.d.ts +3 -1
- package/dist/adapters/critics/llm.js +5 -3
- package/dist/adapters/critics/llm.js.map +1 -1
- package/dist/adapters/drivers/chrome.d.ts +25 -4
- package/dist/adapters/drivers/chrome.js +114 -28
- package/dist/adapters/drivers/chrome.js.map +1 -1
- package/dist/adapters/drivers/fake.d.ts +3 -0
- package/dist/adapters/drivers/fake.js +11 -0
- package/dist/adapters/drivers/fake.js.map +1 -1
- package/dist/adapters/drivers/self-heal.d.ts +5 -0
- package/dist/adapters/drivers/self-heal.js +11 -1
- package/dist/adapters/drivers/self-heal.js.map +1 -1
- package/dist/adapters/llm/anthropic.d.ts +6 -0
- package/dist/adapters/llm/anthropic.js +52 -21
- package/dist/adapters/llm/anthropic.js.map +1 -1
- package/dist/core/discover.d.ts +3 -1
- package/dist/core/discover.js +114 -34
- package/dist/core/discover.js.map +1 -1
- package/dist/core/pipeline.d.ts +17 -3
- package/dist/core/pipeline.js +15 -3
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/ports.d.ts +4 -0
- package/dist/core/types.d.ts +29 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/run.d.ts +15 -1
- package/dist/run.js +6 -3
- package/dist/run.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,6 +28,33 @@ const { result } = await runScenario(scenario, { heal: true });
|
|
|
28
28
|
if (!result.verdict.passed) process.exit(1);
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
Building a UI on top? The engine exposes the seams; you bring the UI:
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
await runScenario(scenario, {
|
|
36
|
+
signal: controller.signal, // a Stop button
|
|
37
|
+
screenshots: true, // capture a PNG per step
|
|
38
|
+
onStep: (e) => render(e.index, e.step, e.ok, e.screenshot), // live timeline
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Make it yours — the engine ships defaults, your product defines the specifics:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
await runScenario(scenario, {
|
|
46
|
+
// success is whatever your product says it is
|
|
47
|
+
custom: { "cart-has": (p, ev) => ev.logic.requests.some((r) => r.url.includes(p.path) && r.status === 200) },
|
|
48
|
+
// product-specific interactions, beyond click/type/hover/select/scroll
|
|
49
|
+
actions: { "drag-slider": async (driver, p) => { /* … */ } },
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Every layer is replaceable: bring your own `Driver` (e.g. Playwright), `Critic`, `Reporter`,
|
|
54
|
+
`ContextProvider` (auth / fixtures), or `LlmClient` (any model) — and use `custom`
|
|
55
|
+
assertions / `actions` for what doesn't fit the built-ins. Nothing forces your product
|
|
56
|
+
through only what we decided.
|
|
57
|
+
|
|
31
58
|
No API key needed if you have **Claude Code** installed (cairn shells out to it); set
|
|
32
59
|
`ANTHROPIC_API_KEY` to use the Anthropic API instead.
|
|
33
60
|
|
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
/** Deterministic Critic for the replay path — checks assertions against evidence, no LLM (invariant #4). */
|
|
2
2
|
import type { Critic } from "../../core/ports.js";
|
|
3
3
|
import type { Assertion, AssertionResult, Evidence, Verdict } from "../../core/types.js";
|
|
4
|
+
/** A product-defined check for a `{ kind: "custom", name }` assertion — the host decides what success means. */
|
|
5
|
+
export type CustomCheck = (params: Record<string, unknown>, evidence: Evidence) => boolean | {
|
|
6
|
+
passed: boolean;
|
|
7
|
+
detail?: string;
|
|
8
|
+
} | Promise<boolean | {
|
|
9
|
+
passed: boolean;
|
|
10
|
+
detail?: string;
|
|
11
|
+
}>;
|
|
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>;
|
|
4
15
|
/** Evaluate one mechanical assertion. `expect` is not mechanical — returns unsupported (LlmCritic handles it). */
|
|
5
16
|
export declare function checkAssertion(assertion: Assertion, evidence: Evidence): AssertionResult;
|
|
6
17
|
export declare class AssertionCritic implements Critic {
|
|
18
|
+
private readonly custom;
|
|
19
|
+
/** @param custom product-defined checks for `custom` assertions, keyed by name. */
|
|
20
|
+
constructor(custom?: CustomChecks);
|
|
7
21
|
judge(evidence: Evidence, assertions: Assertion[]): Promise<Verdict>;
|
|
8
22
|
}
|
|
@@ -1,3 +1,18 @@
|
|
|
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
|
+
/** Requests whose failure is noise, not a regression — excluded from `no-failed-requests`. */
|
|
13
|
+
function isBenignRequest(url) {
|
|
14
|
+
return /\/favicon\.ico(\?|$)/i.test(url) || /\/robots\.txt(\?|$)/i.test(url);
|
|
15
|
+
}
|
|
1
16
|
/** Evaluate one mechanical assertion. `expect` is not mechanical — returns unsupported (LlmCritic handles it). */
|
|
2
17
|
export function checkAssertion(assertion, evidence) {
|
|
3
18
|
switch (assertion.kind) {
|
|
@@ -17,7 +32,8 @@ export function checkAssertion(assertion, evidence) {
|
|
|
17
32
|
: { assertion, passed: false, detail: `${errors.length} console error(s): ${errors[0]?.text}` };
|
|
18
33
|
}
|
|
19
34
|
case "no-failed-requests": {
|
|
20
|
-
|
|
35
|
+
// Ignore universally-benign noise (a missing favicon shouldn't fail a checkout test).
|
|
36
|
+
const failed = evidence.logic.requests.filter((r) => r.status >= 400 && !isBenignRequest(r.url));
|
|
21
37
|
return failed.length === 0
|
|
22
38
|
? { assertion, passed: true }
|
|
23
39
|
: { assertion, passed: false, detail: `${failed.length} failed request(s): ${failed[0]?.status} ${failed[0]?.url}` };
|
|
@@ -32,11 +48,18 @@ export function checkAssertion(assertion, evidence) {
|
|
|
32
48
|
}
|
|
33
49
|
case "expect":
|
|
34
50
|
return { assertion, passed: false, detail: "'expect' is judged by LlmCritic, not the deterministic critic" };
|
|
51
|
+
case "custom":
|
|
52
|
+
return { assertion, passed: false, detail: `custom check "${assertion.name}" needs a registered handler` };
|
|
35
53
|
}
|
|
36
54
|
}
|
|
37
55
|
export class AssertionCritic {
|
|
56
|
+
custom;
|
|
57
|
+
/** @param custom product-defined checks for `custom` assertions, keyed by name. */
|
|
58
|
+
constructor(custom = {}) {
|
|
59
|
+
this.custom = custom;
|
|
60
|
+
}
|
|
38
61
|
async judge(evidence, assertions) {
|
|
39
|
-
const results = assertions.map((a) =>
|
|
62
|
+
const results = await Promise.all(assertions.map((a) => resolveAssertion(a, evidence, this.custom)));
|
|
40
63
|
return { passed: results.every((r) => r.passed), results };
|
|
41
64
|
}
|
|
42
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../../src/adapters/critics/assertion.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../../src/adapters/critics/assertion.ts"],"names":[],"mappings":"AAYA,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAoB,EACpB,QAAkB,EAClB,SAAuB,EAAE;IAEzB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,mCAAmC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC;QAChH,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/G,CAAC;IACD,OAAO,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,8FAA8F;AAC9F,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,QAAkB;IACrE,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;YACnD,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;YACtF,IAAI,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,QAAQ,qBAAqB,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;YACxG,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACvD,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YACxE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC;gBACxB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;gBAC7B,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,sBAAsB,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACpG,CAAC;QACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,sFAAsF;YACtF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACjG,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC;gBACxB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;gBAC7B,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,uBAAuB,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACzH,CAAC;QACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;YACzF,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YACxG,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;gBACtC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,EAAE;gBACrE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,SAAS,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;QACjH,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,+DAA+D,EAAE,CAAC;QAC/G,KAAK,QAAQ;YACX,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,SAAS,CAAC,IAAI,8BAA8B,EAAE,CAAC;IAC/G,CAAC;AACH,CAAC;AAED,MAAM,OAAO,eAAe;IAEG;IAD7B,mFAAmF;IACnF,YAA6B,SAAuB,EAAE;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAE1D,KAAK,CAAC,KAAK,CAAC,QAAkB,EAAE,UAAuB;QACrD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrG,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IAC7D,CAAC;CACF"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import type { CustomChecks } from "./assertion.js";
|
|
1
2
|
import type { Critic, LlmClient } from "../../core/ports.js";
|
|
2
3
|
import type { Assertion, Evidence, Verdict } from "../../core/types.js";
|
|
3
4
|
/** Compact, judge-friendly rendering of the three evidence layers. */
|
|
4
5
|
export declare function summarizeEvidence(evidence: Evidence): string;
|
|
5
6
|
export declare class LlmCritic implements Critic {
|
|
6
7
|
private readonly llm;
|
|
7
|
-
|
|
8
|
+
private readonly custom;
|
|
9
|
+
constructor(llm: LlmClient, custom?: CustomChecks);
|
|
8
10
|
private judgeExpect;
|
|
9
11
|
judge(evidence: Evidence, assertions: Assertion[]): Promise<Verdict>;
|
|
10
12
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* none makes zero LLM calls and stays deterministic (invariant #4). Judgment is grounded in the
|
|
5
5
|
* three-layer evidence (design §6), behind the LlmClient seam (invariant #5).
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { resolveAssertion } from "./assertion.js";
|
|
8
8
|
const SYSTEM = "You are a QA critic. Given observed evidence from a browser run and a success " +
|
|
9
9
|
"criterion, decide whether the criterion is satisfied. Judge only from the evidence; " +
|
|
10
10
|
'do not assume. Respond with strict JSON, no prose, no code fences: {"passed":true|false,"detail":"<short reason>"}.';
|
|
@@ -37,8 +37,10 @@ function parseVerdict(text) {
|
|
|
37
37
|
}
|
|
38
38
|
export class LlmCritic {
|
|
39
39
|
llm;
|
|
40
|
-
|
|
40
|
+
custom;
|
|
41
|
+
constructor(llm, custom = {}) {
|
|
41
42
|
this.llm = llm;
|
|
43
|
+
this.custom = custom;
|
|
42
44
|
}
|
|
43
45
|
async judgeExpect(criterion, evidence, assertion) {
|
|
44
46
|
const prompt = [
|
|
@@ -61,7 +63,7 @@ export class LlmCritic {
|
|
|
61
63
|
async judge(evidence, assertions) {
|
|
62
64
|
const results = await Promise.all(assertions.map((a) => a.kind === "expect"
|
|
63
65
|
? this.judgeExpect(a.criterion, evidence, a)
|
|
64
|
-
:
|
|
66
|
+
: resolveAssertion(a, evidence, this.custom)));
|
|
65
67
|
return { passed: results.every((r) => r.passed), results };
|
|
66
68
|
}
|
|
67
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/adapters/critics/llm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/adapters/critics/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,17 +3,24 @@ import type { ConsoleMessage, Evidence, NetworkRequest, PageElement, SettleOptio
|
|
|
3
3
|
export interface ChromeDriverOptions {
|
|
4
4
|
command?: string;
|
|
5
5
|
args?: string[];
|
|
6
|
+
/** Per-MCP-call timeout (ms). A hung tool call rejects instead of wedging the run. Default 30s. */
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
/** Timeout for the initial browser launch/connect (ms). Default 60s (first run may download). */
|
|
9
|
+
connectTimeoutMs?: number;
|
|
6
10
|
}
|
|
7
11
|
export declare class ChromeDevToolsDriver implements Driver {
|
|
8
12
|
private readonly opts;
|
|
9
13
|
private client?;
|
|
10
14
|
private transport?;
|
|
11
15
|
private initialUrl?;
|
|
16
|
+
private snapshotCache?;
|
|
12
17
|
private readonly seenPages;
|
|
13
18
|
constructor(opts?: ChromeDriverOptions);
|
|
14
19
|
private trackPages;
|
|
15
20
|
/** If the last action opened a new tab, switch to it — else later actions silently hit the wrong page. */
|
|
16
21
|
private followNewTab;
|
|
22
|
+
/** Reject after `ms` if `p` hasn't settled — so a hung MCP/subprocess never wedges the caller. */
|
|
23
|
+
private withTimeout;
|
|
17
24
|
private ensureConnected;
|
|
18
25
|
private call;
|
|
19
26
|
goto(url: string): Promise<void>;
|
|
@@ -24,23 +31,37 @@ export declare class ChromeDevToolsDriver implements Driver {
|
|
|
24
31
|
select(target: Target, value: string): Promise<void>;
|
|
25
32
|
pressKey(key: string): Promise<void>;
|
|
26
33
|
scroll(direction?: "down" | "up"): Promise<void>;
|
|
34
|
+
screenshot(): Promise<string | undefined>;
|
|
35
|
+
/** Cache the page snapshot so resolve + the discover loop don't both re-fetch it; actions invalidate it. */
|
|
36
|
+
private getSnapshot;
|
|
27
37
|
snapshot(): Promise<PageElement[]>;
|
|
28
38
|
settle(options?: SettleOptions): Promise<void>;
|
|
29
39
|
observe(): Promise<Evidence>;
|
|
30
40
|
close(): Promise<void>;
|
|
41
|
+
locate(target: Target): Promise<Target>;
|
|
31
42
|
private resolveUid;
|
|
32
43
|
}
|
|
33
44
|
/** `uid=1_3 link "Learn more" …` → {role:"link", name:"Learn more"} for named rows. */
|
|
34
45
|
export declare function parseElements(snapshot: string): PageElement[];
|
|
46
|
+
export interface SnapshotRow {
|
|
47
|
+
uid: string;
|
|
48
|
+
role: string;
|
|
49
|
+
name: string;
|
|
50
|
+
}
|
|
51
|
+
/** `uid=1_3 link "Learn more" …` → ordered {uid, role, name} rows (the role-adjacent quoted name). */
|
|
52
|
+
export declare function parseSnapshotRows(snapshot: string): SnapshotRow[];
|
|
35
53
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
54
|
+
* Multi-locator resolution. Prefers the accessible name (exact over substring, role-aware
|
|
55
|
+
* if known); if the name no longer matches — a UI rename — falls back to role + structural
|
|
56
|
+
* index, so the login button still resolves after "Log in" becomes "Sign in". This is what
|
|
57
|
+
* lets a frozen scenario survive UI change WITHOUT the LLM (self-heal stays the exception).
|
|
39
58
|
*/
|
|
59
|
+
export declare function resolveTargetUid(rows: SnapshotRow[], target: Target): string | undefined;
|
|
60
|
+
/** Resolve a uid by accessible name only (exact over substring) — used by the discover snapshot path. */
|
|
40
61
|
export declare function findUidByName(snapshot: string, text: string): string | undefined;
|
|
41
62
|
/** `reqid=5 GET https://… [200]` → NetworkRequest[]. */
|
|
42
63
|
export declare function parseNetwork(text: string): NetworkRequest[];
|
|
43
|
-
/**
|
|
64
|
+
/** `msgid=1 [error] message (1 args)` → {type:"error", text:"message"}. */
|
|
44
65
|
export declare function parseConsole(text: string): ConsoleMessage[];
|
|
45
66
|
/** Canonicalize a url for comparison: drop a trailing slash and the hash. */
|
|
46
67
|
export declare function normalizeUrl(u: string): string;
|
|
@@ -18,6 +18,7 @@ export class ChromeDevToolsDriver {
|
|
|
18
18
|
client;
|
|
19
19
|
transport;
|
|
20
20
|
initialUrl;
|
|
21
|
+
snapshotCache; // raw take_snapshot text, valid until the next action mutates the page
|
|
21
22
|
seenPages = new Set();
|
|
22
23
|
constructor(opts = {}) {
|
|
23
24
|
this.opts = opts;
|
|
@@ -36,13 +37,31 @@ export class ChromeDevToolsDriver {
|
|
|
36
37
|
const ids = parsePageIds(await this.call("list_pages"));
|
|
37
38
|
const fresh = ids.filter((id) => !this.seenPages.has(id));
|
|
38
39
|
ids.forEach((id) => this.seenPages.add(id));
|
|
39
|
-
if (fresh.length)
|
|
40
|
+
if (fresh.length) {
|
|
40
41
|
await this.call("select_page", { pageId: Math.max(...fresh) });
|
|
42
|
+
this.snapshotCache = undefined; // different tab → different DOM
|
|
43
|
+
}
|
|
41
44
|
}
|
|
42
45
|
catch {
|
|
43
46
|
/* best-effort */
|
|
44
47
|
}
|
|
45
48
|
}
|
|
49
|
+
/** Reject after `ms` if `p` hasn't settled — so a hung MCP/subprocess never wedges the caller. */
|
|
50
|
+
async withTimeout(p, ms, label) {
|
|
51
|
+
let timer;
|
|
52
|
+
try {
|
|
53
|
+
return await Promise.race([
|
|
54
|
+
p,
|
|
55
|
+
new Promise((_, reject) => {
|
|
56
|
+
timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
|
|
57
|
+
}),
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
if (timer)
|
|
62
|
+
clearTimeout(timer);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
46
65
|
async ensureConnected() {
|
|
47
66
|
if (this.client)
|
|
48
67
|
return this.client;
|
|
@@ -51,14 +70,27 @@ export class ChromeDevToolsDriver {
|
|
|
51
70
|
command: this.opts.command ?? MCP_COMMAND,
|
|
52
71
|
args: this.opts.args ?? MCP_ARGS,
|
|
53
72
|
});
|
|
54
|
-
|
|
73
|
+
// If the subprocess dies mid-run, drop the dead client so the next call reconnects.
|
|
74
|
+
transport.onclose = () => {
|
|
75
|
+
if (this.client === client) {
|
|
76
|
+
this.client = undefined;
|
|
77
|
+
this.transport = undefined;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
try {
|
|
81
|
+
await this.withTimeout(client.connect(transport), this.opts.connectTimeoutMs ?? 60_000, "chrome-devtools-mcp connect");
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
await transport.close().catch(() => { }); // don't orphan the spawned subprocess
|
|
85
|
+
throw new Error(`failed to start chrome-devtools-mcp: ${err instanceof Error ? err.message : String(err)}`);
|
|
86
|
+
}
|
|
55
87
|
this.client = client;
|
|
56
88
|
this.transport = transport;
|
|
57
89
|
return client;
|
|
58
90
|
}
|
|
59
91
|
async call(name, args = {}) {
|
|
60
92
|
const client = await this.ensureConnected();
|
|
61
|
-
const res = (await client.callTool({ name, arguments: args }));
|
|
93
|
+
const res = (await this.withTimeout(client.callTool({ name, arguments: args }), this.opts.timeoutMs ?? 30_000, `MCP ${name}`));
|
|
62
94
|
const text = (res.content ?? [])
|
|
63
95
|
.filter((c) => c.type === "text" && typeof c.text === "string")
|
|
64
96
|
.map((c) => c.text)
|
|
@@ -72,37 +104,62 @@ export class ChromeDevToolsDriver {
|
|
|
72
104
|
this.initialUrl = url;
|
|
73
105
|
// accept beforeunload so leaving a dirty form/page doesn't hang on a dialog.
|
|
74
106
|
await this.call("navigate_page", { type: "url", url, handleBeforeUnload: "accept" });
|
|
107
|
+
this.snapshotCache = undefined;
|
|
75
108
|
await this.trackPages();
|
|
76
109
|
}
|
|
77
110
|
async click(target) {
|
|
78
111
|
await this.call("click", { uid: await this.resolveUid(target) });
|
|
112
|
+
this.snapshotCache = undefined;
|
|
79
113
|
await this.followNewTab();
|
|
80
114
|
}
|
|
81
115
|
async doubleClick(target) {
|
|
82
116
|
await this.call("click", { uid: await this.resolveUid(target), dblClick: true });
|
|
117
|
+
this.snapshotCache = undefined;
|
|
83
118
|
await this.followNewTab();
|
|
84
119
|
}
|
|
85
120
|
async hover(target) {
|
|
86
121
|
await this.call("hover", { uid: await this.resolveUid(target) });
|
|
122
|
+
this.snapshotCache = undefined;
|
|
87
123
|
}
|
|
88
124
|
async type(target, text) {
|
|
89
125
|
await this.call("fill", { uid: await this.resolveUid(target), value: text });
|
|
126
|
+
this.snapshotCache = undefined;
|
|
90
127
|
}
|
|
91
128
|
async select(target, value) {
|
|
92
129
|
// chrome-devtools-mcp's `fill` selects an option when the element is a <select>.
|
|
93
130
|
await this.call("fill", { uid: await this.resolveUid(target), value });
|
|
131
|
+
this.snapshotCache = undefined;
|
|
94
132
|
}
|
|
95
133
|
async pressKey(key) {
|
|
96
134
|
await this.call("press_key", { key });
|
|
135
|
+
this.snapshotCache = undefined;
|
|
97
136
|
}
|
|
98
137
|
async scroll(direction = "down") {
|
|
99
138
|
const sign = direction === "up" ? "-" : "";
|
|
100
139
|
await this.call("evaluate_script", {
|
|
101
140
|
function: `() => { window.scrollBy(0, ${sign}window.innerHeight * 0.9); }`,
|
|
102
141
|
});
|
|
142
|
+
this.snapshotCache = undefined;
|
|
143
|
+
}
|
|
144
|
+
async screenshot() {
|
|
145
|
+
try {
|
|
146
|
+
const client = await this.ensureConnected();
|
|
147
|
+
const res = (await this.withTimeout(client.callTool({ name: "take_screenshot", arguments: { format: "png" } }), this.opts.timeoutMs ?? 30_000, "MCP take_screenshot"));
|
|
148
|
+
const img = (res.content ?? []).find((c) => c.type === "image" && typeof c.data === "string");
|
|
149
|
+
return img?.data ? `data:${img.mimeType ?? "image/png"};base64,${img.data}` : undefined;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return undefined; // screenshots are best-effort; never fail a run
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Cache the page snapshot so resolve + the discover loop don't both re-fetch it; actions invalidate it. */
|
|
156
|
+
async getSnapshot() {
|
|
157
|
+
if (this.snapshotCache === undefined)
|
|
158
|
+
this.snapshotCache = await this.call("take_snapshot");
|
|
159
|
+
return this.snapshotCache;
|
|
103
160
|
}
|
|
104
161
|
async snapshot() {
|
|
105
|
-
return parseElements(await this.
|
|
162
|
+
return parseElements(await this.getSnapshot());
|
|
106
163
|
}
|
|
107
164
|
async settle(options = {}) {
|
|
108
165
|
// Chrome defers low-priority resources (favicon, web fonts) past the usual 500ms
|
|
@@ -150,19 +207,27 @@ export class ChromeDevToolsDriver {
|
|
|
150
207
|
};
|
|
151
208
|
}
|
|
152
209
|
async close() {
|
|
153
|
-
|
|
154
|
-
|
|
210
|
+
const client = this.client;
|
|
211
|
+
const transport = this.transport;
|
|
212
|
+
this.client = undefined; // clear first so onclose treats this as an intentional close
|
|
155
213
|
this.transport = undefined;
|
|
214
|
+
this.seenPages.clear();
|
|
215
|
+
await client?.close().catch(() => { });
|
|
216
|
+
await transport?.close().catch(() => { }); // also kill the subprocess on partial/abnormal state
|
|
217
|
+
}
|
|
218
|
+
async locate(target) {
|
|
219
|
+
const rows = parseSnapshotRows(await this.getSnapshot());
|
|
220
|
+
const uid = resolveTargetUid(rows, target);
|
|
221
|
+
if (!uid)
|
|
222
|
+
return target; // can't enrich right now — freeze what we have
|
|
223
|
+
const row = rows.find((r) => r.uid === uid);
|
|
224
|
+
const index = rows.filter((r) => r.role === row.role).findIndex((r) => r.uid === uid);
|
|
225
|
+
return { ...target, text: target.text ?? row.name, role: row.role, index };
|
|
156
226
|
}
|
|
157
227
|
async resolveUid(target) {
|
|
158
|
-
|
|
159
|
-
throw new Error("ChromeDevToolsDriver resolves targets by text, not CSS selector");
|
|
160
|
-
}
|
|
161
|
-
if (!target.text)
|
|
162
|
-
throw new Error("target needs a `text` to resolve an element");
|
|
163
|
-
const uid = findUidByName(await this.call("take_snapshot"), target.text);
|
|
228
|
+
const uid = resolveTargetUid(parseSnapshotRows(await this.getSnapshot()), target);
|
|
164
229
|
if (!uid)
|
|
165
|
-
throw new Error(`no element
|
|
230
|
+
throw new Error(`no element matching ${JSON.stringify(target)}`);
|
|
166
231
|
return uid;
|
|
167
232
|
}
|
|
168
233
|
}
|
|
@@ -177,21 +242,42 @@ export function parseElements(snapshot) {
|
|
|
177
242
|
}
|
|
178
243
|
return out;
|
|
179
244
|
}
|
|
180
|
-
/**
|
|
181
|
-
|
|
182
|
-
* substring one, so "Cart" picks the button "Cart" rather than the first "Add to Cart".
|
|
183
|
-
* Only the role-adjacent quoted name counts — a bare `url="…"` is never matched as a name.
|
|
184
|
-
*/
|
|
185
|
-
export function findUidByName(snapshot, text) {
|
|
186
|
-
const needle = text.trim().toLowerCase();
|
|
245
|
+
/** `uid=1_3 link "Learn more" …` → ordered {uid, role, name} rows (the role-adjacent quoted name). */
|
|
246
|
+
export function parseSnapshotRows(snapshot) {
|
|
187
247
|
const rows = [];
|
|
188
248
|
for (const line of snapshot.split("\n")) {
|
|
189
|
-
const m = line.match(/uid=(\S+)\s
|
|
190
|
-
if (m
|
|
191
|
-
rows.push({ uid: m[1],
|
|
249
|
+
const m = line.match(/uid=(\S+)\s+(\w+)\s+"([^"]*)"/);
|
|
250
|
+
if (m)
|
|
251
|
+
rows.push({ uid: m[1], role: m[2], name: m[3] });
|
|
192
252
|
}
|
|
193
|
-
return
|
|
194
|
-
|
|
253
|
+
return rows;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Multi-locator resolution. Prefers the accessible name (exact over substring, role-aware
|
|
257
|
+
* if known); if the name no longer matches — a UI rename — falls back to role + structural
|
|
258
|
+
* index, so the login button still resolves after "Log in" becomes "Sign in". This is what
|
|
259
|
+
* lets a frozen scenario survive UI change WITHOUT the LLM (self-heal stays the exception).
|
|
260
|
+
*/
|
|
261
|
+
export function resolveTargetUid(rows, target) {
|
|
262
|
+
const roleOk = (r) => !target.role || r.role === target.role;
|
|
263
|
+
if (target.text) {
|
|
264
|
+
const needle = target.text.trim().toLowerCase();
|
|
265
|
+
const exact = rows.find((r) => roleOk(r) && r.name.toLowerCase() === needle);
|
|
266
|
+
if (exact)
|
|
267
|
+
return exact.uid;
|
|
268
|
+
const sub = rows.find((r) => roleOk(r) && r.name.trim() !== "" && r.name.toLowerCase().includes(needle));
|
|
269
|
+
if (sub)
|
|
270
|
+
return sub.uid;
|
|
271
|
+
}
|
|
272
|
+
if (target.role && target.index !== undefined) {
|
|
273
|
+
const sameRole = rows.filter((r) => r.role === target.role);
|
|
274
|
+
return sameRole[target.index]?.uid;
|
|
275
|
+
}
|
|
276
|
+
return undefined;
|
|
277
|
+
}
|
|
278
|
+
/** Resolve a uid by accessible name only (exact over substring) — used by the discover snapshot path. */
|
|
279
|
+
export function findUidByName(snapshot, text) {
|
|
280
|
+
return resolveTargetUid(parseSnapshotRows(snapshot), { text });
|
|
195
281
|
}
|
|
196
282
|
/** `reqid=5 GET https://… [200]` → NetworkRequest[]. */
|
|
197
283
|
export function parseNetwork(text) {
|
|
@@ -203,13 +289,13 @@ export function parseNetwork(text) {
|
|
|
203
289
|
}
|
|
204
290
|
return out;
|
|
205
291
|
}
|
|
206
|
-
/**
|
|
292
|
+
/** `msgid=1 [error] message (1 args)` → {type:"error", text:"message"}. */
|
|
207
293
|
export function parseConsole(text) {
|
|
208
294
|
const out = [];
|
|
209
295
|
for (const line of text.split("\n")) {
|
|
210
|
-
const m = line.match(
|
|
296
|
+
const m = line.match(/^msgid=\d+\s+\[(\w+)\]\s+(.*)$/);
|
|
211
297
|
if (m)
|
|
212
|
-
out.push({ type: m[1].toLowerCase(), text: m[2].trim() });
|
|
298
|
+
out.push({ type: m[1].toLowerCase(), text: m[2].replace(/\s*\(\d+ args?\)\s*$/, "").trim() });
|
|
213
299
|
}
|
|
214
300
|
return out;
|
|
215
301
|
}
|
|
@@ -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":"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"}
|
|
@@ -4,6 +4,7 @@ import type { Evidence, PageElement, Target } from "../../core/types.js";
|
|
|
4
4
|
export interface FakeScript {
|
|
5
5
|
evidence: Evidence;
|
|
6
6
|
elements?: PageElement[];
|
|
7
|
+
screenshot?: string;
|
|
7
8
|
/** Targets (by text) that should throw when acted on, to simulate a broken step. */
|
|
8
9
|
failOn?: string[];
|
|
9
10
|
}
|
|
@@ -24,9 +25,11 @@ export declare class FakeDriver implements Driver {
|
|
|
24
25
|
doubleClick(target: Target): Promise<void>;
|
|
25
26
|
hover(target: Target): Promise<void>;
|
|
26
27
|
type(target: Target, _text: string): Promise<void>;
|
|
28
|
+
locate(target: Target): Promise<Target>;
|
|
27
29
|
select(target: Target, _value: string): Promise<void>;
|
|
28
30
|
pressKey(key: string): Promise<void>;
|
|
29
31
|
scroll(direction?: "down" | "up"): Promise<void>;
|
|
32
|
+
screenshot(): Promise<string | undefined>;
|
|
30
33
|
snapshot(): Promise<PageElement[]>;
|
|
31
34
|
settle(): Promise<void>;
|
|
32
35
|
observe(): Promise<Evidence>;
|
|
@@ -34,6 +34,14 @@ export class FakeDriver {
|
|
|
34
34
|
async type(target, _text) {
|
|
35
35
|
this.resolve(target);
|
|
36
36
|
}
|
|
37
|
+
async locate(target) {
|
|
38
|
+
const els = this.script.elements ?? [];
|
|
39
|
+
const el = els.find((e) => target.text && e.name.toLowerCase().includes(target.text.toLowerCase()));
|
|
40
|
+
if (!el)
|
|
41
|
+
return target;
|
|
42
|
+
const index = els.filter((e) => e.role === el.role).indexOf(el);
|
|
43
|
+
return { ...target, role: el.role, index };
|
|
44
|
+
}
|
|
37
45
|
async select(target, _value) {
|
|
38
46
|
this.resolve(target);
|
|
39
47
|
}
|
|
@@ -43,6 +51,9 @@ export class FakeDriver {
|
|
|
43
51
|
async scroll(direction = "down") {
|
|
44
52
|
this.scrolls.push(direction);
|
|
45
53
|
}
|
|
54
|
+
async screenshot() {
|
|
55
|
+
return this.script.screenshot;
|
|
56
|
+
}
|
|
46
57
|
async snapshot() {
|
|
47
58
|
return this.script.elements ?? [];
|
|
48
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake.js","sourceRoot":"","sources":["../../../src/adapters/drivers/fake.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fake.js","sourceRoot":"","sources":["../../../src/adapters/drivers/fake.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,8 @@ export interface Heal {
|
|
|
14
14
|
}
|
|
15
15
|
export interface SelfHealOptions {
|
|
16
16
|
maxHeals?: number;
|
|
17
|
+
/** Fired when a step is healed — a host's signal that the scenario is aging (re-freeze worthwhile). */
|
|
18
|
+
onHeal?: (heal: Heal) => void;
|
|
17
19
|
}
|
|
18
20
|
/** Parse the heal reply → a chosen element name, or undefined for "none". */
|
|
19
21
|
export declare function parseHealChoice(text: string): string | undefined;
|
|
@@ -22,6 +24,7 @@ export declare class SelfHealingDriver implements Driver {
|
|
|
22
24
|
private readonly llm;
|
|
23
25
|
readonly heals: Heal[];
|
|
24
26
|
private readonly maxHeals;
|
|
27
|
+
private readonly onHeal?;
|
|
25
28
|
constructor(inner: Driver, llm: LlmClient, opts?: SelfHealOptions);
|
|
26
29
|
goto(url: string): Promise<void>;
|
|
27
30
|
click(target: Target): Promise<void>;
|
|
@@ -29,8 +32,10 @@ export declare class SelfHealingDriver implements Driver {
|
|
|
29
32
|
hover(target: Target): Promise<void>;
|
|
30
33
|
type(target: Target, text: string): Promise<void>;
|
|
31
34
|
select(target: Target, value: string): Promise<void>;
|
|
35
|
+
locate(target: Target): Promise<Target>;
|
|
32
36
|
pressKey(key: string): Promise<void>;
|
|
33
37
|
scroll(direction?: "down" | "up"): Promise<void>;
|
|
38
|
+
screenshot(): Promise<string | undefined>;
|
|
34
39
|
snapshot(): Promise<PageElement[]>;
|
|
35
40
|
settle(options?: SettleOptions): Promise<void>;
|
|
36
41
|
observe(): Promise<Evidence>;
|