playwright-locator-healer 0.1.3
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/CHANGELOG.md +71 -0
- package/LICENSE +21 -0
- package/README.md +338 -0
- package/USAGE.md +217 -0
- package/dist/healing/audit-log.d.ts +9 -0
- package/dist/healing/audit-log.d.ts.map +1 -0
- package/dist/healing/audit-log.js +22 -0
- package/dist/healing/audit-log.js.map +1 -0
- package/dist/healing/auto-fixture.d.ts +14 -0
- package/dist/healing/auto-fixture.d.ts.map +1 -0
- package/dist/healing/auto-fixture.js +430 -0
- package/dist/healing/auto-fixture.js.map +1 -0
- package/dist/healing/cache.d.ts +11 -0
- package/dist/healing/cache.d.ts.map +1 -0
- package/dist/healing/cache.js +128 -0
- package/dist/healing/cache.js.map +1 -0
- package/dist/healing/circuit-breaker.d.ts +11 -0
- package/dist/healing/circuit-breaker.d.ts.map +1 -0
- package/dist/healing/circuit-breaker.js +34 -0
- package/dist/healing/circuit-breaker.js.map +1 -0
- package/dist/healing/cost-tracker.d.ts +30 -0
- package/dist/healing/cost-tracker.d.ts.map +1 -0
- package/dist/healing/cost-tracker.js +101 -0
- package/dist/healing/cost-tracker.js.map +1 -0
- package/dist/healing/dom-extractor.d.ts +9 -0
- package/dist/healing/dom-extractor.d.ts.map +1 -0
- package/dist/healing/dom-extractor.js +268 -0
- package/dist/healing/dom-extractor.js.map +1 -0
- package/dist/healing/errors.d.ts +33 -0
- package/dist/healing/errors.d.ts.map +1 -0
- package/dist/healing/errors.js +40 -0
- package/dist/healing/errors.js.map +1 -0
- package/dist/healing/heal/caller-context.d.ts +8 -0
- package/dist/healing/heal/caller-context.d.ts.map +1 -0
- package/dist/healing/heal/caller-context.js +46 -0
- package/dist/healing/heal/caller-context.js.map +1 -0
- package/dist/healing/heal/orchestrator-helpers.d.ts +84 -0
- package/dist/healing/heal/orchestrator-helpers.d.ts.map +1 -0
- package/dist/healing/heal/orchestrator-helpers.js +117 -0
- package/dist/healing/heal/orchestrator-helpers.js.map +1 -0
- package/dist/healing/heal/orchestrator.d.ts +47 -0
- package/dist/healing/heal/orchestrator.d.ts.map +1 -0
- package/dist/healing/heal/orchestrator.js +644 -0
- package/dist/healing/heal/orchestrator.js.map +1 -0
- package/dist/healing/heal/playwright-code.d.ts +26 -0
- package/dist/healing/heal/playwright-code.d.ts.map +1 -0
- package/dist/healing/heal/playwright-code.js +134 -0
- package/dist/healing/heal/playwright-code.js.map +1 -0
- package/dist/healing/heal/preflight.d.ts +8 -0
- package/dist/healing/heal/preflight.d.ts.map +1 -0
- package/dist/healing/heal/preflight.js +77 -0
- package/dist/healing/heal/preflight.js.map +1 -0
- package/dist/healing/heal/prompt.d.ts +9 -0
- package/dist/healing/heal/prompt.d.ts.map +1 -0
- package/dist/healing/heal/prompt.js +22 -0
- package/dist/healing/heal/prompt.js.map +1 -0
- package/dist/healing/heal/report.d.ts +11 -0
- package/dist/healing/heal/report.d.ts.map +1 -0
- package/dist/healing/heal/report.js +28 -0
- package/dist/healing/heal/report.js.map +1 -0
- package/dist/healing/heal/source-trace.d.ts +17 -0
- package/dist/healing/heal/source-trace.d.ts.map +1 -0
- package/dist/healing/heal/source-trace.js +59 -0
- package/dist/healing/heal/source-trace.js.map +1 -0
- package/dist/healing/index.d.ts +6 -0
- package/dist/healing/index.d.ts.map +1 -0
- package/dist/healing/index.js +3 -0
- package/dist/healing/index.js.map +1 -0
- package/dist/healing/llm-client.d.ts +58 -0
- package/dist/healing/llm-client.d.ts.map +1 -0
- package/dist/healing/llm-client.js +258 -0
- package/dist/healing/llm-client.js.map +1 -0
- package/dist/healing/logger.d.ts +18 -0
- package/dist/healing/logger.d.ts.map +1 -0
- package/dist/healing/logger.js +38 -0
- package/dist/healing/logger.js.map +1 -0
- package/dist/healing/models.d.ts +26 -0
- package/dist/healing/models.d.ts.map +1 -0
- package/dist/healing/models.js +109 -0
- package/dist/healing/models.js.map +1 -0
- package/dist/healing/overlay/bridge.d.ts +46 -0
- package/dist/healing/overlay/bridge.d.ts.map +1 -0
- package/dist/healing/overlay/bridge.js +2 -0
- package/dist/healing/overlay/bridge.js.map +1 -0
- package/dist/healing/overlay/dock.css.d.ts +2 -0
- package/dist/healing/overlay/dock.css.d.ts.map +1 -0
- package/dist/healing/overlay/dock.css.js +448 -0
- package/dist/healing/overlay/dock.css.js.map +1 -0
- package/dist/healing/overlay/dock.html.d.ts +46 -0
- package/dist/healing/overlay/dock.html.d.ts.map +1 -0
- package/dist/healing/overlay/dock.html.js +248 -0
- package/dist/healing/overlay/dock.html.js.map +1 -0
- package/dist/healing/overlay/drag.d.ts +17 -0
- package/dist/healing/overlay/drag.d.ts.map +1 -0
- package/dist/healing/overlay/drag.js +68 -0
- package/dist/healing/overlay/drag.js.map +1 -0
- package/dist/healing/overlay/inject.d.ts +41 -0
- package/dist/healing/overlay/inject.d.ts.map +1 -0
- package/dist/healing/overlay/inject.js +277 -0
- package/dist/healing/overlay/inject.js.map +1 -0
- package/dist/healing/overlay/keybinds.d.ts +33 -0
- package/dist/healing/overlay/keybinds.d.ts.map +1 -0
- package/dist/healing/overlay/keybinds.js +105 -0
- package/dist/healing/overlay/keybinds.js.map +1 -0
- package/dist/healing/prompts/heal-v21.d.ts +8 -0
- package/dist/healing/prompts/heal-v21.d.ts.map +1 -0
- package/dist/healing/prompts/heal-v21.js +204 -0
- package/dist/healing/prompts/heal-v21.js.map +1 -0
- package/dist/healing/retry-policy.d.ts +37 -0
- package/dist/healing/retry-policy.d.ts.map +1 -0
- package/dist/healing/retry-policy.js +46 -0
- package/dist/healing/retry-policy.js.map +1 -0
- package/dist/healing/session-cost.d.ts +44 -0
- package/dist/healing/session-cost.d.ts.map +1 -0
- package/dist/healing/session-cost.js +95 -0
- package/dist/healing/session-cost.js.map +1 -0
- package/dist/healing/test-fixture.d.ts +9 -0
- package/dist/healing/test-fixture.d.ts.map +1 -0
- package/dist/healing/test-fixture.js +37 -0
- package/dist/healing/test-fixture.js.map +1 -0
- package/dist/healing/types.d.ts +399 -0
- package/dist/healing/types.d.ts.map +1 -0
- package/dist/healing/types.js +162 -0
- package/dist/healing/types.js.map +1 -0
- package/dist/healing/validator.d.ts +64 -0
- package/dist/healing/validator.d.ts.map +1 -0
- package/dist/healing/validator.js +286 -0
- package/dist/healing/validator.js.map +1 -0
- package/dist/scripts/heal-report.d.ts +23 -0
- package/dist/scripts/heal-report.d.ts.map +1 -0
- package/dist/scripts/heal-report.js +106 -0
- package/dist/scripts/heal-report.js.map +1 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +132 -0
- package/dist/scripts/init.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../healing/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function recordFailure(): void;
|
|
2
|
+
export declare function recordSuccess(): void;
|
|
3
|
+
export declare function isOpen(): boolean;
|
|
4
|
+
export declare function setThreshold(n: number): void;
|
|
5
|
+
export declare function resetCircuit(): void;
|
|
6
|
+
export declare function getCircuitState(): {
|
|
7
|
+
failures: number;
|
|
8
|
+
tripped: boolean;
|
|
9
|
+
threshold: number;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../healing/circuit-breaker.ts"],"names":[],"mappings":"AAYA,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED,wBAAgB,eAAe,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAE3F"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Process-scoped circuit breaker for LLM calls.
|
|
2
|
+
//
|
|
3
|
+
// Trips OPEN after N consecutive failures. Once open, stays open until
|
|
4
|
+
// explicit `resetCircuit()` — does NOT auto-close on intermittent success,
|
|
5
|
+
// because intermittent recoveries during an outage cause oscillation.
|
|
6
|
+
//
|
|
7
|
+
// Threshold is configurable via setThreshold() and via env HEAL_CIRCUIT_THRESHOLD.
|
|
8
|
+
let failures = 0;
|
|
9
|
+
let tripped = false;
|
|
10
|
+
let threshold = Number(process.env.HEAL_CIRCUIT_THRESHOLD ?? 3);
|
|
11
|
+
export function recordFailure() {
|
|
12
|
+
failures += 1;
|
|
13
|
+
if (failures >= threshold)
|
|
14
|
+
tripped = true;
|
|
15
|
+
}
|
|
16
|
+
export function recordSuccess() {
|
|
17
|
+
if (!tripped)
|
|
18
|
+
failures = 0;
|
|
19
|
+
// Intentionally does NOT clear `tripped`. Once open, stays open.
|
|
20
|
+
}
|
|
21
|
+
export function isOpen() {
|
|
22
|
+
return tripped;
|
|
23
|
+
}
|
|
24
|
+
export function setThreshold(n) {
|
|
25
|
+
threshold = Math.max(1, Math.floor(n));
|
|
26
|
+
}
|
|
27
|
+
export function resetCircuit() {
|
|
28
|
+
failures = 0;
|
|
29
|
+
tripped = false;
|
|
30
|
+
}
|
|
31
|
+
export function getCircuitState() {
|
|
32
|
+
return { failures, tripped, threshold };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../healing/circuit-breaker.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,uEAAuE;AACvE,2EAA2E;AAC3E,sEAAsE;AACtE,EAAE;AACF,mFAAmF;AAEnF,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,IAAI,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,CAAC,CAAC;AAEhE,MAAM,UAAU,aAAa;IAC3B,QAAQ,IAAI,CAAC,CAAC;IACd,IAAI,QAAQ,IAAI,SAAS;QAAE,OAAO,GAAG,IAAI,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,OAAO;QAAE,QAAQ,GAAG,CAAC,CAAC;IAC3B,iEAAiE;AACnE,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,KAAK,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const MODEL_NAME: string;
|
|
2
|
+
export declare const MODEL_PRICING: import("./models.js").ModelPricing;
|
|
3
|
+
export interface CallUsage {
|
|
4
|
+
promptTokens: number;
|
|
5
|
+
completionTokens: number;
|
|
6
|
+
cachedPromptTokens: number;
|
|
7
|
+
}
|
|
8
|
+
export interface DailyTotals {
|
|
9
|
+
date: string;
|
|
10
|
+
cost: number;
|
|
11
|
+
calls: number;
|
|
12
|
+
costAllTime: number;
|
|
13
|
+
callsAllTime: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function recordCall(u: CallUsage): void;
|
|
16
|
+
export declare function getSessionCost(): number;
|
|
17
|
+
export declare function getCallCount(): number;
|
|
18
|
+
/**
|
|
19
|
+
* Fraction of session calls whose prompt hit the OpenAI prompt cache.
|
|
20
|
+
*
|
|
21
|
+
* A call counts as a "hit" when `cachedPromptTokens > 0` (any portion of the
|
|
22
|
+
* prompt was served from cache). Returns 0 when no calls have been recorded.
|
|
23
|
+
* Range: 0..1.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getCacheHitRate(): number;
|
|
26
|
+
export declare function getDailyTotals(): DailyTotals;
|
|
27
|
+
export declare function setBudget(usd: number | null): void;
|
|
28
|
+
export declare function isBudgetExceeded(): boolean;
|
|
29
|
+
export declare function resetCost(): void;
|
|
30
|
+
//# sourceMappingURL=cost-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../healing/cost-tracker.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,UAAU,QAAkB,CAAC;AAC1C,eAAO,MAAM,aAAa,oCAAe,CAAC;AAO1C,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAkCD,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAqB7C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAAwB;AAChE,wBAAgB,YAAY,IAAI,MAAM,CAA6B;AAEnE;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED,wBAAgB,cAAc,IAAI,WAAW,CAW5C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAkB;AACrE,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED,wBAAgB,SAAS,IAAI,IAAI,CAKhC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { resolveModel } from './models.js';
|
|
4
|
+
// Resolve once per process at first import. To switch models at runtime the
|
|
5
|
+
// caller should set HEAL_MODEL before importing this module (or use the
|
|
6
|
+
// per-call override path in llm-client).
|
|
7
|
+
const _activeModel = resolveModel();
|
|
8
|
+
const RATE_INPUT_FRESH = _activeModel.input / 1000000;
|
|
9
|
+
const RATE_INPUT_CACHED = _activeModel.cached / 1000000;
|
|
10
|
+
const RATE_OUTPUT = _activeModel.output / 1000000;
|
|
11
|
+
export const MODEL_NAME = _activeModel.id;
|
|
12
|
+
export const MODEL_PRICING = _activeModel;
|
|
13
|
+
let sessionCost = 0;
|
|
14
|
+
let sessionCallCount = 0;
|
|
15
|
+
let sessionCachedCallCount = 0; // calls where any prompt tokens hit the cache
|
|
16
|
+
let budget = null;
|
|
17
|
+
function dailyFilePath() {
|
|
18
|
+
return join(process.cwd(), '.healed-locators', 'cost.daily.json');
|
|
19
|
+
}
|
|
20
|
+
function readDailyFile() {
|
|
21
|
+
const path = dailyFilePath();
|
|
22
|
+
if (!existsSync(path)) {
|
|
23
|
+
return { byDay: {}, allTime: { cost: 0, calls: 0 } };
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { byDay: {}, allTime: { cost: 0, calls: 0 } };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function writeDailyFile(data) {
|
|
33
|
+
try {
|
|
34
|
+
mkdirSync(join(process.cwd(), '.healed-locators'), { recursive: true });
|
|
35
|
+
writeFileSync(dailyFilePath(), JSON.stringify(data, null, 2));
|
|
36
|
+
}
|
|
37
|
+
catch { /* best-effort */ }
|
|
38
|
+
}
|
|
39
|
+
function todayISO() {
|
|
40
|
+
return new Date().toISOString().slice(0, 10);
|
|
41
|
+
}
|
|
42
|
+
export function recordCall(u) {
|
|
43
|
+
const fresh = Math.max(0, u.promptTokens - u.cachedPromptTokens);
|
|
44
|
+
const cached = u.cachedPromptTokens;
|
|
45
|
+
const cost = fresh * RATE_INPUT_FRESH
|
|
46
|
+
+ cached * RATE_INPUT_CACHED
|
|
47
|
+
+ u.completionTokens * RATE_OUTPUT;
|
|
48
|
+
sessionCost += cost;
|
|
49
|
+
sessionCallCount++;
|
|
50
|
+
if (cached > 0)
|
|
51
|
+
sessionCachedCallCount++;
|
|
52
|
+
// Persist to disk — day total + all-time total.
|
|
53
|
+
const data = readDailyFile();
|
|
54
|
+
const today = todayISO();
|
|
55
|
+
if (!data.byDay[today])
|
|
56
|
+
data.byDay[today] = { cost: 0, calls: 0, cachedCalls: 0 };
|
|
57
|
+
data.byDay[today].cost += cost;
|
|
58
|
+
data.byDay[today].calls += 1;
|
|
59
|
+
data.byDay[today].cachedCalls = (data.byDay[today].cachedCalls ?? 0) + (cached > 0 ? 1 : 0);
|
|
60
|
+
data.allTime.cost += cost;
|
|
61
|
+
data.allTime.calls += 1;
|
|
62
|
+
data.allTime.cachedCalls = (data.allTime.cachedCalls ?? 0) + (cached > 0 ? 1 : 0);
|
|
63
|
+
writeDailyFile(data);
|
|
64
|
+
}
|
|
65
|
+
export function getSessionCost() { return sessionCost; }
|
|
66
|
+
export function getCallCount() { return sessionCallCount; }
|
|
67
|
+
/**
|
|
68
|
+
* Fraction of session calls whose prompt hit the OpenAI prompt cache.
|
|
69
|
+
*
|
|
70
|
+
* A call counts as a "hit" when `cachedPromptTokens > 0` (any portion of the
|
|
71
|
+
* prompt was served from cache). Returns 0 when no calls have been recorded.
|
|
72
|
+
* Range: 0..1.
|
|
73
|
+
*/
|
|
74
|
+
export function getCacheHitRate() {
|
|
75
|
+
if (sessionCallCount === 0)
|
|
76
|
+
return 0;
|
|
77
|
+
return sessionCachedCallCount / sessionCallCount;
|
|
78
|
+
}
|
|
79
|
+
export function getDailyTotals() {
|
|
80
|
+
const data = readDailyFile();
|
|
81
|
+
const today = todayISO();
|
|
82
|
+
const day = data.byDay[today] ?? { cost: 0, calls: 0 };
|
|
83
|
+
return {
|
|
84
|
+
date: today,
|
|
85
|
+
cost: day.cost,
|
|
86
|
+
calls: day.calls,
|
|
87
|
+
costAllTime: data.allTime.cost,
|
|
88
|
+
callsAllTime: data.allTime.calls,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function setBudget(usd) { budget = usd; }
|
|
92
|
+
export function isBudgetExceeded() {
|
|
93
|
+
return budget !== null && sessionCost > budget;
|
|
94
|
+
}
|
|
95
|
+
export function resetCost() {
|
|
96
|
+
sessionCost = 0;
|
|
97
|
+
sessionCallCount = 0;
|
|
98
|
+
sessionCachedCallCount = 0;
|
|
99
|
+
budget = null;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=cost-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../healing/cost-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,4EAA4E;AAC5E,wEAAwE;AACxE,yCAAyC;AACzC,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;AAEpC,MAAM,gBAAgB,GAAI,YAAY,CAAC,KAAK,GAAI,OAAS,CAAC;AAC1D,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,GAAG,OAAS,CAAC;AAC1D,MAAM,WAAW,GAAS,YAAY,CAAC,MAAM,GAAG,OAAS,CAAC;AAE1D,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC;AAE1C,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,IAAI,sBAAsB,GAAG,CAAC,CAAC,CAAC,8CAA8C;AAC9E,IAAI,MAAM,GAAkB,IAAI,CAAC;AAgBjC,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;AACpE,CAAC;AAOD,SAAS,aAAa;IACpB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IACvD,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAoB;IAC1C,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,aAAa,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,CAAC,kBAAkB,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,GAAG,gBAAgB;UACxB,MAAM,GAAG,iBAAiB;UAC1B,CAAC,CAAC,gBAAgB,GAAG,WAAW,CAAC;IAC9C,WAAW,IAAI,IAAI,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,IAAI,MAAM,GAAG,CAAC;QAAE,sBAAsB,EAAE,CAAC;IAEzC,gDAAgD;IAChD,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAClF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,cAAc,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,KAAa,OAAO,WAAW,CAAC,CAAC,CAAC;AAChE,MAAM,UAAU,YAAY,KAAa,OAAO,gBAAgB,CAAC,CAAC,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,gBAAgB,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,sBAAsB,GAAG,gBAAgB,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACvD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;QAC9B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAkB,IAAU,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;AACrE,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,KAAK,IAAI,IAAI,WAAW,GAAG,MAAM,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,WAAW,GAAG,CAAC,CAAC;IAChB,gBAAgB,GAAG,CAAC,CAAC;IACrB,sBAAsB,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Page, Locator } from '@playwright/test';
|
|
2
|
+
import type { Candidate, ScopedCandidate } from './types.js';
|
|
3
|
+
export type { Candidate };
|
|
4
|
+
export interface ExtractOptions {
|
|
5
|
+
scope?: Locator;
|
|
6
|
+
}
|
|
7
|
+
export declare function extractCandidates(page: Page, options?: ExtractOptions): Promise<Candidate[]>;
|
|
8
|
+
export declare function extractScopedCandidates(page: import('@playwright/test').Page, picked: import('@playwright/test').ElementHandle, level: 1 | 2 | 3 | 4): Promise<ScopedCandidate[]>;
|
|
9
|
+
//# sourceMappingURL=dom-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-extractor.d.ts","sourceRoot":"","sources":["../../healing/dom-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7D,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,SAAS,EAAE,CAAC,CAuItB;AAKD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,OAAO,kBAAkB,EAAE,IAAI,EACrC,MAAM,EAAE,OAAO,kBAAkB,EAAE,aAAa,EAChD,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GACnB,OAAO,CAAC,eAAe,EAAE,CAAC,CAqH5B"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
export async function extractCandidates(page, options = {}) {
|
|
2
|
+
// NOTE: This function is serialised and sent to the browser context by Playwright.
|
|
3
|
+
// It must NOT reference any outer-scope variables — everything is declared inline.
|
|
4
|
+
const scriptFn = (root) => {
|
|
5
|
+
const SELECTOR_UNION = [
|
|
6
|
+
'button', 'input', 'a', 'select', 'textarea',
|
|
7
|
+
'[role="button"]', '[role="link"]', '[role="textbox"]',
|
|
8
|
+
'[role="combobox"]', '[role="checkbox"]',
|
|
9
|
+
'[onclick]', '[data-testid]', '[data-test]', '[data-cy]',
|
|
10
|
+
].join(', ');
|
|
11
|
+
const GENERATED_CLASS_RE = /^[a-z]+-[a-z0-9]{5,}$/;
|
|
12
|
+
const DATA_ATTRS_ALLOWLIST = new Set(['data-testid', 'data-test', 'data-cy', 'data-qa']);
|
|
13
|
+
const MAX_CANDIDATES = 100;
|
|
14
|
+
const elements = Array.from((root || document).querySelectorAll(SELECTOR_UNION));
|
|
15
|
+
function isVisible(el) {
|
|
16
|
+
const rect = el.getBoundingClientRect();
|
|
17
|
+
if (rect.width === 0 || rect.height === 0)
|
|
18
|
+
return false;
|
|
19
|
+
const style = getComputedStyle(el);
|
|
20
|
+
if (style.display === 'none')
|
|
21
|
+
return false;
|
|
22
|
+
if (style.visibility === 'hidden')
|
|
23
|
+
return false;
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
const visible = elements.filter(isVisible);
|
|
27
|
+
visible.sort((a, b) => {
|
|
28
|
+
const aFold = a.getBoundingClientRect().top < window.innerHeight ? 0 : 1;
|
|
29
|
+
const bFold = b.getBoundingClientRect().top < window.innerHeight ? 0 : 1;
|
|
30
|
+
return aFold - bFold;
|
|
31
|
+
});
|
|
32
|
+
return visible.slice(0, MAX_CANDIDATES).map((el) => {
|
|
33
|
+
const rect = el.getBoundingClientRect();
|
|
34
|
+
const rawClasses = Array.from(el.classList)
|
|
35
|
+
.filter((c) => !GENERATED_CLASS_RE.test(c))
|
|
36
|
+
.slice(0, 5);
|
|
37
|
+
const dataAttrs = {};
|
|
38
|
+
for (const attr of el.getAttributeNames()) {
|
|
39
|
+
if (DATA_ATTRS_ALLOWLIST.has(attr)) {
|
|
40
|
+
dataAttrs[attr] = el.getAttribute(attr);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
tag: el.tagName.toLowerCase(),
|
|
45
|
+
id: el.id || undefined,
|
|
46
|
+
classes: rawClasses,
|
|
47
|
+
text: (el.textContent || '').trim().slice(0, 100),
|
|
48
|
+
ariaLabel: el.getAttribute('aria-label') || undefined,
|
|
49
|
+
// Only emit `role` when the element has an EXPLICIT role attribute.
|
|
50
|
+
// Falling back to the tag name (e.g. 'textarea' for <textarea>) misleads
|
|
51
|
+
// the LLM into generating role=textarea[...] selectors, but ARIA roles
|
|
52
|
+
// for HTML tags are different (textarea → 'textbox'). The LLM already
|
|
53
|
+
// knows the implicit mapping from the system prompt and has `tag` info.
|
|
54
|
+
role: el.getAttribute('role') || undefined,
|
|
55
|
+
placeholder: el.getAttribute('placeholder') || undefined,
|
|
56
|
+
name: el.getAttribute('name') || undefined,
|
|
57
|
+
type: el.getAttribute('type') || undefined,
|
|
58
|
+
title: el.getAttribute('title') || undefined,
|
|
59
|
+
// For <a> tags, expose the pathname portion of href so the LLM can
|
|
60
|
+
// generate stable href-based CSS selectors like a[href$='/x'] for
|
|
61
|
+
// navigation/sidebar links — without it the LLM shoots blind.
|
|
62
|
+
href: el.tagName === 'A'
|
|
63
|
+
? (() => {
|
|
64
|
+
const raw = el.getAttribute('href') || '';
|
|
65
|
+
try {
|
|
66
|
+
return raw.startsWith('http') ? new URL(raw).pathname : raw;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return raw;
|
|
70
|
+
}
|
|
71
|
+
})().slice(0, 200) || undefined
|
|
72
|
+
: undefined,
|
|
73
|
+
dataAttrs: Object.keys(dataAttrs).length > 0 ? dataAttrs : undefined,
|
|
74
|
+
// ── Enrichments (see types.ts CandidateSchema for rationale) ─────
|
|
75
|
+
associatedLabel: (() => {
|
|
76
|
+
const id = el.id;
|
|
77
|
+
if (id) {
|
|
78
|
+
// CSS.escape isn't reliable for selector strings in all browsers
|
|
79
|
+
// running here — use attribute selector with escaped quotes.
|
|
80
|
+
const safe = id.replace(/"/g, '\\"');
|
|
81
|
+
const lab = document.querySelector(`label[for="${safe}"]`);
|
|
82
|
+
if (lab)
|
|
83
|
+
return (lab.textContent || '').trim().slice(0, 80) || undefined;
|
|
84
|
+
}
|
|
85
|
+
// Wrapping <label> ancestor
|
|
86
|
+
let p = el.parentElement;
|
|
87
|
+
for (let depth = 0; p && depth < 4; depth++) {
|
|
88
|
+
if (p.tagName === 'LABEL')
|
|
89
|
+
return (p.textContent || '').trim().slice(0, 80) || undefined;
|
|
90
|
+
p = p.parentElement;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
})(),
|
|
94
|
+
parentRole: (() => {
|
|
95
|
+
// Walk up to find nearest landmark / dialog ancestor
|
|
96
|
+
const LANDMARKS = new Set(['NAV', 'MAIN', 'ASIDE', 'HEADER', 'FOOTER', 'DIALOG', 'FORM', 'SECTION']);
|
|
97
|
+
let p = el.parentElement;
|
|
98
|
+
for (let depth = 0; p && depth < 8; depth++) {
|
|
99
|
+
const explicitRole = p.getAttribute('role');
|
|
100
|
+
if (explicitRole)
|
|
101
|
+
return explicitRole;
|
|
102
|
+
if (LANDMARKS.has(p.tagName)) {
|
|
103
|
+
const map = {
|
|
104
|
+
NAV: 'navigation', MAIN: 'main', ASIDE: 'complementary',
|
|
105
|
+
HEADER: 'banner', FOOTER: 'contentinfo', DIALOG: 'dialog',
|
|
106
|
+
FORM: 'form', SECTION: 'region',
|
|
107
|
+
};
|
|
108
|
+
return map[p.tagName];
|
|
109
|
+
}
|
|
110
|
+
p = p.parentElement;
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
})(),
|
|
114
|
+
siblingsSameTag: (() => {
|
|
115
|
+
const parent = el.parentElement;
|
|
116
|
+
if (!parent)
|
|
117
|
+
return undefined;
|
|
118
|
+
const sameTag = parent.querySelectorAll(`:scope > ${el.tagName.toLowerCase()}`);
|
|
119
|
+
return sameTag.length > 1 ? sameTag.length : undefined;
|
|
120
|
+
})(),
|
|
121
|
+
outerHTMLSnippet: (() => {
|
|
122
|
+
// Only emit for composite / nested cases: when the candidate has
|
|
123
|
+
// children that contain text. Skips plain <input>/<a>Text</a>.
|
|
124
|
+
const html = el.outerHTML || '';
|
|
125
|
+
if (html.length < 80)
|
|
126
|
+
return undefined;
|
|
127
|
+
// Trim attributes that bloat the snippet without helping (style, srcset).
|
|
128
|
+
return html.slice(0, 200);
|
|
129
|
+
})(),
|
|
130
|
+
position: rect.top < window.innerHeight ? 'above-fold' : 'below-fold',
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
if (options.scope) {
|
|
135
|
+
return options.scope.evaluate(scriptFn);
|
|
136
|
+
}
|
|
137
|
+
return page.evaluate(scriptFn);
|
|
138
|
+
}
|
|
139
|
+
// Levels: 1=tight (picked + siblings + parent's children), 2=medium (parent
|
|
140
|
+
// subtree + grandparent's direct children), 3=broad (grandparent subtree),
|
|
141
|
+
// 4=document. Caps: 10/15/20/40.
|
|
142
|
+
export async function extractScopedCandidates(page, picked, level) {
|
|
143
|
+
const cap = level === 1 ? 10 : level === 2 ? 15 : level === 3 ? 20 : 40;
|
|
144
|
+
return picked.evaluate((el, args) => {
|
|
145
|
+
const target = el;
|
|
146
|
+
const cap = args.cap;
|
|
147
|
+
const level = args.level;
|
|
148
|
+
function chooseRoot(node) {
|
|
149
|
+
if (level === 1)
|
|
150
|
+
return node.parentElement ?? node;
|
|
151
|
+
if (level === 2) {
|
|
152
|
+
const gp = node.parentElement?.parentElement;
|
|
153
|
+
return gp ?? node.parentElement ?? node;
|
|
154
|
+
}
|
|
155
|
+
if (level === 3) {
|
|
156
|
+
const gp = node.parentElement?.parentElement;
|
|
157
|
+
return gp ?? document.body;
|
|
158
|
+
}
|
|
159
|
+
return document.body;
|
|
160
|
+
}
|
|
161
|
+
function pathTo(e) {
|
|
162
|
+
const segs = [];
|
|
163
|
+
for (let n = e; n && n !== document.documentElement; n = n.parentElement) {
|
|
164
|
+
let i = 1;
|
|
165
|
+
for (let s = n.previousElementSibling; s; s = s.previousElementSibling) {
|
|
166
|
+
if (s.tagName === n.tagName)
|
|
167
|
+
i++;
|
|
168
|
+
}
|
|
169
|
+
segs.unshift(`${n.tagName.toLowerCase()}[${i}]`);
|
|
170
|
+
}
|
|
171
|
+
return '/' + segs.join('/');
|
|
172
|
+
}
|
|
173
|
+
function neighborTextOf(e) {
|
|
174
|
+
const parts = [];
|
|
175
|
+
const prev = e.previousElementSibling;
|
|
176
|
+
const next = e.nextElementSibling;
|
|
177
|
+
if (prev)
|
|
178
|
+
parts.push((prev.textContent ?? '').trim().slice(0, 80));
|
|
179
|
+
if (next)
|
|
180
|
+
parts.push((next.textContent ?? '').trim().slice(0, 80));
|
|
181
|
+
const parent = e.parentElement;
|
|
182
|
+
if (parent) {
|
|
183
|
+
for (const sib of Array.from(parent.children)) {
|
|
184
|
+
if (sib === e || sib === prev || sib === next)
|
|
185
|
+
continue;
|
|
186
|
+
parts.push((sib.textContent ?? '').trim().slice(0, 80));
|
|
187
|
+
if (parts.length >= 4)
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return parts.filter(Boolean).join(' | ').slice(0, 240);
|
|
192
|
+
}
|
|
193
|
+
function parentRoleOf(e) {
|
|
194
|
+
let p = e.parentElement;
|
|
195
|
+
while (p) {
|
|
196
|
+
const r = p.getAttribute('role');
|
|
197
|
+
if (r && ['navigation', 'main', 'dialog', 'aside', 'banner', 'contentinfo', 'form', 'search'].includes(r))
|
|
198
|
+
return r;
|
|
199
|
+
const tn = p.tagName.toLowerCase();
|
|
200
|
+
if (['nav', 'main', 'dialog', 'aside', 'header', 'footer', 'form'].includes(tn))
|
|
201
|
+
return tn;
|
|
202
|
+
p = p.parentElement;
|
|
203
|
+
}
|
|
204
|
+
return '';
|
|
205
|
+
}
|
|
206
|
+
const root = chooseRoot(target);
|
|
207
|
+
const interactiveSel = 'button, input, a, select, textarea, [role], [data-testid], [data-test], [data-cy], h1, h2, h3, h4';
|
|
208
|
+
const found = new Set();
|
|
209
|
+
found.add(target);
|
|
210
|
+
for (const node of Array.from(root.querySelectorAll(interactiveSel))) {
|
|
211
|
+
found.add(node);
|
|
212
|
+
if (found.size >= cap)
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
const list = Array.from(found).slice(0, cap);
|
|
216
|
+
return list.map((e) => {
|
|
217
|
+
const dataAttrs = {};
|
|
218
|
+
for (const a of Array.from(e.attributes)) {
|
|
219
|
+
if (!a.name.startsWith('data-'))
|
|
220
|
+
continue;
|
|
221
|
+
if (['data-testid', 'data-test', 'data-cy'].includes(a.name))
|
|
222
|
+
continue;
|
|
223
|
+
dataAttrs[a.name] = a.value;
|
|
224
|
+
}
|
|
225
|
+
const id = e.getAttribute('id') ?? '';
|
|
226
|
+
let associatedLabel = '';
|
|
227
|
+
if (id) {
|
|
228
|
+
const lab = document.querySelector(`label[for="${id.replace(/"/g, '\\"')}"]`);
|
|
229
|
+
if (lab)
|
|
230
|
+
associatedLabel = (lab.textContent ?? '').trim().slice(0, 80);
|
|
231
|
+
}
|
|
232
|
+
if (!associatedLabel) {
|
|
233
|
+
const pl = e.closest('label');
|
|
234
|
+
if (pl)
|
|
235
|
+
associatedLabel = (pl.textContent ?? '').trim().slice(0, 80);
|
|
236
|
+
}
|
|
237
|
+
let siblingsSameTag = 0;
|
|
238
|
+
const parent = e.parentElement;
|
|
239
|
+
if (parent) {
|
|
240
|
+
for (const s of Array.from(parent.children))
|
|
241
|
+
if (s.tagName === e.tagName)
|
|
242
|
+
siblingsSameTag++;
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
tag: e.tagName.toLowerCase(),
|
|
246
|
+
id: id || undefined,
|
|
247
|
+
classes: Array.from(e.classList).slice(0, 5),
|
|
248
|
+
text: (e.textContent ?? '').trim().slice(0, 80) || undefined,
|
|
249
|
+
ariaLabel: e.getAttribute('aria-label') ?? undefined,
|
|
250
|
+
role: e.getAttribute('role') ?? undefined,
|
|
251
|
+
accessibleName: e.getAttribute('aria-label') || (e.textContent ?? '').trim().slice(0, 80) || undefined,
|
|
252
|
+
dataTestId: e.getAttribute('data-testid') ?? e.getAttribute('data-test') ?? e.getAttribute('data-cy') ?? undefined,
|
|
253
|
+
dataAttrs: Object.keys(dataAttrs).length ? dataAttrs : undefined,
|
|
254
|
+
name: e.getAttribute('name') ?? undefined,
|
|
255
|
+
type: e.getAttribute('type') ?? undefined,
|
|
256
|
+
placeholder: e.getAttribute('placeholder') ?? undefined,
|
|
257
|
+
href: e.getAttribute('href') ?? undefined,
|
|
258
|
+
associatedLabel: associatedLabel || undefined,
|
|
259
|
+
parentRole: parentRoleOf(e) || undefined,
|
|
260
|
+
siblingsSameTag,
|
|
261
|
+
neighborText: neighborTextOf(e) || undefined,
|
|
262
|
+
xpathRelative: pathTo(e),
|
|
263
|
+
outerHTMLSnippet: e.outerHTML.slice(0, 200),
|
|
264
|
+
};
|
|
265
|
+
});
|
|
266
|
+
}, { cap, level });
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=dom-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-extractor.js","sourceRoot":"","sources":["../../healing/dom-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type HealingErrorCode = 'auth' | 'refusal' | 'bad-description' | 'network' | 'exhausted' | 'version' | 'config' | 'debug-panel-lost' | 'llm-empty' | 'aborted' | 'circuit-open' | 'invalid-cache' | 'invalid-filter-chain' | 'no-operator-in-ci' | 'cache-drift' | 'overlay-lost' | 'identity-drift' | 'shadow-unsupported';
|
|
2
|
+
export declare class HealingError extends Error {
|
|
3
|
+
readonly code: HealingErrorCode;
|
|
4
|
+
constructor(message: string, code: HealingErrorCode);
|
|
5
|
+
}
|
|
6
|
+
export interface HealContext {
|
|
7
|
+
originalSelector: string;
|
|
8
|
+
action: string;
|
|
9
|
+
callSite: string;
|
|
10
|
+
attempts?: number;
|
|
11
|
+
}
|
|
12
|
+
declare abstract class HealErrorBase extends Error {
|
|
13
|
+
readonly context: HealContext;
|
|
14
|
+
abstract readonly code: 'cancelled' | 'exhausted' | 'llm';
|
|
15
|
+
readonly cause?: unknown;
|
|
16
|
+
constructor(message: string, context: HealContext, options?: {
|
|
17
|
+
cause?: unknown;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export declare class HealCancelledError extends HealErrorBase {
|
|
21
|
+
readonly code: "cancelled";
|
|
22
|
+
constructor(message: string, context: HealContext);
|
|
23
|
+
}
|
|
24
|
+
export declare class HealExhaustedError extends HealErrorBase {
|
|
25
|
+
readonly code: "exhausted";
|
|
26
|
+
constructor(message: string, context: HealContext);
|
|
27
|
+
}
|
|
28
|
+
export declare class HealLLMError extends HealErrorBase {
|
|
29
|
+
readonly code: "llm";
|
|
30
|
+
constructor(message: string, context: HealContext, cause?: unknown);
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../healing/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,SAAS,GACT,iBAAiB,GACjB,SAAS,GACT,WAAW,GACX,SAAS,GACT,QAAQ,GACR,kBAAkB,GAClB,WAAW,GACX,SAAS,GACT,cAAc,GACd,eAAe,GACf,sBAAsB,GACtB,mBAAmB,GACnB,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,oBAAoB,CAAC;AAEzB,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;gBAEpB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB;CAOpD;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uBAAe,aAAc,SAAQ,KAAK;aAGK,OAAO,EAAE,WAAW;IAFjE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,KAAK,CAAC;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBACb,OAAO,EAAE,MAAM,EAAkB,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKjG;AAED,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;gBACzB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW;CAIlD;AAED,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;gBACzB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW;CAIlD;AAED,qBAAa,YAAa,SAAQ,aAAa;IAC7C,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;gBACnB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO;CAInE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export class HealingError extends Error {
|
|
2
|
+
constructor(message, code) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'HealingError';
|
|
5
|
+
this.code = code;
|
|
6
|
+
// Maintain correct prototype chain in environments that transpile classes
|
|
7
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
class HealErrorBase extends Error {
|
|
11
|
+
constructor(message, context, options) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.context = context;
|
|
14
|
+
if (options && 'cause' in options)
|
|
15
|
+
this.cause = options.cause;
|
|
16
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class HealCancelledError extends HealErrorBase {
|
|
20
|
+
constructor(message, context) {
|
|
21
|
+
super(message, context);
|
|
22
|
+
this.code = 'cancelled';
|
|
23
|
+
this.name = 'HealCancelledError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class HealExhaustedError extends HealErrorBase {
|
|
27
|
+
constructor(message, context) {
|
|
28
|
+
super(message, context);
|
|
29
|
+
this.code = 'exhausted';
|
|
30
|
+
this.name = 'HealExhaustedError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class HealLLMError extends HealErrorBase {
|
|
34
|
+
constructor(message, context, cause) {
|
|
35
|
+
super(message, context, { cause });
|
|
36
|
+
this.code = 'llm';
|
|
37
|
+
this.name = 'HealLLMError';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../healing/errors.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAGrC,YAAY,OAAe,EAAE,IAAsB;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,0EAA0E;QAC1E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AASD,MAAe,aAAc,SAAQ,KAAK;IAGxC,YAAY,OAAe,EAAkB,OAAoB,EAAE,OAA6B;QAC9F,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,YAAO,GAAP,OAAO,CAAa;QAE/D,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAEnD,YAAY,OAAe,EAAE,OAAoB;QAC/C,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAFjB,SAAI,GAAG,WAAoB,CAAC;QAGnC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAEnD,YAAY,OAAe,EAAE,OAAoB;QAC/C,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAFjB,SAAI,GAAG,WAAoB,CAAC;QAGnC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,aAAa;IAE7C,YAAY,OAAe,EAAE,OAAoB,EAAE,KAAe;QAChE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAF5B,SAAI,GAAG,KAAc,CAAC;QAG7B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk the stack of `new Error()` and find the first frame that lives outside
|
|
3
|
+
* `healing/` and `node_modules/` — that's the test/POM source line that
|
|
4
|
+
* triggered the heal. Returns a trimmed snippet (the failing line plus the
|
|
5
|
+
* comment immediately above it, if any) for use as the LLM `description`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function inferDescriptionFromCallsite(stack?: string): string;
|
|
8
|
+
//# sourceMappingURL=caller-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caller-context.d.ts","sourceRoot":"","sources":["../../../healing/heal/caller-context.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBnE"}
|