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.
Files changed (64) hide show
  1. package/.env.example +5 -0
  2. package/README.md +53 -2
  3. package/dist/bindings/index.d.ts.map +1 -1
  4. package/dist/bindings/index.js +3 -0
  5. package/dist/bindings/index.js.map +1 -1
  6. package/dist/bindings/locator.binding.d.ts +4 -3
  7. package/dist/bindings/locator.binding.d.ts.map +1 -1
  8. package/dist/bindings/locator.binding.js +197 -7
  9. package/dist/bindings/locator.binding.js.map +1 -1
  10. package/dist/cli/doctor.d.ts +2 -0
  11. package/dist/cli/doctor.d.ts.map +1 -0
  12. package/dist/cli/doctor.js +126 -0
  13. package/dist/cli/doctor.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +26 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/cli/scanDescribe.d.ts +11 -0
  19. package/dist/cli/scanDescribe.d.ts.map +1 -0
  20. package/dist/cli/scanDescribe.js +84 -0
  21. package/dist/cli/scanDescribe.js.map +1 -0
  22. package/dist/healer/action-recovery.d.ts +14 -0
  23. package/dist/healer/action-recovery.d.ts.map +1 -0
  24. package/dist/healer/action-recovery.js +102 -0
  25. package/dist/healer/action-recovery.js.map +1 -0
  26. package/dist/healer/index.d.ts +10 -2
  27. package/dist/healer/index.d.ts.map +1 -1
  28. package/dist/healer/index.js +297 -72
  29. package/dist/healer/index.js.map +1 -1
  30. package/dist/healer/providers/anthropic.d.ts.map +1 -1
  31. package/dist/healer/providers/anthropic.js +70 -0
  32. package/dist/healer/providers/anthropic.js.map +1 -1
  33. package/dist/healer/providers/gemini.d.ts.map +1 -1
  34. package/dist/healer/providers/gemini.js +99 -0
  35. package/dist/healer/providers/gemini.js.map +1 -1
  36. package/dist/healer/providers/ollama.d.ts.map +1 -1
  37. package/dist/healer/providers/ollama.js +113 -0
  38. package/dist/healer/providers/ollama.js.map +1 -1
  39. package/dist/healer/providers/openai.d.ts.map +1 -1
  40. package/dist/healer/providers/openai.js +99 -0
  41. package/dist/healer/providers/openai.js.map +1 -1
  42. package/dist/healer/providers/prompt.d.ts +7 -1
  43. package/dist/healer/providers/prompt.d.ts.map +1 -1
  44. package/dist/healer/providers/prompt.js +95 -1
  45. package/dist/healer/providers/prompt.js.map +1 -1
  46. package/dist/healer/providers/types.d.ts +36 -0
  47. package/dist/healer/providers/types.d.ts.map +1 -1
  48. package/dist/healer/providers/vision-models.d.ts +3 -0
  49. package/dist/healer/providers/vision-models.d.ts.map +1 -0
  50. package/dist/healer/providers/vision-models.js +40 -0
  51. package/dist/healer/providers/vision-models.js.map +1 -0
  52. package/dist/healer/replay-action.d.ts +3 -0
  53. package/dist/healer/replay-action.d.ts.map +1 -0
  54. package/dist/healer/replay-action.js +83 -0
  55. package/dist/healer/replay-action.js.map +1 -0
  56. package/dist/healer/vision.d.ts +25 -0
  57. package/dist/healer/vision.d.ts.map +1 -0
  58. package/dist/healer/vision.js +75 -0
  59. package/dist/healer/vision.js.map +1 -0
  60. package/dist/index.d.ts +2 -2
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +2 -1
  63. package/dist/index.js.map +1 -1
  64. package/package.json +4 -1
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createGeminiProvider = createGeminiProvider;
4
4
  const prompt_1 = require("./prompt");
5
+ const vision_models_1 = require("./vision-models");
5
6
  // Fallback only — normally overridden by SuggestSelectorInput.timeoutMs, which mirrors the
6
7
  // Playwright project's configured actionTimeout so the healer never outlasts the action budget.
7
8
  const REQUEST_TIMEOUT_MS = 15000;
@@ -14,8 +15,10 @@ function createGeminiProvider() {
14
15
  // Gemini's OpenAI-compatible surface — same request/response shape as OpenAI's Chat
15
16
  // Completions API, so this reuses the same prompt/parsing logic as providers/openai.ts.
16
17
  const baseUrl = (process.env.GEMINI_BASE_URL ?? 'https://generativelanguage.googleapis.com/v1beta/openai').replace(/\/+$/, '');
18
+ const supportsVision = (0, vision_models_1.isVisionCapableModel)('gemini', model);
17
19
  return {
18
20
  name: `gemini:${model}`,
21
+ supportsVision,
19
22
  async suggestSelector(input) {
20
23
  const controller = new AbortController();
21
24
  const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
@@ -61,6 +64,102 @@ function createGeminiProvider() {
61
64
  clearTimeout(timeout);
62
65
  }
63
66
  },
67
+ async suggestSelectorFromImage(input) {
68
+ const controller = new AbortController();
69
+ const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
70
+ try {
71
+ const response = await fetch(`${baseUrl}/chat/completions`, {
72
+ method: 'POST',
73
+ signal: controller.signal,
74
+ headers: {
75
+ 'content-type': 'application/json',
76
+ authorization: `Bearer ${apiKey}`,
77
+ },
78
+ body: JSON.stringify({
79
+ model,
80
+ temperature: 0,
81
+ response_format: { type: 'json_object' },
82
+ messages: [
83
+ { role: 'system', content: prompt_1.VISION_SYSTEM_PROMPT },
84
+ {
85
+ role: 'user',
86
+ content: [
87
+ { type: 'text', text: (0, prompt_1.buildVisionUserPrompt)(input) },
88
+ { type: 'image_url', image_url: { url: `data:image/png;base64,${input.imageBase64}` } },
89
+ ],
90
+ },
91
+ ],
92
+ }),
93
+ });
94
+ if (!response.ok) {
95
+ console.warn(`[self-healer] Gemini vision request failed: ${response.status} ${response.statusText}`);
96
+ return null;
97
+ }
98
+ const payload = await response.json();
99
+ const content = payload.choices?.[0]?.message?.content;
100
+ if (!content) {
101
+ return null;
102
+ }
103
+ const point = (0, prompt_1.parseVisionSuggestion)(content);
104
+ if (!point) {
105
+ return null;
106
+ }
107
+ return { point, usage: (0, prompt_1.extractOpenAICompatibleUsage)(payload) };
108
+ }
109
+ catch (error) {
110
+ const reason = error instanceof Error ? error.message : String(error);
111
+ console.warn(`[self-healer] Gemini vision provider error: ${reason}`);
112
+ return null;
113
+ }
114
+ finally {
115
+ clearTimeout(timeout);
116
+ }
117
+ },
118
+ async suggestActionTactic(input) {
119
+ const controller = new AbortController();
120
+ const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
121
+ try {
122
+ const response = await fetch(`${baseUrl}/chat/completions`, {
123
+ method: 'POST',
124
+ signal: controller.signal,
125
+ headers: {
126
+ 'content-type': 'application/json',
127
+ authorization: `Bearer ${apiKey}`,
128
+ },
129
+ body: JSON.stringify({
130
+ model,
131
+ temperature: 0,
132
+ response_format: { type: 'json_object' },
133
+ messages: [
134
+ { role: 'system', content: prompt_1.ACTION_RECOVERY_SYSTEM_PROMPT },
135
+ { role: 'user', content: (0, prompt_1.buildActionRecoveryUserPrompt)(input) },
136
+ ],
137
+ }),
138
+ });
139
+ if (!response.ok) {
140
+ console.warn(`[self-healer] Gemini action-recovery request failed: ${response.status} ${response.statusText}`);
141
+ return null;
142
+ }
143
+ const payload = await response.json();
144
+ const content = payload.choices?.[0]?.message?.content;
145
+ if (!content) {
146
+ return null;
147
+ }
148
+ const tactic = (0, prompt_1.parseActionTacticSuggestion)(content);
149
+ if (!tactic) {
150
+ return null;
151
+ }
152
+ return { tactic, usage: (0, prompt_1.extractOpenAICompatibleUsage)(payload) };
153
+ }
154
+ catch (error) {
155
+ const reason = error instanceof Error ? error.message : String(error);
156
+ console.warn(`[self-healer] Gemini action-recovery provider error: ${reason}`);
157
+ return null;
158
+ }
159
+ finally {
160
+ clearTimeout(timeout);
161
+ }
162
+ },
64
163
  };
65
164
  }
66
165
  //# sourceMappingURL=gemini.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/healer/providers/gemini.ts"],"names":[],"mappings":";;;AACA,qCAAyG;AAEzG,2FAA2F;AAC3F,gGAAgG;AAChG,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;IACE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAEvC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oFAAoF;IACpF,wFAAwF;IACxF,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yDAAyD,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE/H,OAAO;QACL,IAAI,EAAE,UAAU,KAAK,EAAE;QACvB,KAAK,CAAC,eAAe,CAAC,KAA2B;YAC/C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;YAE5F,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,EAAE;oBAC1D,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;qBAClC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK;wBACL,WAAW,EAAE,CAAC;wBACd,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;wBACxC,QAAQ,EAAE;4BACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAa,EAAE;4BAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAA,wBAAe,EAAC,KAAK,CAAC,EAAE;yBAClD;qBACF,CAAC;iBACH,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,wCAAwC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;oBAC/F,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAGlC,CAAC;gBACF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;gBACvD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,UAAU,GAAG,IAAA,wBAAe,EAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAA,qCAA4B,EAAC,OAAO,CAAC,EAAE,CAAC;YACtE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/healer/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAwC,MAAM,SAAS,CAAC;AAOlF,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CA6E1D"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,YAAY,EAAsH,MAAM,SAAS,CAAC;AAQpL,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CA2M1D"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createOllamaProvider = createOllamaProvider;
4
4
  const prompt_1 = require("./prompt");
5
+ const vision_models_1 = require("./vision-models");
5
6
  // Fallback only — normally overridden by SuggestSelectorInput.timeoutMs, which mirrors the
6
7
  // Playwright project's configured actionTimeout so the healer never outlasts the action budget.
7
8
  const REQUEST_TIMEOUT_MS = 15000;
@@ -12,8 +13,10 @@ function createOllamaProvider() {
12
13
  return null;
13
14
  }
14
15
  const baseUrl = (process.env.OLLAMA_BASE_URL ?? 'https://ollama.com').replace(/\/+$/, '');
16
+ const supportsVision = (0, vision_models_1.isVisionCapableModel)('ollama', model);
15
17
  return {
16
18
  name: `ollama:${model}`,
19
+ supportsVision,
17
20
  async suggestSelector(input) {
18
21
  const controller = new AbortController();
19
22
  const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
@@ -71,6 +74,116 @@ function createOllamaProvider() {
71
74
  clearTimeout(timeout);
72
75
  }
73
76
  },
77
+ async suggestSelectorFromImage(input) {
78
+ const controller = new AbortController();
79
+ const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
80
+ try {
81
+ const response = await fetch(`${baseUrl}/api/chat`, {
82
+ method: 'POST',
83
+ signal: controller.signal,
84
+ headers: {
85
+ 'content-type': 'application/json',
86
+ authorization: `Bearer ${apiKey}`,
87
+ },
88
+ body: JSON.stringify({
89
+ model,
90
+ stream: false,
91
+ format: 'json',
92
+ options: { temperature: 0 },
93
+ messages: [
94
+ { role: 'system', content: prompt_1.VISION_SYSTEM_PROMPT },
95
+ { role: 'user', content: (0, prompt_1.buildVisionUserPrompt)(input), images: [input.imageBase64] },
96
+ ],
97
+ }),
98
+ });
99
+ if (!response.ok) {
100
+ console.warn(`[self-healer] Ollama vision request failed: ${response.status} ${response.statusText}`);
101
+ return null;
102
+ }
103
+ const payload = await response.json();
104
+ const content = payload.message?.content;
105
+ if (!content) {
106
+ return null;
107
+ }
108
+ const point = (0, prompt_1.parseVisionSuggestion)(content);
109
+ if (!point) {
110
+ return null;
111
+ }
112
+ const inputTokens = payload.prompt_eval_count;
113
+ const outputTokens = payload.eval_count;
114
+ return {
115
+ point,
116
+ usage: {
117
+ inputTokens,
118
+ outputTokens,
119
+ totalTokens: inputTokens !== undefined && outputTokens !== undefined ? inputTokens + outputTokens : undefined,
120
+ },
121
+ };
122
+ }
123
+ catch (error) {
124
+ const reason = error instanceof Error ? error.message : String(error);
125
+ console.warn(`[self-healer] Ollama vision provider error: ${reason}`);
126
+ return null;
127
+ }
128
+ finally {
129
+ clearTimeout(timeout);
130
+ }
131
+ },
132
+ async suggestActionTactic(input) {
133
+ const controller = new AbortController();
134
+ const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
135
+ try {
136
+ const response = await fetch(`${baseUrl}/api/chat`, {
137
+ method: 'POST',
138
+ signal: controller.signal,
139
+ headers: {
140
+ 'content-type': 'application/json',
141
+ authorization: `Bearer ${apiKey}`,
142
+ },
143
+ body: JSON.stringify({
144
+ model,
145
+ stream: false,
146
+ format: 'json',
147
+ options: { temperature: 0 },
148
+ messages: [
149
+ { role: 'system', content: prompt_1.ACTION_RECOVERY_SYSTEM_PROMPT },
150
+ { role: 'user', content: (0, prompt_1.buildActionRecoveryUserPrompt)(input) },
151
+ ],
152
+ }),
153
+ });
154
+ if (!response.ok) {
155
+ console.warn(`[self-healer] Ollama action-recovery request failed: ${response.status} ${response.statusText}`);
156
+ return null;
157
+ }
158
+ const payload = await response.json();
159
+ const content = payload.message?.content;
160
+ if (!content) {
161
+ return null;
162
+ }
163
+ const tactic = (0, prompt_1.parseActionTacticSuggestion)(content);
164
+ if (!tactic) {
165
+ return null;
166
+ }
167
+ const inputTokens = payload.prompt_eval_count;
168
+ const outputTokens = payload.eval_count;
169
+ return {
170
+ tactic,
171
+ usage: {
172
+ inputTokens,
173
+ outputTokens,
174
+ totalTokens: inputTokens !== undefined && outputTokens !== undefined ? inputTokens + outputTokens : undefined,
175
+ },
176
+ };
177
+ }
178
+ catch (error) {
179
+ const reason = error instanceof Error ? error.message : String(error);
180
+ console.warn(`[self-healer] Ollama action-recovery provider error: ${reason}`);
181
+ return null;
182
+ }
183
+ finally {
184
+ clearTimeout(timeout);
185
+ }
186
+ },
74
187
  };
75
188
  }
76
189
  //# sourceMappingURL=ollama.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/healer/providers/ollama.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/healer/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAwC,MAAM,SAAS,CAAC;AAOlF,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CAgE1D"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,YAAY,EAAsH,MAAM,SAAS,CAAC;AAQpL,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CA8K1D"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createOpenAIProvider = createOpenAIProvider;
4
4
  const prompt_1 = require("./prompt");
5
+ const vision_models_1 = require("./vision-models");
5
6
  // Fallback only — normally overridden by SuggestSelectorInput.timeoutMs, which mirrors the
6
7
  // Playwright project's configured actionTimeout so the healer never outlasts the action budget.
7
8
  const REQUEST_TIMEOUT_MS = 15000;
@@ -12,8 +13,10 @@ function createOpenAIProvider() {
12
13
  return null;
13
14
  }
14
15
  const baseUrl = (process.env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1').replace(/\/+$/, '');
16
+ const supportsVision = (0, vision_models_1.isVisionCapableModel)('openai', model);
15
17
  return {
16
18
  name: `openai:${model}`,
19
+ supportsVision,
17
20
  async suggestSelector(input) {
18
21
  const controller = new AbortController();
19
22
  const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
@@ -59,6 +62,102 @@ function createOpenAIProvider() {
59
62
  clearTimeout(timeout);
60
63
  }
61
64
  },
65
+ async suggestSelectorFromImage(input) {
66
+ const controller = new AbortController();
67
+ const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
68
+ try {
69
+ const response = await fetch(`${baseUrl}/chat/completions`, {
70
+ method: 'POST',
71
+ signal: controller.signal,
72
+ headers: {
73
+ 'content-type': 'application/json',
74
+ authorization: `Bearer ${apiKey}`,
75
+ },
76
+ body: JSON.stringify({
77
+ model,
78
+ temperature: 0,
79
+ response_format: { type: 'json_object' },
80
+ messages: [
81
+ { role: 'system', content: prompt_1.VISION_SYSTEM_PROMPT },
82
+ {
83
+ role: 'user',
84
+ content: [
85
+ { type: 'text', text: (0, prompt_1.buildVisionUserPrompt)(input) },
86
+ { type: 'image_url', image_url: { url: `data:image/png;base64,${input.imageBase64}` } },
87
+ ],
88
+ },
89
+ ],
90
+ }),
91
+ });
92
+ if (!response.ok) {
93
+ console.warn(`[self-healer] OpenAI vision request failed: ${response.status} ${response.statusText}`);
94
+ return null;
95
+ }
96
+ const payload = await response.json();
97
+ const content = payload.choices?.[0]?.message?.content;
98
+ if (!content) {
99
+ return null;
100
+ }
101
+ const point = (0, prompt_1.parseVisionSuggestion)(content);
102
+ if (!point) {
103
+ return null;
104
+ }
105
+ return { point, usage: (0, prompt_1.extractOpenAICompatibleUsage)(payload) };
106
+ }
107
+ catch (error) {
108
+ const reason = error instanceof Error ? error.message : String(error);
109
+ console.warn(`[self-healer] OpenAI vision provider error: ${reason}`);
110
+ return null;
111
+ }
112
+ finally {
113
+ clearTimeout(timeout);
114
+ }
115
+ },
116
+ async suggestActionTactic(input) {
117
+ const controller = new AbortController();
118
+ const timeout = setTimeout(() => controller.abort(), input.timeoutMs ?? REQUEST_TIMEOUT_MS);
119
+ try {
120
+ const response = await fetch(`${baseUrl}/chat/completions`, {
121
+ method: 'POST',
122
+ signal: controller.signal,
123
+ headers: {
124
+ 'content-type': 'application/json',
125
+ authorization: `Bearer ${apiKey}`,
126
+ },
127
+ body: JSON.stringify({
128
+ model,
129
+ temperature: 0,
130
+ response_format: { type: 'json_object' },
131
+ messages: [
132
+ { role: 'system', content: prompt_1.ACTION_RECOVERY_SYSTEM_PROMPT },
133
+ { role: 'user', content: (0, prompt_1.buildActionRecoveryUserPrompt)(input) },
134
+ ],
135
+ }),
136
+ });
137
+ if (!response.ok) {
138
+ console.warn(`[self-healer] OpenAI action-recovery request failed: ${response.status} ${response.statusText}`);
139
+ return null;
140
+ }
141
+ const payload = await response.json();
142
+ const content = payload.choices?.[0]?.message?.content;
143
+ if (!content) {
144
+ return null;
145
+ }
146
+ const tactic = (0, prompt_1.parseActionTacticSuggestion)(content);
147
+ if (!tactic) {
148
+ return null;
149
+ }
150
+ return { tactic, usage: (0, prompt_1.extractOpenAICompatibleUsage)(payload) };
151
+ }
152
+ catch (error) {
153
+ const reason = error instanceof Error ? error.message : String(error);
154
+ console.warn(`[self-healer] OpenAI action-recovery provider error: ${reason}`);
155
+ return null;
156
+ }
157
+ finally {
158
+ clearTimeout(timeout);
159
+ }
160
+ },
62
161
  };
63
162
  }
64
163
  //# sourceMappingURL=openai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/healer/providers/openai.ts"],"names":[],"mappings":";;;AACA,qCAAyG;AAEzG,2FAA2F;AAC3F,gGAAgG;AAChG,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;IACE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAEvC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,2BAA2B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEjG,OAAO;QACL,IAAI,EAAE,UAAU,KAAK,EAAE;QACvB,KAAK,CAAC,eAAe,CAAC,KAA2B;YAC/C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;YAE5F,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,EAAE;oBAC1D,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;qBAClC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK;wBACL,WAAW,EAAE,CAAC;wBACd,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;wBACxC,QAAQ,EAAE;4BACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAa,EAAE;4BAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAA,wBAAe,EAAC,KAAK,CAAC,EAAE;yBAClD;qBACF,CAAC;iBACH,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,wCAAwC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;oBAC/F,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAGlC,CAAC;gBACF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;gBACvD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,UAAU,GAAG,IAAA,wBAAe,EAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAA,qCAA4B,EAAC,OAAO,CAAC,EAAE,CAAC;YACtE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/healer/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,13 @@
1
- import type { SelectorSuggestion, SuggestSelectorInput, TokenUsage } from './types';
1
+ import type { ActionTactic, SelectorSuggestion, SuggestActionTacticInput, SuggestElementFromImageInput, SuggestSelectorInput, TokenUsage, VisionPoint } from './types';
2
2
  export declare const SYSTEM_PROMPT = "You are a Playwright self-healing assistant.\nYou will be given an ARIA accessibility snapshot of a web page, an action that just failed, and a human description of the element the test intended to interact with.\nPick the single best-matching element that is LITERALLY present in the snapshot and respond with strict JSON only (no markdown, no prose) matching one of:\n{\"strategy\":\"role\",\"role\":\"<aria role>\",\"name\":\"<accessible name>\"}\n{\"strategy\":\"text\",\"text\":\"<visible text>\"}\n{\"strategy\":\"testId\",\"testId\":\"<test id>\"}\n{\"strategy\":\"label\",\"label\":\"<label text>\"}\n{\"strategy\":\"placeholder\",\"placeholder\":\"<placeholder text>\"}\n{\"strategy\":\"css\",\"css\":\"<css selector>\"}\n{\"strategy\":\"none\"}\nIf nothing in the snapshot plausibly matches the description, respond with {\"strategy\":\"none\"}. Never invent an element that isn't in the snapshot.";
3
3
  export declare function buildUserPrompt(input: SuggestSelectorInput): string;
4
4
  export declare function parseSuggestion(content: string): SelectorSuggestion | null;
5
+ export declare const VISION_SYSTEM_PROMPT = "You are a Playwright self-healing assistant.\nYou will be given a screenshot of a web page, an action that just failed, and a human description of the element the test intended to interact with.\nFind the single best-matching element that is LITERALLY visible in the screenshot and respond with strict JSON only (no markdown, no prose):\n{\"found\":true,\"x\":<0-1000>,\"y\":<0-1000>}\nWhere x and y are the CENTER of the matching element, expressed as its position within the image scaled to a 0-1000 range (0 = left/top edge, 1000 = right/bottom edge) \u2014 NOT raw pixel coordinates.\nIf nothing in the screenshot plausibly matches the description, respond with {\"found\":false}. Never invent an element that isn't visible in the image.";
6
+ export declare function buildVisionUserPrompt(input: SuggestElementFromImageInput): string;
7
+ export declare function parseVisionSuggestion(content: string): VisionPoint | null;
8
+ export declare const ACTION_RECOVERY_SYSTEM_PROMPT = "You are a Playwright self-healing assistant.\nAn element was already correctly located, but the action on it failed for the reason described below \u2014 this is NOT a selector problem, so do not suggest one. Given the error, choose the single tactic most likely to help:\n{\"tactic\":\"scroll\"} \u2014 the element may be outside the current viewport; scroll it into view, then retry the same action.\n{\"tactic\":\"force\"} \u2014 the error looks like an overly strict actionability check rather than something genuinely blocking the click (e.g. flagged as \"not stable\" during a finished animation, or a borderline visibility/bounding-box check); retry the same action bypassing Playwright's actionability checks. Note: force still performs a real coordinate-based click, so it will NOT help if another element is genuinely covering this one \u2014 use \"dispatch\" for that instead.\n{\"tactic\":\"wait\"} \u2014 the error suggests something transient (an animation or transition still settling, content still loading); wait briefly, then retry the same action.\n{\"tactic\":\"dispatch\"} \u2014 the element is genuinely covered/intercepted by another element on top of it, or force did not help; dispatch the underlying DOM event directly on the element instead of a real coordinate-based interaction. Last resort, since it skips real hit-testing entirely.\n{\"tactic\":\"none\"} \u2014 none of the above would plausibly help.\nRespond with strict JSON only (no markdown, no prose), exactly one of the five objects above.";
9
+ export declare function buildActionRecoveryUserPrompt(input: SuggestActionTacticInput): string;
10
+ export declare function parseActionTacticSuggestion(content: string): ActionTactic | null;
5
11
  export declare function extractOpenAICompatibleUsage(payload: {
6
12
  usage?: {
7
13
  prompt_tokens?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIpF,eAAO,MAAM,aAAa,g5BAU0H,CAAC;AAErJ,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAWnE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CA4C1E;AAID,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,UAAU,GAAG,SAAS,CAWvK"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIvK,eAAO,MAAM,aAAa,g5BAU0H,CAAC;AAErJ,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAWnE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CA4C1E;AAKD,eAAO,MAAM,oBAAoB,0uBAKsH,CAAC;AAExJ,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,4BAA4B,GAAG,MAAM,CAMjF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAiCzE;AASD,eAAO,MAAM,6BAA6B,4/CAOoD,CAAC;AAE/F,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAKrF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAsBhF;AAID,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,UAAU,GAAG,SAAS,CAWvK"}
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SYSTEM_PROMPT = void 0;
3
+ exports.ACTION_RECOVERY_SYSTEM_PROMPT = exports.VISION_SYSTEM_PROMPT = exports.SYSTEM_PROMPT = void 0;
4
4
  exports.buildUserPrompt = buildUserPrompt;
5
5
  exports.parseSuggestion = parseSuggestion;
6
+ exports.buildVisionUserPrompt = buildVisionUserPrompt;
7
+ exports.parseVisionSuggestion = parseVisionSuggestion;
8
+ exports.buildActionRecoveryUserPrompt = buildActionRecoveryUserPrompt;
9
+ exports.parseActionTacticSuggestion = parseActionTacticSuggestion;
6
10
  exports.extractOpenAICompatibleUsage = extractOpenAICompatibleUsage;
7
11
  const MAX_SNAPSHOT_CHARS = 8000;
8
12
  exports.SYSTEM_PROMPT = `You are a Playwright self-healing assistant.
@@ -71,6 +75,96 @@ function parseSuggestion(content) {
71
75
  }
72
76
  return null;
73
77
  }
78
+ // Used only as a fallback, after the ARIA/text-based prompt above has already failed to produce
79
+ // a working heal — this is strictly the second attempt, never the first (the text path is
80
+ // cheaper and already handles the common case).
81
+ exports.VISION_SYSTEM_PROMPT = `You are a Playwright self-healing assistant.
82
+ You will be given a screenshot of a web page, an action that just failed, and a human description of the element the test intended to interact with.
83
+ Find the single best-matching element that is LITERALLY visible in the screenshot and respond with strict JSON only (no markdown, no prose):
84
+ {"found":true,"x":<0-1000>,"y":<0-1000>}
85
+ Where x and y are the CENTER of the matching element, expressed as its position within the image scaled to a 0-1000 range (0 = left/top edge, 1000 = right/bottom edge) — NOT raw pixel coordinates.
86
+ If nothing in the screenshot plausibly matches the description, respond with {"found":false}. Never invent an element that isn't visible in the image.`;
87
+ function buildVisionUserPrompt(input) {
88
+ return [
89
+ `Failed action: ${input.action}`,
90
+ `Element description: ${input.description ?? '(none provided)'}`,
91
+ 'A screenshot of the page is attached.',
92
+ ].join('\n\n');
93
+ }
94
+ function parseVisionSuggestion(content) {
95
+ let parsed;
96
+ try {
97
+ parsed = JSON.parse(content);
98
+ }
99
+ catch {
100
+ const match = content.match(/\{[\s\S]*\}/);
101
+ if (!match) {
102
+ return null;
103
+ }
104
+ try {
105
+ parsed = JSON.parse(match[0]);
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ if (!parsed || typeof parsed !== 'object' || !('found' in parsed)) {
112
+ return null;
113
+ }
114
+ const point = parsed;
115
+ if (point.found === false) {
116
+ return { found: false };
117
+ }
118
+ if (point.found === true
119
+ && typeof point.x === 'number' && point.x >= 0 && point.x <= 1000
120
+ && typeof point.y === 'number' && point.y >= 0 && point.y <= 1000) {
121
+ return point;
122
+ }
123
+ return null;
124
+ }
125
+ const ACTION_TACTICS = ['scroll', 'force', 'wait', 'dispatch', 'none'];
126
+ // Used only after a locator has already been successfully healed (by the text or vision prompt
127
+ // above) but replaying the original action on it still failed for a reason that has nothing to do
128
+ // with the selector — the element was found, the action itself just couldn't complete. The AI's
129
+ // role here is deliberately narrow: pick ONE of a small fixed set of known-safe remediation
130
+ // tactics, never invent a new way to interact with the page.
131
+ exports.ACTION_RECOVERY_SYSTEM_PROMPT = `You are a Playwright self-healing assistant.
132
+ An element was already correctly located, but the action on it failed for the reason described below — this is NOT a selector problem, so do not suggest one. Given the error, choose the single tactic most likely to help:
133
+ {"tactic":"scroll"} — the element may be outside the current viewport; scroll it into view, then retry the same action.
134
+ {"tactic":"force"} — the error looks like an overly strict actionability check rather than something genuinely blocking the click (e.g. flagged as "not stable" during a finished animation, or a borderline visibility/bounding-box check); retry the same action bypassing Playwright's actionability checks. Note: force still performs a real coordinate-based click, so it will NOT help if another element is genuinely covering this one — use "dispatch" for that instead.
135
+ {"tactic":"wait"} — the error suggests something transient (an animation or transition still settling, content still loading); wait briefly, then retry the same action.
136
+ {"tactic":"dispatch"} — the element is genuinely covered/intercepted by another element on top of it, or force did not help; dispatch the underlying DOM event directly on the element instead of a real coordinate-based interaction. Last resort, since it skips real hit-testing entirely.
137
+ {"tactic":"none"} — none of the above would plausibly help.
138
+ Respond with strict JSON only (no markdown, no prose), exactly one of the five objects above.`;
139
+ function buildActionRecoveryUserPrompt(input) {
140
+ return [
141
+ `Failed action: ${input.action}`,
142
+ `Error: ${input.errorMessage}`,
143
+ ].join('\n\n');
144
+ }
145
+ function parseActionTacticSuggestion(content) {
146
+ let parsed;
147
+ try {
148
+ parsed = JSON.parse(content);
149
+ }
150
+ catch {
151
+ const match = content.match(/\{[\s\S]*\}/);
152
+ if (!match) {
153
+ return null;
154
+ }
155
+ try {
156
+ parsed = JSON.parse(match[0]);
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ if (!parsed || typeof parsed !== 'object' || !('tactic' in parsed)) {
163
+ return null;
164
+ }
165
+ const { tactic } = parsed;
166
+ return typeof tactic === 'string' && ACTION_TACTICS.includes(tactic) ? tactic : null;
167
+ }
74
168
  // Shared by any provider whose HTTP response mimics OpenAI's Chat Completions shape
75
169
  // (OpenAI itself, and Gemini's OpenAI-compatible endpoint).
76
170
  function extractOpenAICompatibleUsage(payload) {
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/healer/providers/prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/healer/providers/prompt.ts"],"names":[],"mappings":"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"}