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
|
@@ -33,10 +33,12 @@ export class SelfHealingDriver {
|
|
|
33
33
|
llm;
|
|
34
34
|
heals = [];
|
|
35
35
|
maxHeals;
|
|
36
|
+
onHeal;
|
|
36
37
|
constructor(inner, llm, opts = {}) {
|
|
37
38
|
this.inner = inner;
|
|
38
39
|
this.llm = llm;
|
|
39
40
|
this.maxHeals = opts.maxHeals ?? 5;
|
|
41
|
+
this.onHeal = opts.onHeal;
|
|
40
42
|
}
|
|
41
43
|
async goto(url) {
|
|
42
44
|
return this.inner.goto(url);
|
|
@@ -81,12 +83,18 @@ export class SelfHealingDriver {
|
|
|
81
83
|
await this.inner.select({ text: await this.heal(target, err) }, value);
|
|
82
84
|
}
|
|
83
85
|
}
|
|
86
|
+
locate(target) {
|
|
87
|
+
return this.inner.locate(target);
|
|
88
|
+
}
|
|
84
89
|
pressKey(key) {
|
|
85
90
|
return this.inner.pressKey(key);
|
|
86
91
|
}
|
|
87
92
|
scroll(direction) {
|
|
88
93
|
return this.inner.scroll(direction);
|
|
89
94
|
}
|
|
95
|
+
screenshot() {
|
|
96
|
+
return this.inner.screenshot();
|
|
97
|
+
}
|
|
90
98
|
snapshot() {
|
|
91
99
|
return this.inner.snapshot();
|
|
92
100
|
}
|
|
@@ -110,7 +118,9 @@ export class SelfHealingDriver {
|
|
|
110
118
|
const why = cause instanceof Error ? cause.message : String(cause);
|
|
111
119
|
throw new Error(`self-heal found no match for ${JSON.stringify(target)} (${why})`);
|
|
112
120
|
}
|
|
113
|
-
|
|
121
|
+
const heal = { original: target, healedText: choice };
|
|
122
|
+
this.heals.push(heal);
|
|
123
|
+
this.onHeal?.(heal);
|
|
114
124
|
return choice;
|
|
115
125
|
}
|
|
116
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-heal.js","sourceRoot":"","sources":["../../../src/adapters/drivers/self-heal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"self-heal.js","sourceRoot":"","sources":["../../../src/adapters/drivers/self-heal.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,12 +7,18 @@ export interface AnthropicOptions {
|
|
|
7
7
|
apiKey?: string;
|
|
8
8
|
model?: string;
|
|
9
9
|
baseUrl?: string;
|
|
10
|
+
/** Per-request timeout (ms). Default 60s — a stalled connection rejects instead of hanging. */
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
/** Retries on transient errors (429 / 5xx). Default 2. */
|
|
13
|
+
maxRetries?: number;
|
|
10
14
|
}
|
|
11
15
|
export declare class AnthropicLlmClient implements LlmClient {
|
|
12
16
|
readonly id: string;
|
|
13
17
|
private readonly apiKey;
|
|
14
18
|
private readonly model;
|
|
15
19
|
private readonly baseUrl;
|
|
20
|
+
private readonly timeoutMs;
|
|
21
|
+
private readonly maxRetries;
|
|
16
22
|
constructor(opts?: AnthropicOptions);
|
|
17
23
|
complete(prompt: string, opts?: CompleteOptions): Promise<string>;
|
|
18
24
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
const delay = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
1
2
|
export class AnthropicLlmClient {
|
|
2
3
|
id;
|
|
3
4
|
apiKey;
|
|
4
5
|
model;
|
|
5
6
|
baseUrl;
|
|
7
|
+
timeoutMs;
|
|
8
|
+
maxRetries;
|
|
6
9
|
constructor(opts = {}) {
|
|
7
10
|
const apiKey = opts.apiKey ?? process.env.ANTHROPIC_API_KEY;
|
|
8
11
|
if (!apiKey)
|
|
@@ -10,32 +13,60 @@ export class AnthropicLlmClient {
|
|
|
10
13
|
this.apiKey = apiKey;
|
|
11
14
|
this.model = opts.model ?? "claude-sonnet-4-6";
|
|
12
15
|
this.baseUrl = opts.baseUrl ?? "https://api.anthropic.com";
|
|
16
|
+
this.timeoutMs = opts.timeoutMs ?? 60_000;
|
|
17
|
+
this.maxRetries = opts.maxRetries ?? 2;
|
|
13
18
|
this.id = `anthropic:${this.model}`;
|
|
14
19
|
}
|
|
15
20
|
async complete(prompt, opts = {}) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"anthropic-version": "2023-06-01",
|
|
22
|
-
},
|
|
23
|
-
body: JSON.stringify({
|
|
24
|
-
model: this.model,
|
|
25
|
-
max_tokens: opts.maxTokens ?? 1024,
|
|
26
|
-
...(opts.system ? { system: opts.system } : {}),
|
|
27
|
-
messages: [{ role: "user", content: prompt }],
|
|
28
|
-
}),
|
|
21
|
+
const body = JSON.stringify({
|
|
22
|
+
model: this.model,
|
|
23
|
+
max_tokens: opts.maxTokens ?? 1024,
|
|
24
|
+
...(opts.system ? { system: opts.system } : {}),
|
|
25
|
+
messages: [{ role: "user", content: prompt }],
|
|
29
26
|
});
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
for (let attempt = 0;; attempt++) {
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
30
|
+
try {
|
|
31
|
+
const res = await fetch(`${this.baseUrl}/v1/messages`, {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: {
|
|
34
|
+
"content-type": "application/json",
|
|
35
|
+
"x-api-key": this.apiKey,
|
|
36
|
+
"anthropic-version": "2023-06-01",
|
|
37
|
+
},
|
|
38
|
+
body,
|
|
39
|
+
signal: controller.signal,
|
|
40
|
+
});
|
|
41
|
+
if (res.ok) {
|
|
42
|
+
const data = (await res.json());
|
|
43
|
+
return (data.content ?? [])
|
|
44
|
+
.filter((c) => c.type === "text" && typeof c.text === "string")
|
|
45
|
+
.map((c) => c.text)
|
|
46
|
+
.join("")
|
|
47
|
+
.trim();
|
|
48
|
+
}
|
|
49
|
+
// Back off on transient errors (rate limit / overloaded / server), else fail.
|
|
50
|
+
if ((res.status === 429 || res.status >= 500) && attempt < this.maxRetries) {
|
|
51
|
+
await delay(500 * 2 ** attempt);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Anthropic API ${res.status}: ${await res.text()}`);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
const aborted = err instanceof Error && err.name === "AbortError";
|
|
58
|
+
if (aborted && attempt >= this.maxRetries)
|
|
59
|
+
throw new Error(`Anthropic request timed out after ${this.timeoutMs}ms`);
|
|
60
|
+
if (aborted) {
|
|
61
|
+
await delay(500 * 2 ** attempt);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
}
|
|
32
69
|
}
|
|
33
|
-
const data = (await res.json());
|
|
34
|
-
return (data.content ?? [])
|
|
35
|
-
.filter((c) => c.type === "text" && typeof c.text === "string")
|
|
36
|
-
.map((c) => c.text)
|
|
37
|
-
.join("")
|
|
38
|
-
.trim();
|
|
39
70
|
}
|
|
40
71
|
}
|
|
41
72
|
//# sourceMappingURL=anthropic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/adapters/llm/anthropic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/adapters/llm/anthropic.ts"],"names":[],"mappings":"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"}
|
package/dist/core/discover.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export interface DiscoverOptions {
|
|
|
11
11
|
baseUrl?: string;
|
|
12
12
|
maxSteps?: number;
|
|
13
13
|
onStep?: (decision: Decision, step?: Step) => void;
|
|
14
|
+
/** Abort discovery between steps (a host's Stop button). */
|
|
15
|
+
signal?: AbortSignal;
|
|
14
16
|
}
|
|
15
17
|
export interface Decision {
|
|
16
18
|
action: "click" | "doubleClick" | "hover" | "type" | "select" | "pressKey" | "scroll" | "goto" | "done";
|
|
@@ -22,6 +24,6 @@ export interface Decision {
|
|
|
22
24
|
reason?: string;
|
|
23
25
|
assertions?: Assertion[];
|
|
24
26
|
}
|
|
25
|
-
/** First JSON object in a model reply, tolerating
|
|
27
|
+
/** First JSON object in a model reply, tolerating fences, prose, and trailing extra objects. */
|
|
26
28
|
export declare function parseDecision(text: string): Decision;
|
|
27
29
|
export declare function discover(intent: string, opts: DiscoverOptions): Promise<Scenario>;
|
package/dist/core/discover.js
CHANGED
|
@@ -33,49 +33,119 @@ function buildPrompt(intent, elements, steps, failures) {
|
|
|
33
33
|
`What is the single next action? Respond with JSON only.`,
|
|
34
34
|
].join("\n");
|
|
35
35
|
}
|
|
36
|
-
/** First JSON object in a model reply, tolerating
|
|
36
|
+
/** First JSON object in a model reply, tolerating fences, prose, and trailing extra objects. */
|
|
37
37
|
export function parseDecision(text) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const start = s.indexOf("{");
|
|
41
|
-
const end = s.lastIndexOf("}");
|
|
42
|
-
if (start === -1 || end === -1 || end < start) {
|
|
38
|
+
const obj = extractFirstJsonObject(text);
|
|
39
|
+
if (!obj)
|
|
43
40
|
throw new Error(`no JSON object in model reply: ${text.slice(0, 200)}`);
|
|
44
|
-
}
|
|
45
|
-
const obj = JSON.parse(s.slice(start, end + 1));
|
|
46
41
|
if (!obj.action)
|
|
47
|
-
throw new Error(`decision missing "action": ${
|
|
42
|
+
throw new Error(`decision missing "action": ${text.slice(0, 200)}`);
|
|
48
43
|
return obj;
|
|
49
44
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Extract the FIRST complete balanced {...} object. Slicing first-`{` to last-`}` breaks
|
|
47
|
+
* when a model emits two objects or trailing text (a real crash seen on complex flows);
|
|
48
|
+
* this scans braces (string-aware) and stops at the first balanced close.
|
|
49
|
+
*/
|
|
50
|
+
function extractFirstJsonObject(text) {
|
|
51
|
+
const s = text.trim().replace(/^```(?:json)?\s*/i, "").replace(/\s*```$/i, "");
|
|
52
|
+
const start = s.indexOf("{");
|
|
53
|
+
if (start === -1)
|
|
54
|
+
return undefined;
|
|
55
|
+
let depth = 0;
|
|
56
|
+
let inStr = false;
|
|
57
|
+
let esc = false;
|
|
58
|
+
for (let i = start; i < s.length; i++) {
|
|
59
|
+
const ch = s[i];
|
|
60
|
+
if (inStr) {
|
|
61
|
+
if (esc)
|
|
62
|
+
esc = false;
|
|
63
|
+
else if (ch === "\\")
|
|
64
|
+
esc = true;
|
|
65
|
+
else if (ch === '"')
|
|
66
|
+
inStr = false;
|
|
67
|
+
}
|
|
68
|
+
else if (ch === '"')
|
|
69
|
+
inStr = true;
|
|
70
|
+
else if (ch === "{")
|
|
71
|
+
depth++;
|
|
72
|
+
else if (ch === "}" && --depth === 0) {
|
|
73
|
+
try {
|
|
74
|
+
return JSON.parse(s.slice(start, i + 1));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Ground the frozen scenario's assertions in what actually happened, not what the LLM
|
|
85
|
+
* guessed — it would propose `navigated` even on a SPA that never navigates, making every
|
|
86
|
+
* replay fail. Always check requests; add `navigated` only if the run truly navigated;
|
|
87
|
+
* keep any LLM-proposed `request-status` (still deterministic).
|
|
88
|
+
*/
|
|
89
|
+
function deriveAssertions(proposed, evidence) {
|
|
90
|
+
const out = [{ kind: "no-failed-requests" }];
|
|
91
|
+
const { navigated, finalUrl } = evidence.execution;
|
|
92
|
+
// assert reaching the RIGHT destination (host+path), not just "navigated" — catches a flow
|
|
93
|
+
// that lands on an error/wrong page yet technically navigated.
|
|
94
|
+
if (navigated && finalUrl)
|
|
95
|
+
out.push({ kind: "navigated", to: destinationKey(finalUrl) });
|
|
96
|
+
else if (navigated)
|
|
97
|
+
out.push({ kind: "navigated" });
|
|
98
|
+
for (const a of proposed ?? []) {
|
|
99
|
+
if (a && a.kind === "request-status")
|
|
100
|
+
out.push(a);
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
/** host + path of a url (query/hash dropped) — a stable, meaningful destination to assert. */
|
|
105
|
+
function destinationKey(url) {
|
|
106
|
+
try {
|
|
107
|
+
const u = new URL(url);
|
|
108
|
+
return `${u.host}${u.pathname}`.replace(/\/$/, "");
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return url;
|
|
112
|
+
}
|
|
55
113
|
}
|
|
56
114
|
/** Execute a non-`done` decision and return the Step it produced. Throws if it fails. */
|
|
57
115
|
async function applyDecision(driver, decision) {
|
|
58
|
-
|
|
116
|
+
// Enrich the target with resilient locators (role + structural index) before acting, and
|
|
117
|
+
// freeze the enriched target — so replay survives a UI rename without the LLM.
|
|
118
|
+
const located = () => {
|
|
59
119
|
if (!decision.text)
|
|
60
120
|
throw new Error(`${decision.action} decision missing "text"`);
|
|
61
|
-
return decision.text;
|
|
121
|
+
return driver.locate({ text: decision.text });
|
|
62
122
|
};
|
|
63
123
|
switch (decision.action) {
|
|
64
|
-
case "click":
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
await driver.
|
|
72
|
-
return { kind: "
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
124
|
+
case "click": {
|
|
125
|
+
const target = await located();
|
|
126
|
+
await driver.click(target);
|
|
127
|
+
return { kind: "click", target };
|
|
128
|
+
}
|
|
129
|
+
case "doubleClick": {
|
|
130
|
+
const target = await located();
|
|
131
|
+
await driver.doubleClick(target);
|
|
132
|
+
return { kind: "doubleClick", target };
|
|
133
|
+
}
|
|
134
|
+
case "hover": {
|
|
135
|
+
const target = await located();
|
|
136
|
+
await driver.hover(target);
|
|
137
|
+
return { kind: "hover", target };
|
|
138
|
+
}
|
|
139
|
+
case "type": {
|
|
140
|
+
const target = await located();
|
|
141
|
+
await driver.type(target, decision.value ?? "");
|
|
142
|
+
return { kind: "type", target, text: decision.value ?? "" };
|
|
143
|
+
}
|
|
144
|
+
case "select": {
|
|
145
|
+
const target = await located();
|
|
146
|
+
await driver.select(target, decision.value ?? "");
|
|
147
|
+
return { kind: "select", target, value: decision.value ?? "" };
|
|
148
|
+
}
|
|
79
149
|
case "pressKey":
|
|
80
150
|
if (!decision.key)
|
|
81
151
|
throw new Error('pressKey decision missing "key"');
|
|
@@ -94,7 +164,7 @@ async function applyDecision(driver, decision) {
|
|
|
94
164
|
}
|
|
95
165
|
}
|
|
96
166
|
export async function discover(intent, opts) {
|
|
97
|
-
const { driver, llm, baseUrl, maxSteps = 8, onStep } = opts;
|
|
167
|
+
const { driver, llm, baseUrl, maxSteps = 8, onStep, signal } = opts;
|
|
98
168
|
const steps = [];
|
|
99
169
|
if (baseUrl) {
|
|
100
170
|
await driver.goto(baseUrl);
|
|
@@ -104,13 +174,23 @@ export async function discover(intent, opts) {
|
|
|
104
174
|
// hover menus, overlays, maintenance pages). ADAPT is the point of the loop (invariant #3).
|
|
105
175
|
const failures = [];
|
|
106
176
|
for (let i = 0; i < maxSteps; i++) {
|
|
177
|
+
signal?.throwIfAborted();
|
|
107
178
|
await driver.settle();
|
|
108
179
|
const elements = await driver.snapshot();
|
|
109
180
|
const reply = await llm.complete(buildPrompt(intent, elements, steps, failures), { system: SYSTEM });
|
|
110
|
-
|
|
181
|
+
let decision;
|
|
182
|
+
try {
|
|
183
|
+
decision = parseDecision(reply);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// A malformed reply must not kill the whole discovery — nudge and retry.
|
|
187
|
+
failures.push("your previous reply was not a single valid JSON action object");
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
111
190
|
if (decision.action === "done") {
|
|
112
191
|
onStep?.(decision);
|
|
113
|
-
|
|
192
|
+
const evidence = await driver.observe();
|
|
193
|
+
return { name: intent, steps, assertions: deriveAssertions(decision.assertions, evidence) };
|
|
114
194
|
}
|
|
115
195
|
try {
|
|
116
196
|
const step = await applyDecision(driver, decision);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/core/discover.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/core/discover.ts"],"names":[],"mappings":"AA6BA,MAAM,MAAM,GACV,iFAAiF;IACjF,qFAAqF;IACrF,yEAAyE;IACzE,WAAW;IACX,wFAAwF;IACxF,0EAA0E;IAC1E,sHAAsH;IACtH,uHAAuH;IACvH,uDAAuD;IACvD,iIAAiI;IACjI,gHAAgH;IAChH,mJAAmJ,CAAC;AAEtJ,SAAS,WAAW,CAAC,MAAc,EAAE,QAAuB,EAAE,KAAa,EAAE,QAAkB;IAC7F,MAAM,GAAG,GAAG,QAAQ;SACjB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;SACrC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM;QAC1B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAClE,CAAC,CAAC,YAAY,CAAC;IACjB,OAAO;QACL,WAAW,MAAM,EAAE;QACnB,EAAE;QACF,GAAG,CAAC,QAAQ,CAAC,MAAM;YACjB,CAAC,CAAC,CAAC,4FAA4F,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtI,CAAC,CAAC,EAAE,CAAC;QACP,uBAAuB;QACvB,OAAO;QACP,EAAE;QACF,uCAAuC;QACvC,GAAG,IAAI,QAAQ;QACf,EAAE;QACF,yDAAyD;KAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,sBAAsB,CAAC,IAAI,CAAyB,CAAC;IACjE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAClF,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACrF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAAC,IAAY;IAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG;gBAAE,GAAG,GAAG,KAAK,CAAC;iBAChB,IAAI,EAAE,KAAK,IAAI;gBAAE,GAAG,GAAG,IAAI,CAAC;iBAC5B,IAAI,EAAE,KAAK,GAAG;gBAAE,KAAK,GAAG,KAAK,CAAC;QACrC,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,GAAG,IAAI,CAAC;aAC/B,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACxB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,QAAiC,EAAE,QAAkB;IAC7E,MAAM,GAAG,GAAgB,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;IACnD,2FAA2F;IAC3F,+DAA+D;IAC/D,IAAI,SAAS,IAAI,QAAQ;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACpF,IAAI,SAAS;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAK,CAAsB,CAAC,IAAI,KAAK,gBAAgB;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8FAA8F;AAC9F,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,QAAkB;IAC7D,yFAAyF;IACzF,+EAA+E;IAC/E,MAAM,OAAO,GAAG,GAAoB,EAAE;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,0BAA0B,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC;IACF,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACnC,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QACzC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACnC,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAC9D,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACjE,CAAC;QACD,KAAK,UAAU;YACb,IAAI,CAAC,QAAQ,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACtE,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;QACjD,KAAK,QAAQ;YACX,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC3D,KAAK,MAAM;YACT,IAAI,CAAC,QAAQ,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAClE,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC7C;YACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAqB;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpE,MAAM,KAAK,GAAW,EAAE,CAAC;IAEzB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,oFAAoF;IACpF,4FAA4F;IAC5F,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAErG,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;YACzE,QAAQ,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YAC/E,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;YACnB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC9F,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACnH,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/E,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC;AAC/E,CAAC"}
|
package/dist/core/pipeline.d.ts
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
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 { Harness } from "./ports.js";
|
|
7
|
-
import type { Result } from "./types.js";
|
|
8
|
-
|
|
6
|
+
import type { Driver, Harness } from "./ports.js";
|
|
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
|
+
/**
|
|
11
|
+
* Seams a host (CLI, desktop app, CI) plugs into — the engine emits/accepts, the host
|
|
12
|
+
* decides what to do. `onStep` for a live timeline, `captureScreenshots` for visual
|
|
13
|
+
* replay, `signal` for a Stop button, `actions` for product-defined interactions. None of
|
|
14
|
+
* these put UI in the engine.
|
|
15
|
+
*/
|
|
16
|
+
export interface RunHarnessOptions {
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
onStep?: (progress: StepProgress) => void;
|
|
19
|
+
captureScreenshots?: boolean;
|
|
20
|
+
actions?: Record<string, CustomAction>;
|
|
21
|
+
}
|
|
22
|
+
export declare function runHarness(harness: Harness, task: string, opts?: RunHarnessOptions): Promise<Result>;
|
package/dist/core/pipeline.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
async function executeStep(driver, step) {
|
|
1
|
+
async function executeStep(driver, step, actions) {
|
|
2
2
|
try {
|
|
3
3
|
switch (step.kind) {
|
|
4
4
|
case "goto":
|
|
@@ -25,6 +25,13 @@ async function executeStep(driver, step) {
|
|
|
25
25
|
case "scroll":
|
|
26
26
|
await driver.scroll(step.direction);
|
|
27
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
|
+
}
|
|
28
35
|
default: {
|
|
29
36
|
const unhandled = step;
|
|
30
37
|
throw new Error(`unhandled step kind: ${JSON.stringify(unhandled)}`);
|
|
@@ -36,7 +43,7 @@ async function executeStep(driver, step) {
|
|
|
36
43
|
return { step, ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
37
44
|
}
|
|
38
45
|
}
|
|
39
|
-
export async function runHarness(harness, task) {
|
|
46
|
+
export async function runHarness(harness, task, opts = {}) {
|
|
40
47
|
const { context, planner, driver, critic, reporter } = harness;
|
|
41
48
|
const ctx = await context.provide(task);
|
|
42
49
|
const scenario = await planner.plan(ctx);
|
|
@@ -44,8 +51,13 @@ export async function runHarness(harness, task) {
|
|
|
44
51
|
const actions = [];
|
|
45
52
|
try {
|
|
46
53
|
for (const step of scenario.steps) {
|
|
47
|
-
|
|
54
|
+
opts.signal?.throwIfAborted(); // cooperative cancellation between steps (host owns Stop)
|
|
55
|
+
const result = await executeStep(driver, step, opts.actions ?? {});
|
|
48
56
|
actions.push(result);
|
|
57
|
+
if (opts.onStep) {
|
|
58
|
+
const screenshot = opts.captureScreenshots ? await driver.screenshot().catch(() => undefined) : undefined;
|
|
59
|
+
opts.onStep({ index: actions.length - 1, step, ok: result.ok, error: result.error, screenshot });
|
|
60
|
+
}
|
|
49
61
|
if (!result.ok)
|
|
50
62
|
break;
|
|
51
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAwBA,KAAK,UAAU,WAAW,CACxB,MAAyB,EACzB,IAAU,EACV,OAAqC;IAErC,IAAI,CAAC;QACH,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM;gBACT,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,aAAa;gBAChB,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBACxF,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBACzC,MAAM;YACR,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,SAAS,GAAU,IAAI,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACtF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAgB,EAChB,IAAY,EACZ,OAA0B,EAAE;IAE5B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE/D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzC,gFAAgF;IAChF,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,0DAA0D;YACzF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1G,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACnG,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,MAAM;QACxB,CAAC;QAED,6FAA6F;QAC7F,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAEtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAa;YACzB,GAAG,QAAQ;YACX,SAAS,EAAE,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SACnF,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,GAAG,GAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACjF,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/core/ports.d.ts
CHANGED
|
@@ -18,12 +18,16 @@ export interface Driver {
|
|
|
18
18
|
doubleClick(target: Target): Promise<void>;
|
|
19
19
|
hover(target: Target): Promise<void>;
|
|
20
20
|
type(target: Target, text: string): Promise<void>;
|
|
21
|
+
/** Resolve a target and return it enriched with resilient locators (role, structural index) for freezing. */
|
|
22
|
+
locate(target: Target): Promise<Target>;
|
|
21
23
|
/** Choose an option in a `<select>` dropdown. */
|
|
22
24
|
select(target: Target, value: string): Promise<void>;
|
|
23
25
|
/** Press a key or combo (e.g. "Enter", "Escape", "Control+a"). */
|
|
24
26
|
pressKey(key: string): Promise<void>;
|
|
25
27
|
/** Scroll the page to reveal lazy/below-the-fold content. */
|
|
26
28
|
scroll(direction?: "down" | "up"): Promise<void>;
|
|
29
|
+
/** Capture the current page as a data URL (for visual replay); undefined if unavailable. */
|
|
30
|
+
screenshot(): Promise<string | undefined>;
|
|
27
31
|
snapshot(): Promise<PageElement[]>;
|
|
28
32
|
/** Execute-stage auto-wait for network idle (design §3). Best-effort, time-bounded, never throws. */
|
|
29
33
|
settle(options?: SettleOptions): Promise<void>;
|
package/dist/core/types.d.ts
CHANGED
|
@@ -30,10 +30,23 @@ export type Step = {
|
|
|
30
30
|
} | {
|
|
31
31
|
kind: "scroll";
|
|
32
32
|
direction?: "down" | "up";
|
|
33
|
+
}
|
|
34
|
+
/** A product-defined interaction: the host registers a handler for `name`. */
|
|
35
|
+
| {
|
|
36
|
+
kind: "custom";
|
|
37
|
+
name: string;
|
|
38
|
+
params?: Record<string, unknown>;
|
|
33
39
|
};
|
|
34
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* Locate an element by intent, not a driver handle. A frozen target carries several
|
|
42
|
+
* locators so replay survives UI change without falling back to the LLM:
|
|
43
|
+
* `text` (accessible name) is primary; `role` + `index` (position among same-role elements)
|
|
44
|
+
* is a rename-resilient fallback; `selector` is a CSS escape hatch.
|
|
45
|
+
*/
|
|
35
46
|
export interface Target {
|
|
36
47
|
text?: string;
|
|
48
|
+
role?: string;
|
|
49
|
+
index?: number;
|
|
37
50
|
selector?: string;
|
|
38
51
|
}
|
|
39
52
|
/**
|
|
@@ -54,6 +67,12 @@ export type Assertion = {
|
|
|
54
67
|
} | {
|
|
55
68
|
kind: "expect";
|
|
56
69
|
criterion: string;
|
|
70
|
+
}
|
|
71
|
+
/** A product-defined success criterion: the host registers a handler for `name`. */
|
|
72
|
+
| {
|
|
73
|
+
kind: "custom";
|
|
74
|
+
name: string;
|
|
75
|
+
params?: Record<string, unknown>;
|
|
57
76
|
};
|
|
58
77
|
export interface Scenario {
|
|
59
78
|
name: string;
|
|
@@ -65,6 +84,15 @@ export interface PageElement {
|
|
|
65
84
|
role: string;
|
|
66
85
|
name: string;
|
|
67
86
|
}
|
|
87
|
+
/** Emitted per executed step so a consumer (e.g. a desktop timeline) can render live progress. */
|
|
88
|
+
export interface StepProgress {
|
|
89
|
+
index: number;
|
|
90
|
+
step: Step;
|
|
91
|
+
ok: boolean;
|
|
92
|
+
error?: string;
|
|
93
|
+
/** A screenshot data URL, present only when screenshot capture is enabled. */
|
|
94
|
+
screenshot?: string;
|
|
95
|
+
}
|
|
68
96
|
export interface SettleOptions {
|
|
69
97
|
idleMs?: number;
|
|
70
98
|
timeoutMs?: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
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
6
|
export { runScenario, needsLlmCritic, applyHeals } from "./run.js";
|
|
6
7
|
export type { RunScenarioOptions, RunScenarioResult } from "./run.js";
|
|
7
8
|
export { InlineContextProvider } from "./adapters/context/inline.js";
|
|
8
9
|
export { StaticPlanner } from "./adapters/planners/static.js";
|
|
9
|
-
export { AssertionCritic, checkAssertion } from "./adapters/critics/assertion.js";
|
|
10
|
+
export { AssertionCritic, checkAssertion, resolveAssertion } from "./adapters/critics/assertion.js";
|
|
11
|
+
export type { CustomCheck, CustomChecks } from "./adapters/critics/assertion.js";
|
|
10
12
|
export { LlmCritic, summarizeEvidence } from "./adapters/critics/llm.js";
|
|
11
13
|
export { ConsoleReporter } from "./adapters/reporters/console.js";
|
|
12
14
|
export { JsonReporter } from "./adapters/reporters/json.js";
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ export { runHarness } from "./core/pipeline.js";
|
|
|
5
5
|
export { runScenario, needsLlmCritic, applyHeals } from "./run.js";
|
|
6
6
|
export { InlineContextProvider } from "./adapters/context/inline.js";
|
|
7
7
|
export { StaticPlanner } from "./adapters/planners/static.js";
|
|
8
|
-
export { AssertionCritic, checkAssertion } from "./adapters/critics/assertion.js";
|
|
8
|
+
export { AssertionCritic, checkAssertion, resolveAssertion } from "./adapters/critics/assertion.js";
|
|
9
9
|
export { LlmCritic, summarizeEvidence } from "./adapters/critics/llm.js";
|
|
10
10
|
export { ConsoleReporter } from "./adapters/reporters/console.js";
|
|
11
11
|
export { JsonReporter } from "./adapters/reporters/json.js";
|
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;
|
|
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"}
|