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
@@ -3,12 +3,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isHealingEnabled = isHealingEnabled;
7
+ exports.isActionRecoveryEnabled = isActionRecoveryEnabled;
6
8
  exports.healActionFailure = healActionFailure;
7
9
  exports.getHealingReports = getHealingReports;
8
10
  const path_1 = __importDefault(require("path"));
9
11
  const test_1 = require("@playwright/test");
10
12
  const dotenv_1 = __importDefault(require("dotenv"));
11
13
  const providers_1 = require("./providers");
14
+ const vision_1 = require("./vision");
15
+ const replay_action_1 = require("./replay-action");
16
+ const action_recovery_1 = require("./action-recovery");
12
17
  dotenv_1.default.config({ path: path_1.default.resolve(process.cwd(), '.env') });
13
18
  const reports = [];
14
19
  function normalizeError(error) {
@@ -106,85 +111,149 @@ function describeSuggestion(suggestion) {
106
111
  return undefined;
107
112
  }
108
113
  }
109
- // `dragTo` (and anything else outside this list) can't be safely "healed" by guessing a
110
- // substitute locator and clicking it — that would silently perform the wrong action and report
111
- // a false recovery, so those actions are excluded rather than defaulted to `.click()`.
112
- async function replayAction(locator, action, callArgs = []) {
113
- const [firstArg] = callArgs;
114
- switch (action) {
115
- case 'click':
116
- return locator.click();
117
- case 'dblclick':
118
- return locator.dblclick();
119
- case 'tap':
120
- return locator.tap();
121
- case 'hover':
122
- return locator.hover();
123
- case 'fill':
124
- return locator.fill(String(firstArg ?? ''));
125
- case 'clear':
126
- return locator.clear();
127
- case 'press':
128
- return locator.press(String(firstArg ?? ''));
129
- case 'check':
130
- return locator.check();
131
- case 'uncheck':
132
- return locator.uncheck();
133
- case 'selectOption':
134
- return locator.selectOption(firstArg);
135
- case 'setInputFiles':
136
- return locator.setInputFiles(firstArg);
137
- case 'focus':
138
- return locator.focus();
139
- case 'blur':
140
- return locator.blur();
141
- default:
142
- throw new Error(`Action "${action}" cannot be safely replayed by the self-healer.`);
114
+ // Shared by both replay-failure sites (the text-based heal below and vision's own replay inside
115
+ // tryVisionRecovery) — only ever called when isActionRecoveryEnabled() is already true. Action
116
+ // recovery doesn't change *where* the element is, only how the already-resolved action on it is
117
+ // retried, so the caller passes in whichever selector description it already resolved (a text
118
+ // suggestion or a "visual match at (x,y)" description) to carry into the final report.
119
+ async function attemptActionRecoveryFallback(provider, locator, action, callArgs, replayError, timeoutMs, suggestedSelectorForReport, baseUsage) {
120
+ const actionRecovery = await (0, action_recovery_1.tryActionRecovery)(provider, locator, action, callArgs, normalizeError(replayError), timeoutMs);
121
+ const combinedUsage = baseUsage && actionRecovery.usage ? sumTokenUsage(baseUsage, actionRecovery.usage) : (actionRecovery.usage ?? baseUsage);
122
+ if (actionRecovery.healing) {
123
+ return {
124
+ healing: {
125
+ provider: actionRecovery.healing.provider,
126
+ warning: actionRecovery.healing.warning,
127
+ suggestedSelector: suggestedSelectorForReport,
128
+ result: actionRecovery.healing.result,
129
+ },
130
+ usage: combinedUsage,
131
+ };
143
132
  }
133
+ return { healing: null, usage: combinedUsage, stage: actionRecovery.stage };
144
134
  }
145
- // Token usage is captured whenever the provider call itself succeeded, independent of whether
146
- // the suggested selector actually worked — the tokens were spent either way, so a failed heal
147
- // still needs to be reported for cost tracking.
148
- async function tryRecoverWithProvider(pageContext, action, description, ariaSnapshot, callArgs, timeoutMs) {
149
- const provider = (0, providers_1.getHealProvider)();
150
- if (!provider || !pageContext || !ariaSnapshot) {
135
+ // Strictly a second try, called only after the ARIA/text-based attempt in healActionFailure has
136
+ // already run and failed to produce a working heal (including when there was no snapshot to
137
+ // search at all). Resolves the AI's screenshot-based point to a real DOM element by tagging it
138
+ // with a temporary attribute (see healer/vision.ts), then hands off to the exact same
139
+ // buildLocatorFromSuggestion/replayAction pipeline the text-based path uses — a tagged element is
140
+ // just another `{strategy:'css', css:'[data-tamash-heal-id="..."]'}` suggestion, so no separate
141
+ // replay logic is needed here.
142
+ async function tryVisionRecovery(provider, pageContext, action, description, callArgs, timeoutMs) {
143
+ const effectiveTimeoutMs = timeoutMs ?? 2000;
144
+ const capture = await (0, vision_1.captureElementForVision)(pageContext, effectiveTimeoutMs);
145
+ if (!capture) {
151
146
  return { healing: null };
152
147
  }
153
- const result = await provider.suggestSelector({ action, description, ariaSnapshot, timeoutMs });
148
+ const result = await provider.suggestSelectorFromImage({ action, description, imageBase64: capture.imageBase64, timeoutMs });
154
149
  if (!result) {
155
- return { healing: null };
150
+ return { healing: null, stage: 'vision_provider_error' };
156
151
  }
157
- const { suggestion, usage } = result;
158
- if (!suggestion || suggestion.strategy === 'none') {
159
- return { healing: null, usage };
152
+ const { point, usage } = result;
153
+ if (!point.found) {
154
+ return { healing: null, usage, stage: 'vision_declined' };
160
155
  }
161
- const locator = buildLocatorFromSuggestion(pageContext, suggestion);
162
- if (!locator) {
163
- return { healing: null, usage };
156
+ const id = await (0, vision_1.resolveElementAtVisionPoint)(pageContext, point, capture.box, capture.scroll, effectiveTimeoutMs);
157
+ if (!id) {
158
+ return { healing: null, usage, stage: 'vision_unresolvable' };
164
159
  }
160
+ const locator = pageContext.locator((0, vision_1.visionTagSelector)(id));
165
161
  try {
166
- const replayResult = await replayAction(locator, action, callArgs);
162
+ const replayResult = await (0, replay_action_1.replayAction)(locator, action, callArgs);
167
163
  return {
168
164
  healing: {
169
165
  provider: provider.name,
170
- healed: true,
171
- warning: `Recovered using ${provider.name} (${describeSuggestion(suggestion) ?? 'suggested selector'}).`,
172
- suggestedSelector: describeSuggestion(suggestion),
166
+ warning: `Recovered using ${provider.name} via visual match.`,
167
+ suggestedSelector: `visual match at (${point.x},${point.y})`,
173
168
  result: replayResult,
174
169
  },
175
170
  usage,
176
171
  };
177
172
  }
178
- catch {
179
- return { healing: null, usage };
173
+ catch (replayError) {
174
+ if (!isActionRecoveryEnabled()) {
175
+ return { healing: null, usage, stage: 'vision_replay_failed' };
176
+ }
177
+ const fallback = await attemptActionRecoveryFallback(provider, locator, action, callArgs, replayError, timeoutMs, `visual match at (${point.x},${point.y})`, usage);
178
+ return { ...fallback, usedActionRecovery: true };
179
+ }
180
+ finally {
181
+ await (0, vision_1.cleanupVisionTag)(pageContext, id);
180
182
  }
181
183
  }
184
+ // Every place a heal attempt can stop short of recovery — kept distinct (rather than collapsing
185
+ // everything into a single "failed") specifically so the report can show *how far* it got, not
186
+ // just that it didn't work. That's the difference between "the AI was never even asked" and "the
187
+ // AI took its best shot and was still wrong" — the second is real signal about where the healer
188
+ // itself needs to improve (prompt, snapshot quality, strategy coverage); the first is just config.
189
+ // Deliberately omits Python's "reentrant" stage: the replacement locator here is always built from
190
+ // the raw (un-proxied) page context captured in the Proxy's own closure, so a healed locator's own
191
+ // replay can never re-enter healActionFailure — this architecture can't hit that case at all.
192
+ const FAILURE_STAGE_MESSAGES = {
193
+ disabled: 'Healing is turned off (HEALER_ENABLED=false).',
194
+ 'not-a-selector-issue': 'The element was found, but the action itself could not complete — this is not a selector problem, so self-healing was not attempted.',
195
+ no_snapshot: "Could not capture the page's accessibility snapshot to search.",
196
+ no_provider: 'No AI provider is configured (missing API key/model).',
197
+ provider_error: 'The AI call itself failed or returned nothing usable (network error, unparseable response, etc.) — see the console log for detail.',
198
+ ai_declined: 'The AI found nothing in the snapshot plausibly matching the description (explicit {"strategy":"none"}).',
199
+ unbuildable_suggestion: "The AI's suggested strategy couldn't be turned into a locator.",
200
+ replay_failed: 'The AI suggested a replacement locator, but acting on it failed too.',
201
+ // Vision stages: only ever reached after the stages above have already failed to recover —
202
+ // vision is strictly a second try (see tryVisionRecovery below), gated on the configured
203
+ // provider's model actually supporting image input (see providers/vision-models.ts).
204
+ vision_provider_error: 'The vision-capable AI call itself failed or returned nothing usable — see the console log for detail.',
205
+ vision_declined: 'The AI found nothing in the screenshot plausibly matching the description (explicit {"found":false}).',
206
+ vision_unresolvable: "The AI pointed at a location in the screenshot, but no real element could be resolved there (empty background or the page root itself).",
207
+ vision_replay_failed: 'The AI located a visual match in the screenshot, but acting on it failed too.',
208
+ // Action-recovery stages: only ever reached after a locator has already been successfully
209
+ // healed (text or vision) but replaying the original action on it still failed — opt-in via
210
+ // HEALER_ACTION_RECOVERY_ENABLED (see isActionRecoveryEnabled below), off by default.
211
+ action_recovery_declined: 'The element was found, but none of the known recovery tactics (scroll, force, wait, dispatch) would plausibly help.',
212
+ action_recovery_failed: 'A recovery tactic was attempted (or the AI call to pick one failed), but the action still could not be completed.',
213
+ };
214
+ function sumOptional(a, b) {
215
+ if (a === undefined && b === undefined) {
216
+ return undefined;
217
+ }
218
+ return (a ?? 0) + (b ?? 0);
219
+ }
220
+ // Combines usage from the text-based attempt and the vision fallback when both ran — both
221
+ // represent real spend on recovering this one failure, so a failed heal that tried both still
222
+ // needs the full cost reported, not just whichever attempt happened to run last.
223
+ function sumTokenUsage(a, b) {
224
+ return {
225
+ inputTokens: sumOptional(a.inputTokens, b.inputTokens),
226
+ outputTokens: sumOptional(a.outputTokens, b.outputTokens),
227
+ totalTokens: sumOptional(a.totalTokens, b.totalTokens),
228
+ };
229
+ }
230
+ // Distinguishes "the locator couldn't find a matching element" (a genuine selector problem, worth
231
+ // trying an AI-suggested replacement) from "the locator found one real element but the action on
232
+ // it couldn't complete" (hidden/disabled/covered/detached — not a selector problem at all).
233
+ // Swapping in a different selector for the latter wouldn't fix anything and risks clicking a
234
+ // completely different element while falsely reporting "healed".
235
+ //
236
+ // Verified against real Chromium output: a timeout with zero matches and a strict-mode
237
+ // multi-match violation both omit a concrete-element line entirely (e.g. "resolved to 2
238
+ // elements:" — no tag), while an actionability failure's call log always includes the resolved
239
+ // element itself, e.g. "locator resolved to <button id=\"x\">...". That line only appears once a
240
+ // single concrete element was actually found, so it's a reliable signal either way.
241
+ function isActionabilityFailure(reason) {
242
+ return /locator resolved to <\w/.test(reason);
243
+ }
182
244
  // HEALER_ENABLED is the master on/off switch: unset or any value other than "false"/"0" leaves
183
245
  // healing on, so existing setups keep working without needing to add the var at all.
184
246
  function isHealingEnabled() {
185
247
  const value = process.env.HEALER_ENABLED?.trim().toLowerCase();
186
248
  return value !== 'false' && value !== '0';
187
249
  }
250
+ // Opposite default polarity from isHealingEnabled() above, deliberately: this is a second,
251
+ // more speculative layer of intervention beyond selector healing (the AI is now choosing how to
252
+ // retry an action, not just where to find an element), so it requires explicit opt-in rather than
253
+ // defaulting on.
254
+ function isActionRecoveryEnabled() {
255
+ return process.env.HEALER_ACTION_RECOVERY_ENABLED?.trim().toLowerCase() === 'true';
256
+ }
188
257
  function formatTokenUsage(usage) {
189
258
  const parts = [];
190
259
  if (usage.inputTokens !== undefined)
@@ -194,6 +263,42 @@ function formatTokenUsage(usage) {
194
263
  const breakdown = parts.length ? ` (${parts.join(' + ')})` : '';
195
264
  return usage.totalTokens !== undefined ? `${usage.totalTokens} tokens${breakdown}` : `tokens${breakdown}`;
196
265
  }
266
+ // The single line every heal attempt prints to the console, regardless of outcome — the point is
267
+ // that a user watching test output can see *how* healing worked (or didn't) without having to dig
268
+ // into the HTML report's attached JSON: which provider was consulted, whether it fell back to
269
+ // vision, what it ended up suggesting (even if that suggestion then failed), what stage it stopped
270
+ // at, and how many tokens that cost. `report.warning` alone (the old sole console line) only ever
271
+ // carried some of this, and carried none of it consistently across every failure stage.
272
+ function formatConsoleLine(report) {
273
+ const outcome = report.healed ? 'HEALED' : 'NOT healed';
274
+ const meta = [
275
+ `provider=${report.provider}`,
276
+ `vision=${report.usedVision ? 'yes' : 'no'}`,
277
+ `actionRecovery=${report.usedActionRecovery ? 'yes' : 'no'}`,
278
+ ];
279
+ if (report.suggestedSelector) {
280
+ meta.push(`suggested="${report.suggestedSelector}"`);
281
+ }
282
+ if (report.failureStage) {
283
+ meta.push(`stage=${report.failureStage}`);
284
+ }
285
+ if (report.tokenUsage) {
286
+ // formatTokenUsage() already reads as "432 tokens (292 input + 140 output)" on its own — used
287
+ // as-is elsewhere (e.g. the llm-tokens-used annotation), but doesn't need a "tokens=" prefix
288
+ // repeating the word here.
289
+ meta.push(formatTokenUsage(report.tokenUsage));
290
+ }
291
+ const description = report.description ? ` "${report.description}"` : '';
292
+ // Playwright error messages routinely carry an embedded multi-line call log — the full text is
293
+ // already preserved in `report.reason` and the attached JSON, so the console line (meant to stay
294
+ // scannable at a glance) only shows its first line.
295
+ const reasonFirstLine = report.reason.split('\n')[0];
296
+ // Leads with the source location, when known, the same way a compiler/lint error would — it's
297
+ // the single most actionable piece of information (which file to go fix), so it goes first
298
+ // rather than buried in the metadata bracket.
299
+ const location = report.sourceLocation ? `${report.sourceLocation} — ` : '';
300
+ return `[self-healer] ${location}${report.kind}.${report.action}${description} -> ${outcome} [${meta.join(', ')}] — ${reasonFirstLine}`;
301
+ }
197
302
  function attachReportToRunningTest(report) {
198
303
  try {
199
304
  const testInfo = test_1.test.info();
@@ -217,36 +322,156 @@ async function healActionFailure(context) {
217
322
  const reason = normalizeError(context.error);
218
323
  const callArgs = context.callArgs ?? [];
219
324
  const healingEnabled = isHealingEnabled();
220
- // Skip the ARIA snapshot capture and provider lookup entirely when disabled — no point paying
221
- // for a snapshot (or an LLM call) just to throw the result away.
325
+ const actionabilityFailure = isActionabilityFailure(reason);
326
+ const attemptHealing = healingEnabled && !actionabilityFailure;
327
+ // Set as soon as we know *why* it didn't fully recover; cleared back to undefined only once
328
+ // healing actually succeeds.
329
+ let failureStage;
330
+ if (!healingEnabled) {
331
+ failureStage = 'disabled';
332
+ }
333
+ else if (actionabilityFailure) {
334
+ failureStage = 'not-a-selector-issue';
335
+ }
336
+ else {
337
+ failureStage = 'no_snapshot'; // default; overwritten as we get further
338
+ }
339
+ // Skip the ARIA snapshot capture and provider lookup entirely when disabled, or when the
340
+ // element was already found and the failure is an actionability problem rather than a selector
341
+ // problem — no point paying for a snapshot (or an LLM call) just to throw the result away.
222
342
  const actionTimeoutMs = resolveActionTimeoutMs();
223
- const pageContext = healingEnabled ? await resolvePageContext(context.target) : undefined;
224
- const ariaSnapshot = healingEnabled ? await captureAriaSnapshot(pageContext, actionTimeoutMs ?? 2000) : undefined;
225
- const providerAttempt = healingEnabled
226
- ? await tryRecoverWithProvider(pageContext, context.action, context.description, ariaSnapshot, callArgs, actionTimeoutMs)
227
- : { healing: null, usage: undefined };
228
- const healing = providerAttempt.healing;
229
- const warning = healing?.warning
230
- ?? (healingEnabled
231
- ? `Action "${context.action}" failed: ${reason}.`
232
- : `Self-healing is disabled (HEALER_ENABLED=false); action "${context.action}" failed: ${reason}.`);
343
+ const pageContext = attemptHealing ? (context.frameScope ?? (await resolvePageContext(context.target))) : undefined;
344
+ const ariaSnapshot = attemptHealing ? await captureAriaSnapshot(pageContext, actionTimeoutMs ?? 2000) : undefined;
345
+ let healing = null;
346
+ let usage;
347
+ let suggestedSelector;
348
+ let providerName;
349
+ let usedVision = false;
350
+ let usedActionRecovery = false;
351
+ // pageContext alone (not `&& ariaSnapshot`) is enough to enter this block now: the vision
352
+ // fallback below needs a provider and a pageContext to screenshot, but has no use for an ARIA
353
+ // snapshot at all — it's specifically useful for the `no_snapshot` case too.
354
+ if (attemptHealing && pageContext) {
355
+ const provider = (0, providers_1.getHealProvider)();
356
+ if (!provider) {
357
+ failureStage = 'no_provider';
358
+ }
359
+ else {
360
+ providerName = provider.name;
361
+ if (ariaSnapshot) {
362
+ // Token usage is captured whenever the provider call itself succeeded, independent of
363
+ // whether the suggested selector actually worked — the tokens were spent either way, so a
364
+ // failed heal still needs to be reported for cost tracking.
365
+ failureStage = 'provider_error';
366
+ const result = await provider.suggestSelector({ action: context.action, description: context.description, ariaSnapshot, timeoutMs: actionTimeoutMs });
367
+ if (result) {
368
+ usage = result.usage;
369
+ const { suggestion } = result;
370
+ if (!suggestion || suggestion.strategy === 'none') {
371
+ failureStage = 'ai_declined';
372
+ }
373
+ else {
374
+ const locator = buildLocatorFromSuggestion(pageContext, suggestion);
375
+ if (!locator) {
376
+ failureStage = 'unbuildable_suggestion';
377
+ }
378
+ else {
379
+ // Set *before* the replay attempt (not just on success) — an AI suggestion that
380
+ // turned out to also fail is exactly the case worth seeing in the report, not
381
+ // silently discarding in favor of the original error alone.
382
+ suggestedSelector = describeSuggestion(suggestion);
383
+ failureStage = 'replay_failed';
384
+ try {
385
+ const replayResult = await (0, replay_action_1.replayAction)(locator, context.action, callArgs);
386
+ healing = {
387
+ provider: provider.name,
388
+ warning: `Recovered using ${provider.name} (${suggestedSelector ?? 'suggested selector'}).`,
389
+ suggestedSelector,
390
+ result: replayResult,
391
+ };
392
+ failureStage = undefined;
393
+ }
394
+ catch (replayError) {
395
+ if (isActionRecoveryEnabled()) {
396
+ const fallback = await attemptActionRecoveryFallback(provider, locator, context.action, callArgs, replayError, actionTimeoutMs, suggestedSelector, usage);
397
+ usage = fallback.usage;
398
+ usedActionRecovery = true;
399
+ healing = fallback.healing;
400
+ failureStage = fallback.healing ? undefined : fallback.stage;
401
+ }
402
+ else {
403
+ healing = null;
404
+ }
405
+ }
406
+ }
407
+ }
408
+ }
409
+ }
410
+ // Strictly a second try, after the ARIA/text-based attempt above has already run and
411
+ // failed to produce a working heal — never a first resort, since the text path is cheaper
412
+ // and already handles the common case.
413
+ if (!healing && provider.supportsVision) {
414
+ const visionOutcome = await tryVisionRecovery(provider, pageContext, context.action, context.description, callArgs, actionTimeoutMs);
415
+ if (visionOutcome.usage) {
416
+ usage = usage ? sumTokenUsage(usage, visionOutcome.usage) : visionOutcome.usage;
417
+ }
418
+ if (visionOutcome.usedActionRecovery) {
419
+ usedActionRecovery = true;
420
+ }
421
+ if (visionOutcome.healing) {
422
+ healing = visionOutcome.healing;
423
+ usedVision = true;
424
+ failureStage = undefined;
425
+ }
426
+ else if (visionOutcome.stage) {
427
+ usedVision = true;
428
+ failureStage = visionOutcome.stage;
429
+ }
430
+ }
431
+ }
432
+ }
433
+ let warning;
434
+ if (healing) {
435
+ warning = healing.warning;
436
+ }
437
+ else if (failureStage === 'replay_failed') {
438
+ warning = `Action "${context.action}" failed: ${reason}. AI suggested "${suggestedSelector}", but that failed too.`;
439
+ }
440
+ else if (failureStage === 'vision_replay_failed') {
441
+ warning = `Action "${context.action}" failed: ${reason}. AI located a visual match, but acting on it failed too.`;
442
+ }
443
+ else if (failureStage) {
444
+ warning = `Action "${context.action}" failed: ${reason}. (${FAILURE_STAGE_MESSAGES[failureStage]})`;
445
+ }
446
+ else {
447
+ warning = `Action "${context.action}" failed: ${reason}.`;
448
+ }
233
449
  const report = {
234
450
  action: context.action,
235
451
  kind: context.kind,
236
452
  description: context.description,
237
- provider: healing?.provider ?? (healingEnabled ? 'none' : 'disabled'),
238
- tokenUsage: providerAttempt.usage,
239
- healed: Boolean(healing?.healed),
453
+ provider: healing?.provider ?? providerName ?? (actionabilityFailure ? 'skipped' : (healingEnabled ? 'none' : 'disabled')),
454
+ tokenUsage: usage,
455
+ healed: Boolean(healing),
240
456
  warning,
241
457
  reason,
242
- suggestedSelector: healing?.suggestedSelector,
458
+ suggestedSelector: healing?.suggestedSelector ?? suggestedSelector,
459
+ failureStage,
460
+ usedVision,
461
+ usedActionRecovery,
462
+ sourceLocation: context.sourceLocation,
243
463
  };
244
464
  reports.push(report);
245
- console.warn(`[self-healer] ${report.warning}`);
465
+ if (report.healed) {
466
+ console.log(formatConsoleLine(report));
467
+ }
468
+ else {
469
+ console.warn(formatConsoleLine(report));
470
+ }
246
471
  attachReportToRunningTest(report);
247
472
  return {
248
473
  report,
249
- recovered: Boolean(healing?.healed),
474
+ recovered: Boolean(healing),
250
475
  result: healing?.result,
251
476
  };
252
477
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/healer/index.ts"],"names":[],"mappings":";;;;;;;AAAA,gDAAwB;AAExB,2CAAwC;AACxC,oDAA4B;AAC5B,2CAA8C;AAG9C,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAgB7D,MAAM,OAAO,GAAwB,EAAE,CAAC;AAExC,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,+FAA+F;AAC/F,2FAA2F;AAC3F,gGAAgG;AAChG,2FAA2F;AAC3F,2CAA2C;AAC3C,SAAS,sBAAsB;IAC7B,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,WAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAC5D,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAA+B;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAQ,MAAkB,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,OAAO,MAAO,MAAkB,CAAC,IAAI,EAAE,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,MAAsB,CAAC;AAChC,CAAC;AAED,sFAAsF;AACtF,0FAA0F;AAC1F,oEAAoE;AACpE,KAAK,UAAU,mBAAmB,CAAC,WAAqC,EAAE,SAAiB;IACzF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,WAAyB,EAAE,UAA8B;IAC3F,QAAQ,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,IAAa,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACjJ,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACpD,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,KAAK,aAAa;YAChB,OAAO,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,KAAK,KAAK;YACR,OAAO,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7C;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,UAA8B;IACxD,QAAQ,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,QAAQ,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClF,KAAK,MAAM;YACT,OAAO,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,UAAU,UAAU,CAAC,MAAM,EAAE,CAAC;QACvC,KAAK,OAAO;YACV,OAAO,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC;QACrC,KAAK,aAAa;YAChB,OAAO,eAAe,UAAU,CAAC,WAAW,EAAE,CAAC;QACjD,KAAK,KAAK;YACR,OAAO,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC;QACjC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,+FAA+F;AAC/F,uFAAuF;AACvF,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,MAAc,EAAE,QAAQ,GAAc,EAAE;IACpF,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IAE5B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,KAAK,KAAK;YACR,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,KAAK,cAAc;YACjB,OAAO,OAAO,CAAC,YAAY,CAAC,QAAiB,CAAC,CAAC;QACjD,KAAK,eAAe;YAClB,OAAO,OAAO,CAAC,aAAa,CAAC,QAAiB,CAAC,CAAC;QAClD,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB;YACE,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,iDAAiD,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAUD,8FAA8F;AAC9F,8FAA8F;AAC9F,gDAAgD;AAChD,KAAK,UAAU,sBAAsB,CAAC,WAAqC,EAAE,MAAc,EAAE,WAA+B,EAAE,YAAgC,EAAE,QAAmB,EAAE,SAA6B;IAChN,MAAM,QAAQ,GAAG,IAAA,2BAAe,GAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;IAChG,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,OAAO,GAAG,0BAA0B,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnE,OAAO;YACL,OAAO,EAAE;gBACP,QAAQ,EAAE,QAAQ,CAAC,IAAI;gBACvB,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,mBAAmB,QAAQ,CAAC,IAAI,KAAK,kBAAkB,CAAC,UAAU,CAAC,IAAI,oBAAoB,IAAI;gBACxG,iBAAiB,EAAE,kBAAkB,CAAC,UAAU,CAAC;gBACjD,MAAM,EAAE,YAAY;aACrB;YACD,KAAK;SACN,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,+FAA+F;AAC/F,qFAAqF;AACrF,SAAS,gBAAgB;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/D,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAiB;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,QAAQ,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,SAAS,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW,UAAU,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC;AAC5G,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAyB;IAC1D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,WAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrH,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;gBACxB,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,GAAG,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;aAC7F,CAAC,CAAC;QACL,CAAC;QACD,KAAK,QAAQ,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,MAAM,EAAE,EAAE;YACpD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACrC,WAAW,EAAE,kBAAkB;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,+FAA+F;IACjG,CAAC;AACH,CAAC;AAEM,KAAK,4BAA4B,OAOvC;IACC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC;IAE1C,8FAA8F;IAC9F,iEAAiE;IACjE,MAAM,eAAe,GAAG,sBAAsB,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,mBAAmB,CAAC,WAAW,EAAE,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAElH,MAAM,eAAe,GAAG,cAAc;QACpC,CAAC,CAAC,MAAM,sBAAsB,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,CAAC;QACzH,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAmC,EAAE,CAAC;IAClE,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;IAExC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO;WAC3B,CAAC,cAAc;YAChB,CAAC,CAAC,WAAW,OAAO,CAAC,MAAM,aAAa,MAAM,GAAG;YACjD,CAAC,CAAC,4DAA4D,OAAO,CAAC,MAAM,aAAa,MAAM,GAAG,CAAC,CAAC;IACxG,MAAM,MAAM,GAAsB;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;QACrE,UAAU,EAAE,eAAe,CAAC,KAAK;QACjC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;QAChC,OAAO;QACP,MAAM;QACN,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;KAC9C,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAElC,OAAO;QACL,MAAM;QACN,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;QACnC,MAAM,EAAE,OAAO,EAAE,MAAM;KACxB,CAAC;AACJ,CAAC;AAED;IACE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/healer/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAwC,MAAM,SAAS,CAAC;AAOlF,wBAAgB,uBAAuB,IAAI,YAAY,GAAG,IAAI,CA+C7D"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,YAAY,EAAsH,MAAM,SAAS,CAAC;AAQpL,wBAAgB,uBAAuB,IAAI,YAAY,GAAG,IAAI,CA8H7D"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.createAnthropicProvider = createAnthropicProvider;
7
7
  const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
8
  const prompt_1 = require("./prompt");
9
+ const vision_models_1 = require("./vision-models");
9
10
  // Fallback only — normally overridden by SuggestSelectorInput.timeoutMs, which mirrors the
10
11
  // Playwright project's configured actionTimeout so the healer never outlasts the action budget.
11
12
  const REQUEST_TIMEOUT_MS = 15000;
@@ -16,8 +17,10 @@ function createAnthropicProvider() {
16
17
  return null;
17
18
  }
18
19
  const client = new sdk_1.default({ apiKey });
20
+ const supportsVision = (0, vision_models_1.isVisionCapableModel)('anthropic', model);
19
21
  return {
20
22
  name: `anthropic:${model}`,
23
+ supportsVision,
21
24
  async suggestSelector(input) {
22
25
  try {
23
26
  const response = await client.messages.create({
@@ -47,6 +50,73 @@ function createAnthropicProvider() {
47
50
  return null;
48
51
  }
49
52
  },
53
+ async suggestSelectorFromImage(input) {
54
+ try {
55
+ const response = await client.messages.create({
56
+ model,
57
+ max_tokens: 1024,
58
+ system: prompt_1.VISION_SYSTEM_PROMPT,
59
+ messages: [
60
+ {
61
+ role: 'user',
62
+ // Image before text, per Anthropic's own guidance for single-image prompts.
63
+ content: [
64
+ { type: 'image', source: { type: 'base64', media_type: 'image/png', data: input.imageBase64 } },
65
+ { type: 'text', text: (0, prompt_1.buildVisionUserPrompt)(input) },
66
+ ],
67
+ },
68
+ ],
69
+ }, { timeout: input.timeoutMs ?? REQUEST_TIMEOUT_MS });
70
+ const textBlock = response.content.find((block) => block.type === 'text');
71
+ if (!textBlock || textBlock.type !== 'text') {
72
+ return null;
73
+ }
74
+ const point = (0, prompt_1.parseVisionSuggestion)(textBlock.text);
75
+ if (!point) {
76
+ return null;
77
+ }
78
+ const inputTokens = response.usage.input_tokens;
79
+ const outputTokens = response.usage.output_tokens;
80
+ return {
81
+ point,
82
+ usage: { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens },
83
+ };
84
+ }
85
+ catch (error) {
86
+ const reason = error instanceof Error ? error.message : String(error);
87
+ console.warn(`[self-healer] Anthropic vision provider error: ${reason}`);
88
+ return null;
89
+ }
90
+ },
91
+ async suggestActionTactic(input) {
92
+ try {
93
+ const response = await client.messages.create({
94
+ model,
95
+ max_tokens: 1024,
96
+ system: prompt_1.ACTION_RECOVERY_SYSTEM_PROMPT,
97
+ messages: [{ role: 'user', content: (0, prompt_1.buildActionRecoveryUserPrompt)(input) }],
98
+ }, { timeout: input.timeoutMs ?? REQUEST_TIMEOUT_MS });
99
+ const textBlock = response.content.find((block) => block.type === 'text');
100
+ if (!textBlock || textBlock.type !== 'text') {
101
+ return null;
102
+ }
103
+ const tactic = (0, prompt_1.parseActionTacticSuggestion)(textBlock.text);
104
+ if (!tactic) {
105
+ return null;
106
+ }
107
+ const inputTokens = response.usage.input_tokens;
108
+ const outputTokens = response.usage.output_tokens;
109
+ return {
110
+ tactic,
111
+ usage: { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens },
112
+ };
113
+ }
114
+ catch (error) {
115
+ const reason = error instanceof Error ? error.message : String(error);
116
+ console.warn(`[self-healer] Anthropic action-recovery provider error: ${reason}`);
117
+ return null;
118
+ }
119
+ },
50
120
  };
51
121
  }
52
122
  //# sourceMappingURL=anthropic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/healer/providers/anthropic.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA0C;AAE1C,qCAA2E;AAE3E,2FAA2F;AAC3F,gGAAgG;AAChG,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;IACE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAE1C,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,aAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,aAAa,KAAK,EAAE;QAC1B,KAAK,CAAC,eAAe,CAAC,KAA2B;YAC/C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC3C;oBACE,KAAK;oBACL,UAAU,EAAE,IAAI;oBAChB,MAAM,EAAE,sBAAa;oBACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAA,wBAAe,EAAC,KAAK,CAAC,EAAE,CAAC;iBAC9D,EACD,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,EAAE,CACnD,CAAC;gBAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBAC1E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,UAAU,GAAG,IAAA,wBAAe,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;gBAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBAClD,OAAO;oBACL,UAAU;oBACV,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY,EAAE;iBAC9E,CAAC;YACJ,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,2CAA2C,MAAM,EAAE,CAAC,CAAC;gBAClE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/healer/providers/anthropic.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA0C;AAE1C,qCAA0O;AAC1O,mDAAuD;AAEvD,2FAA2F;AAC3F,gGAAgG;AAChG,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;IACE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAE1C,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,aAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,IAAA,oCAAoB,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEhE,OAAO;QACL,IAAI,EAAE,aAAa,KAAK,EAAE;QAC1B,cAAc;QACd,KAAK,CAAC,eAAe,CAAC,KAA2B;YAC/C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC3C;oBACE,KAAK;oBACL,UAAU,EAAE,IAAI;oBAChB,MAAM,EAAE,sBAAa;oBACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAA,wBAAe,EAAC,KAAK,CAAC,EAAE,CAAC;iBAC9D,EACD,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,EAAE,CACnD,CAAC;gBAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBAC1E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,UAAU,GAAG,IAAA,wBAAe,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;gBAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBAClD,OAAO;oBACL,UAAU;oBACV,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY,EAAE;iBAC9E,CAAC;YACJ,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,2CAA2C,MAAM,EAAE,CAAC,CAAC;gBAClE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,KAAK,CAAC,wBAAwB,CAAC,KAAmC;YAChE,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC3C;oBACE,KAAK;oBACL,UAAU,EAAE,IAAI;oBAChB,MAAM,EAAE,6BAAoB;oBAC5B,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,MAAM;4BACZ,4EAA4E;4BAC5E,OAAO,EAAE;gCACP,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE;gCAC/F,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAA,8BAAqB,EAAC,KAAK,CAAC,EAAE;6BACrD;yBACF;qBACF;iBACF,EACD,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,EAAE,CACnD,CAAC;gBAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBAC1E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,KAAK,GAAG,IAAA,8BAAqB,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;gBAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBAClD,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY,EAAE;iBAC9E,CAAC;YACJ,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,kDAAkD,MAAM,EAAE,CAAC,CAAC;gBACzE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,KAAK,CAAC,mBAAmB,CAAC,KAA+B;YACvD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC3C;oBACE,KAAK;oBACL,UAAU,EAAE,IAAI;oBAChB,MAAM,EAAE,sCAA6B;oBACrC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAA,sCAA6B,EAAC,KAAK,CAAC,EAAE,CAAC;iBAC5E,EACD,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,EAAE,CACnD,CAAC;gBAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBAC1E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;gBAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBAClD,OAAO;oBACL,MAAM;oBACN,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY,EAAE;iBAC9E,CAAC;YACJ,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,2DAA2D,MAAM,EAAE,CAAC,CAAC;gBAClF,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAwC,MAAM,SAAS,CAAC;AAOlF,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CAkE1D"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/healer/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,YAAY,EAAsH,MAAM,SAAS,CAAC;AAQpL,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CAgL1D"}