tamash-playwright 0.3.0 → 0.5.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/.env.example +5 -0
- package/README.md +53 -2
- package/dist/bindings/index.d.ts.map +1 -1
- package/dist/bindings/index.js +3 -0
- package/dist/bindings/index.js.map +1 -1
- package/dist/bindings/locator.binding.d.ts +4 -3
- package/dist/bindings/locator.binding.d.ts.map +1 -1
- package/dist/bindings/locator.binding.js +197 -7
- package/dist/bindings/locator.binding.js.map +1 -1
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +126 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/scanDescribe.d.ts +11 -0
- package/dist/cli/scanDescribe.d.ts.map +1 -0
- package/dist/cli/scanDescribe.js +84 -0
- package/dist/cli/scanDescribe.js.map +1 -0
- package/dist/healer/action-recovery.d.ts +14 -0
- package/dist/healer/action-recovery.d.ts.map +1 -0
- package/dist/healer/action-recovery.js +102 -0
- package/dist/healer/action-recovery.js.map +1 -0
- package/dist/healer/index.d.ts +10 -2
- package/dist/healer/index.d.ts.map +1 -1
- package/dist/healer/index.js +297 -72
- package/dist/healer/index.js.map +1 -1
- package/dist/healer/providers/anthropic.d.ts.map +1 -1
- package/dist/healer/providers/anthropic.js +70 -0
- package/dist/healer/providers/anthropic.js.map +1 -1
- package/dist/healer/providers/gemini.d.ts.map +1 -1
- package/dist/healer/providers/gemini.js +99 -0
- package/dist/healer/providers/gemini.js.map +1 -1
- package/dist/healer/providers/ollama.d.ts.map +1 -1
- package/dist/healer/providers/ollama.js +113 -0
- package/dist/healer/providers/ollama.js.map +1 -1
- package/dist/healer/providers/openai.d.ts.map +1 -1
- package/dist/healer/providers/openai.js +99 -0
- package/dist/healer/providers/openai.js.map +1 -1
- package/dist/healer/providers/prompt.d.ts +7 -1
- package/dist/healer/providers/prompt.d.ts.map +1 -1
- package/dist/healer/providers/prompt.js +95 -1
- package/dist/healer/providers/prompt.js.map +1 -1
- package/dist/healer/providers/types.d.ts +36 -0
- package/dist/healer/providers/types.d.ts.map +1 -1
- package/dist/healer/providers/vision-models.d.ts +3 -0
- package/dist/healer/providers/vision-models.d.ts.map +1 -0
- package/dist/healer/providers/vision-models.js +40 -0
- package/dist/healer/providers/vision-models.js.map +1 -0
- package/dist/healer/replay-action.d.ts +3 -0
- package/dist/healer/replay-action.d.ts.map +1 -0
- package/dist/healer/replay-action.js +83 -0
- package/dist/healer/replay-action.js.map +1 -0
- package/dist/healer/vision.d.ts +25 -0
- package/dist/healer/vision.d.ts.map +1 -0
- package/dist/healer/vision.js +75 -0
- package/dist/healer/vision.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -1
|
@@ -36,8 +36,44 @@ export type ProviderResult = {
|
|
|
36
36
|
suggestion: SelectorSuggestion;
|
|
37
37
|
usage?: TokenUsage;
|
|
38
38
|
};
|
|
39
|
+
export type VisionPoint = {
|
|
40
|
+
found: true;
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
} | {
|
|
44
|
+
found: false;
|
|
45
|
+
};
|
|
46
|
+
export type SuggestElementFromImageInput = {
|
|
47
|
+
action: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
/** Raw PNG bytes, base64-encoded, no `data:` URI prefix. */
|
|
50
|
+
imageBase64: string;
|
|
51
|
+
timeoutMs?: number;
|
|
52
|
+
};
|
|
53
|
+
export type VisionProviderResult = {
|
|
54
|
+
point: VisionPoint;
|
|
55
|
+
usage?: TokenUsage;
|
|
56
|
+
};
|
|
57
|
+
export type ActionTactic = 'scroll' | 'force' | 'wait' | 'dispatch' | 'none';
|
|
58
|
+
export type SuggestActionTacticInput = {
|
|
59
|
+
action: string;
|
|
60
|
+
/** The error message from the failed replay attempt (not a selector problem). */
|
|
61
|
+
errorMessage: string;
|
|
62
|
+
timeoutMs?: number;
|
|
63
|
+
};
|
|
64
|
+
export type ActionTacticResult = {
|
|
65
|
+
tactic: ActionTactic;
|
|
66
|
+
usage?: TokenUsage;
|
|
67
|
+
};
|
|
39
68
|
export type HealProvider = {
|
|
40
69
|
name: string;
|
|
41
70
|
suggestSelector(input: SuggestSelectorInput): Promise<ProviderResult | null>;
|
|
71
|
+
/** True when this provider's configured model is expected to accept image input; gates whether
|
|
72
|
+
* suggestSelectorFromImage is actually called — the method itself is always implemented (all
|
|
73
|
+
* four providers implement every method unconditionally), so callers should key off this flag,
|
|
74
|
+
* not the method's presence. */
|
|
75
|
+
supportsVision: boolean;
|
|
76
|
+
suggestSelectorFromImage(input: SuggestElementFromImageInput): Promise<VisionProviderResult | null>;
|
|
77
|
+
suggestActionTactic(input: SuggestActionTacticInput): Promise<ActionTacticResult | null>;
|
|
42
78
|
};
|
|
43
79
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AAOF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEnF,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AAMF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAE7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7E;;;oCAGgC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,wBAAwB,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAGpG,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;CAC1F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-models.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/vision-models.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAgCxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAMjF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isVisionCapableModel = isVisionCapableModel;
|
|
4
|
+
// New models ship constantly, so this will go stale — it's a best-effort heuristic, not an
|
|
5
|
+
// authoritative capability registry. Getting it wrong is cheap either way: a false positive just
|
|
6
|
+
// means the vision fallback is attempted and the provider call fails/degrades (see each
|
|
7
|
+
// provider's suggestSelectorFromImage error handling); a false negative just means the vision
|
|
8
|
+
// fallback never gets attempted, same as today.
|
|
9
|
+
const VISION_PATTERNS = {
|
|
10
|
+
openai: {
|
|
11
|
+
include: [/gpt-4o/i, /gpt-4\.1/i, /gpt-4\.5/i, /gpt-5/i, /\bo1\b/i, /\bo3\b/i, /\bo4\b/i, /vision/i],
|
|
12
|
+
exclude: [/gpt-3\.5/i, /embedding/i, /whisper/i, /\btts\b/i, /moderation/i],
|
|
13
|
+
},
|
|
14
|
+
anthropic: {
|
|
15
|
+
// All current Claude 3+ models are multimodal; Claude 2.x and Instant predate vision support.
|
|
16
|
+
include: [/claude-(3|4|5)/i, /claude-(opus|sonnet|haiku)-(3|4|5)/i],
|
|
17
|
+
exclude: [/claude-2/i, /claude-instant/i],
|
|
18
|
+
},
|
|
19
|
+
gemini: {
|
|
20
|
+
// Every Gemini chat model from 1.5 onward is multimodal by default.
|
|
21
|
+
include: [/gemini/i],
|
|
22
|
+
exclude: [/embedding/i, /\baqa\b/i],
|
|
23
|
+
},
|
|
24
|
+
ollama: {
|
|
25
|
+
include: [/llava/i, /bakllava/i, /moondream/i, /llama3\.2-vision/i, /qwen2(\.5)?-vl/i, /minicpm-v/i, /pixtral/i, /granite3\.2-vision/i, /gemma-?[3-9]/i, /vision/i],
|
|
26
|
+
exclude: [],
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
// The gemma pattern above matches at the family level (gemma3, gemma4, ...) even though each
|
|
30
|
+
// family's smallest variant (e.g. gemma3:1b) is text-only — the tag naming isn't consistent enough
|
|
31
|
+
// to reliably split by parameter size, so this is a documented false-positive risk for those
|
|
32
|
+
// specific small tags rather than something solved here.
|
|
33
|
+
function isVisionCapableModel(vendor, model) {
|
|
34
|
+
const { include, exclude } = VISION_PATTERNS[vendor];
|
|
35
|
+
if (exclude.some((pattern) => pattern.test(model))) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return include.some((pattern) => pattern.test(model));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=vision-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-models.js","sourceRoot":"","sources":["../../../src/healer/providers/vision-models.ts"],"names":[],"mappings":";;;AAEA,2FAA2F;AAC3F,iGAAiG;AACjG,wFAAwF;AACxF,8FAA8F;AAC9F,gDAAgD;AAChD,MAAM,eAAe,GAAmE;IACtF,MAAM,EAAE;QACN,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACpG,OAAO,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC;KAC5E;IACD,SAAS,EAAE;QACT,8FAA8F;QAC9F,OAAO,EAAE,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;QACnE,OAAO,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC;KAC1C;IACD,MAAM,EAAE;QACN,oEAAoE;QACpE,OAAO,EAAE,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC;KACpC;IACD,MAAM,EAAE;QACN,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,eAAe,EAAE,SAAS,CAAC;QACnK,OAAO,EAAE,EAAE;KACZ;CACF,CAAC;AAEF,6FAA6F;AAC7F,mGAAmG;AACnG,6FAA6F;AAC7F,yDAAyD;AACzD,8BAAqC,MAAoB,EAAE,KAAa;IACtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-action.d.ts","sourceRoot":"","sources":["../../src/healer/replay-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAQhD,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAyE/G"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.replayAction = replayAction;
|
|
4
|
+
// `dragTo`/`drop` (and anything else outside this list) can't be safely "healed" by guessing a
|
|
5
|
+
// substitute locator and clicking it — that would silently perform the wrong action and report
|
|
6
|
+
// a false recovery, so those actions are excluded rather than defaulted to `.click()`.
|
|
7
|
+
//
|
|
8
|
+
// Kept in its own leaf module (rather than healer/index.ts, where it originally lived) so both
|
|
9
|
+
// index.ts and action-recovery.ts can import it without either needing to import the other.
|
|
10
|
+
async function replayAction(locator, action, callArgs = []) {
|
|
11
|
+
const [firstArg] = callArgs;
|
|
12
|
+
switch (action) {
|
|
13
|
+
case 'click':
|
|
14
|
+
return locator.click();
|
|
15
|
+
case 'dblclick':
|
|
16
|
+
return locator.dblclick();
|
|
17
|
+
case 'tap':
|
|
18
|
+
return locator.tap();
|
|
19
|
+
case 'hover':
|
|
20
|
+
return locator.hover();
|
|
21
|
+
case 'fill':
|
|
22
|
+
return locator.fill(String(firstArg ?? ''));
|
|
23
|
+
case 'clear':
|
|
24
|
+
return locator.clear();
|
|
25
|
+
case 'press':
|
|
26
|
+
return locator.press(String(firstArg ?? ''));
|
|
27
|
+
case 'check':
|
|
28
|
+
return locator.check();
|
|
29
|
+
case 'uncheck':
|
|
30
|
+
return locator.uncheck();
|
|
31
|
+
case 'selectOption':
|
|
32
|
+
return locator.selectOption(firstArg);
|
|
33
|
+
case 'setInputFiles':
|
|
34
|
+
return locator.setInputFiles(firstArg);
|
|
35
|
+
case 'focus':
|
|
36
|
+
return locator.focus();
|
|
37
|
+
case 'blur':
|
|
38
|
+
return locator.blur();
|
|
39
|
+
case 'type':
|
|
40
|
+
return locator.type(String(firstArg ?? ''));
|
|
41
|
+
case 'pressSequentially':
|
|
42
|
+
return locator.pressSequentially(String(firstArg ?? ''));
|
|
43
|
+
case 'setChecked':
|
|
44
|
+
return locator.setChecked(Boolean(firstArg));
|
|
45
|
+
case 'scrollIntoViewIfNeeded':
|
|
46
|
+
return locator.scrollIntoViewIfNeeded();
|
|
47
|
+
case 'dispatchEvent':
|
|
48
|
+
return locator.dispatchEvent(String(firstArg ?? ''), callArgs[1]);
|
|
49
|
+
case 'waitFor':
|
|
50
|
+
return locator.waitFor(firstArg);
|
|
51
|
+
case 'textContent':
|
|
52
|
+
return locator.textContent();
|
|
53
|
+
case 'innerText':
|
|
54
|
+
return locator.innerText();
|
|
55
|
+
case 'getAttribute':
|
|
56
|
+
return locator.getAttribute(String(firstArg ?? ''));
|
|
57
|
+
case 'inputValue':
|
|
58
|
+
return locator.inputValue();
|
|
59
|
+
case 'isChecked':
|
|
60
|
+
return locator.isChecked();
|
|
61
|
+
case 'isEnabled':
|
|
62
|
+
return locator.isEnabled();
|
|
63
|
+
case 'isDisabled':
|
|
64
|
+
return locator.isDisabled();
|
|
65
|
+
case 'isEditable':
|
|
66
|
+
return locator.isEditable();
|
|
67
|
+
case 'innerHTML':
|
|
68
|
+
return locator.innerHTML();
|
|
69
|
+
case 'selectText':
|
|
70
|
+
return locator.selectText();
|
|
71
|
+
case 'screenshot':
|
|
72
|
+
return locator.screenshot();
|
|
73
|
+
case 'boundingBox':
|
|
74
|
+
return locator.boundingBox();
|
|
75
|
+
case 'elementHandle':
|
|
76
|
+
return locator.elementHandle();
|
|
77
|
+
case 'ariaSnapshot':
|
|
78
|
+
return locator.ariaSnapshot();
|
|
79
|
+
default:
|
|
80
|
+
throw new Error(`Action "${action}" cannot be safely replayed by the self-healer.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=replay-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-action.js","sourceRoot":"","sources":["../../src/healer/replay-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Frame, FrameLocator, Page } from '@playwright/test';
|
|
2
|
+
import type { VisionPoint } from './providers/types';
|
|
3
|
+
export type PageContext = Page | Frame | FrameLocator;
|
|
4
|
+
export type ViewportBox = {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
};
|
|
10
|
+
export type ScrollOffset = {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
};
|
|
14
|
+
export type VisionCapture = {
|
|
15
|
+
imageBase64: string;
|
|
16
|
+
box: ViewportBox;
|
|
17
|
+
scroll: ScrollOffset;
|
|
18
|
+
};
|
|
19
|
+
export declare function captureElementForVision(pageContext: PageContext, timeoutMs: number): Promise<VisionCapture | undefined>;
|
|
20
|
+
export declare function resolveElementAtVisionPoint(pageContext: PageContext, point: Extract<VisionPoint, {
|
|
21
|
+
found: true;
|
|
22
|
+
}>, box: ViewportBox, scroll: ScrollOffset, timeoutMs: number): Promise<string | undefined>;
|
|
23
|
+
export declare function visionTagSelector(id: string): string;
|
|
24
|
+
export declare function cleanupVisionTag(pageContext: PageContext, id: string): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=vision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../src/healer/vision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,KAAK,GAAG,YAAY,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAClF,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAOF,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAkB7H;AAUD,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC,EAC5C,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA0B7B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD;AAID,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.captureElementForVision = captureElementForVision;
|
|
4
|
+
exports.resolveElementAtVisionPoint = resolveElementAtVisionPoint;
|
|
5
|
+
exports.visionTagSelector = visionTagSelector;
|
|
6
|
+
exports.cleanupVisionTag = cleanupVisionTag;
|
|
7
|
+
// Verified empirically (real Chromium run, not assumed): `:root`'s screenshot captures the FULL
|
|
8
|
+
// document height, not just the current viewport — a 2000px-tall document produces a 2000px-tall
|
|
9
|
+
// PNG regardless of scroll position. So a normalized point the vision model returns is a
|
|
10
|
+
// *document*-relative position; resolveElementAtVisionPoint() below is what converts that back to
|
|
11
|
+
// something elementFromPoint() can actually use.
|
|
12
|
+
async function captureElementForVision(pageContext, timeoutMs) {
|
|
13
|
+
const root = pageContext.locator(':root');
|
|
14
|
+
try {
|
|
15
|
+
const box = await root.boundingBox({ timeout: timeoutMs });
|
|
16
|
+
if (!box) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const [screenshot, scroll] = await Promise.all([
|
|
20
|
+
root.screenshot({ timeout: timeoutMs }),
|
|
21
|
+
root.evaluate(() => ({ x: window.scrollX, y: window.scrollY })),
|
|
22
|
+
]);
|
|
23
|
+
return { imageBase64: screenshot.toString('base64'), box, scroll };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const HEAL_ATTRIBUTE = 'data-tamash-heal-id';
|
|
30
|
+
// Verified empirically: boundingBox() on `:root` is viewport-relative (its `y` goes negative as
|
|
31
|
+
// the page scrolls down), so `box.{x,y} + scroll.{x,y}` recovers true document coordinates
|
|
32
|
+
// regardless of scroll state at capture time. elementFromPoint() itself only accepts
|
|
33
|
+
// viewport-relative coordinates and returns null for anything currently scrolled out of view, so
|
|
34
|
+
// resolution has to scroll first — done in a single evaluate() call so the scroll and the lookup
|
|
35
|
+
// happen atomically, with no round trip in between for the page to move again.
|
|
36
|
+
async function resolveElementAtVisionPoint(pageContext, point, box, scroll, timeoutMs) {
|
|
37
|
+
const docX = box.x + scroll.x + (point.x / 1000) * box.width;
|
|
38
|
+
const docY = box.y + scroll.y + (point.y / 1000) * box.height;
|
|
39
|
+
try {
|
|
40
|
+
const id = await pageContext.locator(':root').evaluate((_rootEl, [dx, dy]) => {
|
|
41
|
+
window.scrollTo({ left: Math.max(0, dx - window.innerWidth / 2), top: Math.max(0, dy - window.innerHeight / 2) });
|
|
42
|
+
const vx = dx - window.scrollX;
|
|
43
|
+
const vy = dy - window.scrollY;
|
|
44
|
+
const el = document.elementFromPoint(vx, vy);
|
|
45
|
+
if (!el || el === document.documentElement || el === document.body) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const generatedId = `tamash-heal-${Math.random().toString(36).slice(2)}`;
|
|
49
|
+
el.setAttribute('data-tamash-heal-id', generatedId);
|
|
50
|
+
return generatedId;
|
|
51
|
+
}, [docX, docY], { timeout: timeoutMs });
|
|
52
|
+
return id ?? undefined;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function visionTagSelector(id) {
|
|
59
|
+
return `[${HEAL_ATTRIBUTE}="${id}"]`;
|
|
60
|
+
}
|
|
61
|
+
// Best-effort: the healed action itself may have removed/replaced the tagged element (e.g. it
|
|
62
|
+
// was a "dismiss" button), so a failure here is expected sometimes and not worth surfacing.
|
|
63
|
+
async function cleanupVisionTag(pageContext, id) {
|
|
64
|
+
try {
|
|
65
|
+
// `HEAL_ATTRIBUTE` must be passed as an explicit evaluate() argument, not closed over — the
|
|
66
|
+
// callback is serialized and runs standalone in the page, with no access to this module's
|
|
67
|
+
// Node-side scope (confirmed the hard way: closing over it threw "HEAL_ATTRIBUTE is not
|
|
68
|
+
// defined" inside the browser context).
|
|
69
|
+
await pageContext.locator(visionTagSelector(id)).evaluate((el, attr) => el.removeAttribute(attr), HEAL_ATTRIBUTE);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Ignore — see above.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=vision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision.js","sourceRoot":"","sources":["../../src/healer/vision.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { test, expect } from './bindings';
|
|
2
2
|
export type { BindingFixtures } from './bindings';
|
|
3
|
-
export { bindPageActions, bindFrameActions, bindLocatorActions, bindTargetActions } from './bindings/locator.binding';
|
|
3
|
+
export { bindPageActions, bindFrameActions, bindLocatorActions, bindTargetActions, bindContext } from './bindings/locator.binding';
|
|
4
4
|
export { healActionFailure, getHealingReports } from './healer';
|
|
5
5
|
export type { SelfHealingReport } from './healer';
|
|
6
|
-
export type { HealProvider, SelectorSuggestion, SuggestSelectorInput, TokenUsage, ProviderResult } from './healer/providers/types';
|
|
6
|
+
export type { HealProvider, SelectorSuggestion, SuggestSelectorInput, TokenUsage, ProviderResult, VisionPoint, SuggestElementFromImageInput, VisionProviderResult, ActionTactic, SuggestActionTacticInput, ActionTacticResult } from './healer/providers/types';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEnI,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,YAAY,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getHealingReports = exports.healActionFailure = exports.bindTargetActions = exports.bindLocatorActions = exports.bindFrameActions = exports.bindPageActions = exports.expect = exports.test = void 0;
|
|
3
|
+
exports.getHealingReports = exports.healActionFailure = exports.bindContext = exports.bindTargetActions = exports.bindLocatorActions = exports.bindFrameActions = exports.bindPageActions = exports.expect = exports.test = void 0;
|
|
4
4
|
var bindings_1 = require("./bindings");
|
|
5
5
|
Object.defineProperty(exports, "test", { enumerable: true, get: function () { return bindings_1.test; } });
|
|
6
6
|
Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return bindings_1.expect; } });
|
|
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "bindPageActions", { enumerable: true, get: funct
|
|
|
9
9
|
Object.defineProperty(exports, "bindFrameActions", { enumerable: true, get: function () { return locator_binding_1.bindFrameActions; } });
|
|
10
10
|
Object.defineProperty(exports, "bindLocatorActions", { enumerable: true, get: function () { return locator_binding_1.bindLocatorActions; } });
|
|
11
11
|
Object.defineProperty(exports, "bindTargetActions", { enumerable: true, get: function () { return locator_binding_1.bindTargetActions; } });
|
|
12
|
+
Object.defineProperty(exports, "bindContext", { enumerable: true, get: function () { return locator_binding_1.bindContext; } });
|
|
12
13
|
var healer_1 = require("./healer");
|
|
13
14
|
Object.defineProperty(exports, "healActionFailure", { enumerable: true, get: function () { return healer_1.healActionFailure; } });
|
|
14
15
|
Object.defineProperty(exports, "getHealingReports", { enumerable: true, get: function () { return healer_1.getHealingReports; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA0C;AAAjC,gGAAA,IAAI,OAAA;AAAE,kGAAA,MAAM,OAAA;AAErB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA0C;AAAjC,gGAAA,IAAI,OAAA;AAAE,kGAAA,MAAM,OAAA;AAErB,8DAAmI;AAA1H,kHAAA,eAAe,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AAAE,qHAAA,kBAAkB,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAAE,8GAAA,WAAW,OAAA;AAE9F,mCAAgE;AAAvD,2GAAA,iBAAiB,OAAA;AAAE,2GAAA,iBAAiB,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tamash-playwright",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Plug and Play Self-healing for Playwright and automatically recovers broken selectors using an AI model (Ollama, OpenAI, Anthropic, or Gemini).",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"tamash-playwright": "dist/cli/index.js"
|
|
9
|
+
},
|
|
7
10
|
"files": [
|
|
8
11
|
"dist",
|
|
9
12
|
"README.md",
|