playwright-locator-healer 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +71 -0
- package/LICENSE +21 -0
- package/README.md +338 -0
- package/USAGE.md +217 -0
- package/dist/healing/audit-log.d.ts +9 -0
- package/dist/healing/audit-log.d.ts.map +1 -0
- package/dist/healing/audit-log.js +22 -0
- package/dist/healing/audit-log.js.map +1 -0
- package/dist/healing/auto-fixture.d.ts +14 -0
- package/dist/healing/auto-fixture.d.ts.map +1 -0
- package/dist/healing/auto-fixture.js +430 -0
- package/dist/healing/auto-fixture.js.map +1 -0
- package/dist/healing/cache.d.ts +11 -0
- package/dist/healing/cache.d.ts.map +1 -0
- package/dist/healing/cache.js +128 -0
- package/dist/healing/cache.js.map +1 -0
- package/dist/healing/circuit-breaker.d.ts +11 -0
- package/dist/healing/circuit-breaker.d.ts.map +1 -0
- package/dist/healing/circuit-breaker.js +34 -0
- package/dist/healing/circuit-breaker.js.map +1 -0
- package/dist/healing/cost-tracker.d.ts +30 -0
- package/dist/healing/cost-tracker.d.ts.map +1 -0
- package/dist/healing/cost-tracker.js +101 -0
- package/dist/healing/cost-tracker.js.map +1 -0
- package/dist/healing/dom-extractor.d.ts +9 -0
- package/dist/healing/dom-extractor.d.ts.map +1 -0
- package/dist/healing/dom-extractor.js +268 -0
- package/dist/healing/dom-extractor.js.map +1 -0
- package/dist/healing/errors.d.ts +33 -0
- package/dist/healing/errors.d.ts.map +1 -0
- package/dist/healing/errors.js +40 -0
- package/dist/healing/errors.js.map +1 -0
- package/dist/healing/heal/caller-context.d.ts +8 -0
- package/dist/healing/heal/caller-context.d.ts.map +1 -0
- package/dist/healing/heal/caller-context.js +46 -0
- package/dist/healing/heal/caller-context.js.map +1 -0
- package/dist/healing/heal/orchestrator-helpers.d.ts +84 -0
- package/dist/healing/heal/orchestrator-helpers.d.ts.map +1 -0
- package/dist/healing/heal/orchestrator-helpers.js +117 -0
- package/dist/healing/heal/orchestrator-helpers.js.map +1 -0
- package/dist/healing/heal/orchestrator.d.ts +47 -0
- package/dist/healing/heal/orchestrator.d.ts.map +1 -0
- package/dist/healing/heal/orchestrator.js +644 -0
- package/dist/healing/heal/orchestrator.js.map +1 -0
- package/dist/healing/heal/playwright-code.d.ts +26 -0
- package/dist/healing/heal/playwright-code.d.ts.map +1 -0
- package/dist/healing/heal/playwright-code.js +134 -0
- package/dist/healing/heal/playwright-code.js.map +1 -0
- package/dist/healing/heal/preflight.d.ts +8 -0
- package/dist/healing/heal/preflight.d.ts.map +1 -0
- package/dist/healing/heal/preflight.js +77 -0
- package/dist/healing/heal/preflight.js.map +1 -0
- package/dist/healing/heal/prompt.d.ts +9 -0
- package/dist/healing/heal/prompt.d.ts.map +1 -0
- package/dist/healing/heal/prompt.js +22 -0
- package/dist/healing/heal/prompt.js.map +1 -0
- package/dist/healing/heal/report.d.ts +11 -0
- package/dist/healing/heal/report.d.ts.map +1 -0
- package/dist/healing/heal/report.js +28 -0
- package/dist/healing/heal/report.js.map +1 -0
- package/dist/healing/heal/source-trace.d.ts +17 -0
- package/dist/healing/heal/source-trace.d.ts.map +1 -0
- package/dist/healing/heal/source-trace.js +59 -0
- package/dist/healing/heal/source-trace.js.map +1 -0
- package/dist/healing/index.d.ts +6 -0
- package/dist/healing/index.d.ts.map +1 -0
- package/dist/healing/index.js +3 -0
- package/dist/healing/index.js.map +1 -0
- package/dist/healing/llm-client.d.ts +58 -0
- package/dist/healing/llm-client.d.ts.map +1 -0
- package/dist/healing/llm-client.js +258 -0
- package/dist/healing/llm-client.js.map +1 -0
- package/dist/healing/logger.d.ts +18 -0
- package/dist/healing/logger.d.ts.map +1 -0
- package/dist/healing/logger.js +38 -0
- package/dist/healing/logger.js.map +1 -0
- package/dist/healing/models.d.ts +26 -0
- package/dist/healing/models.d.ts.map +1 -0
- package/dist/healing/models.js +109 -0
- package/dist/healing/models.js.map +1 -0
- package/dist/healing/overlay/bridge.d.ts +46 -0
- package/dist/healing/overlay/bridge.d.ts.map +1 -0
- package/dist/healing/overlay/bridge.js +2 -0
- package/dist/healing/overlay/bridge.js.map +1 -0
- package/dist/healing/overlay/dock.css.d.ts +2 -0
- package/dist/healing/overlay/dock.css.d.ts.map +1 -0
- package/dist/healing/overlay/dock.css.js +448 -0
- package/dist/healing/overlay/dock.css.js.map +1 -0
- package/dist/healing/overlay/dock.html.d.ts +46 -0
- package/dist/healing/overlay/dock.html.d.ts.map +1 -0
- package/dist/healing/overlay/dock.html.js +248 -0
- package/dist/healing/overlay/dock.html.js.map +1 -0
- package/dist/healing/overlay/drag.d.ts +17 -0
- package/dist/healing/overlay/drag.d.ts.map +1 -0
- package/dist/healing/overlay/drag.js +68 -0
- package/dist/healing/overlay/drag.js.map +1 -0
- package/dist/healing/overlay/inject.d.ts +41 -0
- package/dist/healing/overlay/inject.d.ts.map +1 -0
- package/dist/healing/overlay/inject.js +277 -0
- package/dist/healing/overlay/inject.js.map +1 -0
- package/dist/healing/overlay/keybinds.d.ts +33 -0
- package/dist/healing/overlay/keybinds.d.ts.map +1 -0
- package/dist/healing/overlay/keybinds.js +105 -0
- package/dist/healing/overlay/keybinds.js.map +1 -0
- package/dist/healing/prompts/heal-v21.d.ts +8 -0
- package/dist/healing/prompts/heal-v21.d.ts.map +1 -0
- package/dist/healing/prompts/heal-v21.js +204 -0
- package/dist/healing/prompts/heal-v21.js.map +1 -0
- package/dist/healing/retry-policy.d.ts +37 -0
- package/dist/healing/retry-policy.d.ts.map +1 -0
- package/dist/healing/retry-policy.js +46 -0
- package/dist/healing/retry-policy.js.map +1 -0
- package/dist/healing/session-cost.d.ts +44 -0
- package/dist/healing/session-cost.d.ts.map +1 -0
- package/dist/healing/session-cost.js +95 -0
- package/dist/healing/session-cost.js.map +1 -0
- package/dist/healing/test-fixture.d.ts +9 -0
- package/dist/healing/test-fixture.d.ts.map +1 -0
- package/dist/healing/test-fixture.js +37 -0
- package/dist/healing/test-fixture.js.map +1 -0
- package/dist/healing/types.d.ts +399 -0
- package/dist/healing/types.d.ts.map +1 -0
- package/dist/healing/types.js +162 -0
- package/dist/healing/types.js.map +1 -0
- package/dist/healing/validator.d.ts +64 -0
- package/dist/healing/validator.d.ts.map +1 -0
- package/dist/healing/validator.js +286 -0
- package/dist/healing/validator.js.map +1 -0
- package/dist/scripts/heal-report.d.ts +23 -0
- package/dist/scripts/heal-report.d.ts.map +1 -0
- package/dist/scripts/heal-report.js +106 -0
- package/dist/scripts/heal-report.js.map +1 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +132 -0
- package/dist/scripts/init.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// ─── Render entry ──────────────────────────────────────────────────────────
|
|
2
|
+
export function renderDock(s) {
|
|
3
|
+
const err = s.stage === 'retry';
|
|
4
|
+
const busy = !!s.loading;
|
|
5
|
+
return `
|
|
6
|
+
<div class="dock${err ? ' err' : ''}${busy ? ' busy' : ''}">
|
|
7
|
+
${renderStatusBar(s)}
|
|
8
|
+
${renderHead(s, busy)}
|
|
9
|
+
<div class="body">
|
|
10
|
+
${renderFailedLineBlock(s)}
|
|
11
|
+
${renderStageBody(s)}
|
|
12
|
+
</div>
|
|
13
|
+
${renderFooter(s, busy)}
|
|
14
|
+
${busy ? '<div class="busy-bar"><div class="busy-fill"></div></div>' : ''}
|
|
15
|
+
</div>`;
|
|
16
|
+
}
|
|
17
|
+
// ─── Status bar (zone 1) ───────────────────────────────────────────────────
|
|
18
|
+
function renderStatusBar(s) {
|
|
19
|
+
const label = (s.statusLabel ?? stageStatusText(s)).toUpperCase();
|
|
20
|
+
const sessionCost = typeof s.sessionCostUsd === 'number' ? `$${s.sessionCostUsd.toFixed(4)}` : '$0.0000';
|
|
21
|
+
const sessionCalls = s.llmCallCount ?? 0;
|
|
22
|
+
const todayCost = typeof s.todayCostUsd === 'number' ? `$${s.todayCostUsd.toFixed(4)}` : '$0.0000';
|
|
23
|
+
const todayCalls = s.todayCallCount ?? 0;
|
|
24
|
+
const model = s.modelName ?? '';
|
|
25
|
+
const elapsed = s.llmStartedAt
|
|
26
|
+
? ` <span class="sb-sep">·</span> <span id="heal-elapsed" data-started="${s.llmStartedAt}">0s</span>`
|
|
27
|
+
: '';
|
|
28
|
+
const modelTag = model ? ` <span class="sb-sep">·</span> <span class="sb-model">${esc(model)}</span>` : '';
|
|
29
|
+
// Two-line: top = state + session, bottom = day totals.
|
|
30
|
+
return `
|
|
31
|
+
<div class="statusbar">
|
|
32
|
+
<span class="sb-title">Heal</span>
|
|
33
|
+
<span class="sb-sep">·</span>
|
|
34
|
+
<span class="sb-state">${esc(label)}</span>
|
|
35
|
+
${elapsed}
|
|
36
|
+
<span class="sb-cost" title="this session">${sessionCost}</span>
|
|
37
|
+
<span class="sb-sep">·</span>
|
|
38
|
+
<span class="sb-calls">${sessionCalls} LLM</span>
|
|
39
|
+
${modelTag}
|
|
40
|
+
</div>
|
|
41
|
+
<div class="statusbar statusbar-day">
|
|
42
|
+
<span class="sb-day-label">Today</span>
|
|
43
|
+
<span class="sb-sep">·</span>
|
|
44
|
+
<span class="sb-cost">${todayCost}</span>
|
|
45
|
+
<span class="sb-sep">·</span>
|
|
46
|
+
<span class="sb-calls">${todayCalls} calls</span>
|
|
47
|
+
</div>`;
|
|
48
|
+
}
|
|
49
|
+
// ─── Head / drag handle (zone 2) ───────────────────────────────────────────
|
|
50
|
+
function renderHead(s, busy) {
|
|
51
|
+
const stageLabel = busy ? (s.loadingLabel ?? 'WORKING') : s.stage;
|
|
52
|
+
const round = s.round ? ` <span class="sb-sep">·</span> <b>R${s.round}</b>` : '';
|
|
53
|
+
return `
|
|
54
|
+
<div class="head">
|
|
55
|
+
<span class="dot${busy ? ' pulse' : ''}"></span>
|
|
56
|
+
<span class="title">Heal</span>
|
|
57
|
+
<span class="stage">
|
|
58
|
+
<b>${stageNum(s.stage)}</b> <span class="sb-sep">/</span> 03
|
|
59
|
+
<span class="sb-sep">·</span> ${esc(stageLabel.toUpperCase())}
|
|
60
|
+
${round}
|
|
61
|
+
</span>
|
|
62
|
+
<span class="drag-grip">⠿⠿</span>
|
|
63
|
+
</div>`;
|
|
64
|
+
}
|
|
65
|
+
// ─── Body content per stage (zone 3) ───────────────────────────────────────
|
|
66
|
+
function renderStageBody(s) {
|
|
67
|
+
switch (s.stage) {
|
|
68
|
+
case 'pick':
|
|
69
|
+
return `<div class="cta">→ click target element in page</div>`;
|
|
70
|
+
case 'pick-preview': {
|
|
71
|
+
const p = s.pickPreview;
|
|
72
|
+
if (!p)
|
|
73
|
+
return `<div class="cta">→ click target element in page</div>`;
|
|
74
|
+
return `
|
|
75
|
+
<div class="preview-header">You picked:</div>
|
|
76
|
+
<div class="preview-table">
|
|
77
|
+
<div class="preview-row"><span class="preview-key">Tag</span><span class="preview-val code-inline"><${esc(p.tag)}></span></div>
|
|
78
|
+
<div class="preview-row"><span class="preview-key">Role</span><span class="preview-val">${esc(p.role)}</span></div>
|
|
79
|
+
<div class="preview-row"><span class="preview-key">Accessible name</span><span class="preview-val ${p.accessibleName === '(no accessible name)' ? 'dim' : ''}">${esc(p.accessibleName)}</span></div>
|
|
80
|
+
<div class="preview-row"><span class="preview-key">Text content</span><span class="preview-val">${p.text ? esc(p.text) : '<span class="dim">(empty)</span>'}</span></div>
|
|
81
|
+
<div class="preview-row"><span class="preview-key">Stable handle</span><span class="preview-val code-inline ${p.stableHandle ? '' : 'dim'}">${p.stableHandle ? esc(p.stableHandle) : '(none)'}</span></div>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="hint">↩ re-pick · Enter continue · Esc cancel</div>`;
|
|
84
|
+
}
|
|
85
|
+
case 'intent':
|
|
86
|
+
return `
|
|
87
|
+
<div class="row">
|
|
88
|
+
<div class="label">Picked element</div>
|
|
89
|
+
<div class="value code">${esc(s.pickedHtml ?? '')}</div>
|
|
90
|
+
</div>
|
|
91
|
+
<div class="row">
|
|
92
|
+
<div class="label">Describe intent</div>
|
|
93
|
+
<textarea class="intent" id="heal-intent" placeholder="what should this locator find?" ${s.loading ? 'disabled' : ''}>${esc(s.intentText ?? '')}</textarea>
|
|
94
|
+
<div class="hint">More context = better selector. Sent to LLM only when you press ↵ propose.</div>
|
|
95
|
+
</div>`;
|
|
96
|
+
case 'confirm':
|
|
97
|
+
return `
|
|
98
|
+
<div class="row">
|
|
99
|
+
<div class="label">Playwright code <span class="chip">✓ matched ${s.matchCount}</span></div>
|
|
100
|
+
<pre class="value code code-block">${esc(s.proposedCode ?? s.proposedSelector ?? '')}</pre>
|
|
101
|
+
</div>
|
|
102
|
+
<div class="row">
|
|
103
|
+
<div class="label">Internal selector</div>
|
|
104
|
+
<div class="value code dim">${esc(s.proposedSelector ?? '')}</div>
|
|
105
|
+
</div>
|
|
106
|
+
<div class="row">
|
|
107
|
+
<div class="label">Resolves to</div>
|
|
108
|
+
<div class="value code">${esc(s.pickedHtml ?? '(element preview unavailable)')}</div>
|
|
109
|
+
</div>`;
|
|
110
|
+
case 'retry':
|
|
111
|
+
return `
|
|
112
|
+
<div class="row">
|
|
113
|
+
<div class="label">Proposed <span class="chip bad">✗ matched ${s.matchCount}</span></div>
|
|
114
|
+
<div class="value code"><span class="bad">${esc(s.proposedSelector ?? '')}</span></div>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="row">
|
|
117
|
+
<div class="label">Reason</div>
|
|
118
|
+
<div class="hint">${esc(s.errorReason ?? '')}</div>
|
|
119
|
+
</div>
|
|
120
|
+
<div class="row">
|
|
121
|
+
<div class="label">Last intent</div>
|
|
122
|
+
<div class="value">${esc(s.intentText ?? '')}</div>
|
|
123
|
+
</div>`;
|
|
124
|
+
case 'broaden':
|
|
125
|
+
return `
|
|
126
|
+
<div class="row">
|
|
127
|
+
<div class="label">Round ${s.round ?? 1}</div>
|
|
128
|
+
<div class="value">${esc(s.message ?? 'No unique match. Broaden scope and retry?')}</div>
|
|
129
|
+
</div>`;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ─── Footer (zone 4 — sticky actions) ──────────────────────────────────────
|
|
133
|
+
function renderFooter(s, busy) {
|
|
134
|
+
const btns = [];
|
|
135
|
+
switch (s.stage) {
|
|
136
|
+
case 'pick':
|
|
137
|
+
btns.push(btn('force-llm', 'L', 'force LLM', 'plain', 'Skip preflight, go straight to LLM'));
|
|
138
|
+
btns.push(btn('cancel', 'ESC', 'cancel', 'plain'));
|
|
139
|
+
break;
|
|
140
|
+
case 'pick-preview':
|
|
141
|
+
btns.push(btn('pick-preview-repick', '↩', 're-pick', 'reject'));
|
|
142
|
+
btns.push(btn('pick-preview-continue', 'Enter', 'continue', 'accept'));
|
|
143
|
+
btns.push(btn('cancel', 'ESC', 'cancel', 'plain'));
|
|
144
|
+
break;
|
|
145
|
+
case 'intent':
|
|
146
|
+
if (busy) {
|
|
147
|
+
btns.push(btn('cancel-llm', 'P', 'cancel LLM', 'reject'));
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
btns.push(btn('intent', '↵', 'propose', 'accept'));
|
|
151
|
+
btns.push(btn('cancel', 'ESC', 'repick', 'reject'));
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case 'confirm':
|
|
155
|
+
btns.push(btn('accept', 'A', 'accept', 'accept'));
|
|
156
|
+
btns.push(btn('reject', 'R', 'reject', 'reject'));
|
|
157
|
+
btns.push(btn('cancel', 'ESC', 'cancel', 'plain'));
|
|
158
|
+
break;
|
|
159
|
+
case 'retry':
|
|
160
|
+
btns.push(btn('edit', 'E', 'edit intent', 'accept'));
|
|
161
|
+
btns.push(btn('reject', 'R', 'repick', 'reject'));
|
|
162
|
+
btns.push(btn('cancel', 'ESC', 'cancel', 'plain'));
|
|
163
|
+
break;
|
|
164
|
+
case 'broaden':
|
|
165
|
+
btns.push(btn('broaden', 'B', 'broaden scope', 'accept'));
|
|
166
|
+
btns.push(btn('cancel', 'ESC', 'cancel', 'plain'));
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
return `<div class="footer">${btns.join('')}</div>`;
|
|
170
|
+
}
|
|
171
|
+
function btn(act, key, label, variant, title) {
|
|
172
|
+
const cls = variant === 'plain' ? 'key' : `key ${variant}`;
|
|
173
|
+
const t = title ? ` title="${esc(title)}"` : '';
|
|
174
|
+
return `<button class="${cls}" data-act="${act}" type="button"${t}><span class="kbd">${esc(key)}</span> ${esc(label)}</button>`;
|
|
175
|
+
}
|
|
176
|
+
// ─── Failed-line block (only pick + intent stages) ─────────────────────────
|
|
177
|
+
function renderFailedLineBlock(s) {
|
|
178
|
+
if (s.stage !== 'pick' && s.stage !== 'pick-preview' && s.stage !== 'intent')
|
|
179
|
+
return '';
|
|
180
|
+
const snip = s.sourceSnippet;
|
|
181
|
+
const failedLineSrc = snip ? (snip.lines[snip.highlightIdx] ?? '').trim() : '';
|
|
182
|
+
if (!failedLineSrc && !s.originalSelector && !s.description)
|
|
183
|
+
return '';
|
|
184
|
+
const fileLoc = snip
|
|
185
|
+
? `${shortenPath(snip.file)}:${snip.line}`
|
|
186
|
+
: (s.callSite ?? '');
|
|
187
|
+
return `
|
|
188
|
+
<div class="failed-line">
|
|
189
|
+
<div class="fl-head">
|
|
190
|
+
<span class="fl-tag">FAILED</span>
|
|
191
|
+
<span class="fl-loc">${esc(fileLoc)}</span>
|
|
192
|
+
</div>
|
|
193
|
+
${failedLineSrc ? `<div class="fl-code">${esc(failedLineSrc)}</div>` : ''}
|
|
194
|
+
<div class="fl-meta">
|
|
195
|
+
<div class="fl-meta-row">
|
|
196
|
+
<span class="fl-meta-label">Original</span>
|
|
197
|
+
<span class="fl-mono">${esc(s.originalSelector ?? '')}</span>
|
|
198
|
+
</div>
|
|
199
|
+
${s.action ? `
|
|
200
|
+
<div class="fl-meta-row">
|
|
201
|
+
<span class="fl-meta-label">Action</span>
|
|
202
|
+
<span class="fl-desc">${esc(s.action)}</span>
|
|
203
|
+
</div>` : ''}
|
|
204
|
+
${s.description ? `
|
|
205
|
+
<div class="fl-meta-row">
|
|
206
|
+
<span class="fl-meta-label">Intent</span>
|
|
207
|
+
<span class="fl-desc">${esc(s.description)}</span>
|
|
208
|
+
</div>` : ''}
|
|
209
|
+
</div>
|
|
210
|
+
</div>`;
|
|
211
|
+
}
|
|
212
|
+
// ─── Helpers ───────────────────────────────────────────────────────────────
|
|
213
|
+
function stageNum(st) {
|
|
214
|
+
return st === 'pick' ? '01'
|
|
215
|
+
: st === 'pick-preview' ? '01'
|
|
216
|
+
: st === 'intent' ? '02'
|
|
217
|
+
: st === 'confirm' ? '03'
|
|
218
|
+
: st === 'retry' ? '03'
|
|
219
|
+
: '03';
|
|
220
|
+
}
|
|
221
|
+
function stageStatusText(s) {
|
|
222
|
+
if (s.loading)
|
|
223
|
+
return s.loadingLabel ?? (s.round ? `LLM R${s.round}` : 'WORKING');
|
|
224
|
+
if (s.stage === 'pick')
|
|
225
|
+
return 'PICK';
|
|
226
|
+
if (s.stage === 'pick-preview')
|
|
227
|
+
return 'PICK · PREVIEW';
|
|
228
|
+
if (s.stage === 'intent')
|
|
229
|
+
return 'INTENT';
|
|
230
|
+
if (s.stage === 'confirm')
|
|
231
|
+
return 'CONFIRM';
|
|
232
|
+
if (s.stage === 'retry')
|
|
233
|
+
return 'RETRY';
|
|
234
|
+
if (s.stage === 'broaden')
|
|
235
|
+
return 'BROADEN?';
|
|
236
|
+
return '';
|
|
237
|
+
}
|
|
238
|
+
function shortenPath(p) {
|
|
239
|
+
// Drop everything before the last two segments so the line stays compact.
|
|
240
|
+
const parts = p.split('/');
|
|
241
|
+
if (parts.length <= 2)
|
|
242
|
+
return p;
|
|
243
|
+
return '…/' + parts.slice(-2).join('/');
|
|
244
|
+
}
|
|
245
|
+
function esc(s) {
|
|
246
|
+
return s.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=dock.html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dock.html.js","sourceRoot":"","sources":["../../../healing/overlay/dock.html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Page } from '@playwright/test';
|
|
2
|
+
/**
|
|
3
|
+
* Mount drag-to-reposition behaviour for the heal overlay dock.
|
|
4
|
+
*
|
|
5
|
+
* Registers `window.__healOverlay_drag = { wireDrag, applyDockTransform }` in
|
|
6
|
+
* the browser context. Both functions are consumed by the `setState` impl in
|
|
7
|
+
* `mountShadowHost` after every HTML update.
|
|
8
|
+
*
|
|
9
|
+
* Reads `window.__healOverlay_root` (a `ShadowRoot`, written by
|
|
10
|
+
* `mountShadowHost`) to locate the `.dock` / `.head` elements. Must be called
|
|
11
|
+
* AFTER `mountShadowHost` so the root reference is present.
|
|
12
|
+
*
|
|
13
|
+
* @param page - Playwright `Page` the overlay is mounted on.
|
|
14
|
+
* @returns Resolves once drag state and event listeners are installed.
|
|
15
|
+
*/
|
|
16
|
+
export declare function mountDrag(page: Page): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=drag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag.d.ts","sourceRoot":"","sources":["../../../healing/overlay/drag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDzD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mount drag-to-reposition behaviour for the heal overlay dock.
|
|
3
|
+
*
|
|
4
|
+
* Registers `window.__healOverlay_drag = { wireDrag, applyDockTransform }` in
|
|
5
|
+
* the browser context. Both functions are consumed by the `setState` impl in
|
|
6
|
+
* `mountShadowHost` after every HTML update.
|
|
7
|
+
*
|
|
8
|
+
* Reads `window.__healOverlay_root` (a `ShadowRoot`, written by
|
|
9
|
+
* `mountShadowHost`) to locate the `.dock` / `.head` elements. Must be called
|
|
10
|
+
* AFTER `mountShadowHost` so the root reference is present.
|
|
11
|
+
*
|
|
12
|
+
* @param page - Playwright `Page` the overlay is mounted on.
|
|
13
|
+
* @returns Resolves once drag state and event listeners are installed.
|
|
14
|
+
*/
|
|
15
|
+
export async function mountDrag(page) {
|
|
16
|
+
await page.evaluate(() => {
|
|
17
|
+
let dragOffsetX = 0;
|
|
18
|
+
let dragOffsetY = 0;
|
|
19
|
+
let dragging = false;
|
|
20
|
+
let dragStartX = 0;
|
|
21
|
+
let dragStartY = 0;
|
|
22
|
+
let dragOX = 0;
|
|
23
|
+
let dragOY = 0;
|
|
24
|
+
const applyDockTransform = () => {
|
|
25
|
+
const root = window.__healOverlay_root;
|
|
26
|
+
const dock = root?.querySelector('.dock');
|
|
27
|
+
if (dock)
|
|
28
|
+
dock.style.transform = `translate(${dragOffsetX}px, ${dragOffsetY}px)`;
|
|
29
|
+
};
|
|
30
|
+
const wireDrag = () => {
|
|
31
|
+
const root = window.__healOverlay_root;
|
|
32
|
+
const head = root?.querySelector('.head');
|
|
33
|
+
const dock = root?.querySelector('.dock');
|
|
34
|
+
if (!head || !dock)
|
|
35
|
+
return;
|
|
36
|
+
head.addEventListener('mousedown', (e) => {
|
|
37
|
+
const t = e.target;
|
|
38
|
+
if (t.closest('.esc') || t.closest('.stage b'))
|
|
39
|
+
return;
|
|
40
|
+
dragging = true;
|
|
41
|
+
dock.classList.add('dragging');
|
|
42
|
+
dragStartX = e.clientX;
|
|
43
|
+
dragStartY = e.clientY;
|
|
44
|
+
dragOX = dragOffsetX;
|
|
45
|
+
dragOY = dragOffsetY;
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
document.addEventListener('mousemove', (e) => {
|
|
50
|
+
if (!dragging)
|
|
51
|
+
return;
|
|
52
|
+
dragOffsetX = dragOX + (e.clientX - dragStartX);
|
|
53
|
+
dragOffsetY = dragOY + (e.clientY - dragStartY);
|
|
54
|
+
applyDockTransform();
|
|
55
|
+
}, true);
|
|
56
|
+
document.addEventListener('mouseup', () => {
|
|
57
|
+
if (!dragging)
|
|
58
|
+
return;
|
|
59
|
+
dragging = false;
|
|
60
|
+
const root = window.__healOverlay_root;
|
|
61
|
+
const dock = root?.querySelector('.dock');
|
|
62
|
+
if (dock)
|
|
63
|
+
dock.classList.remove('dragging');
|
|
64
|
+
}, true);
|
|
65
|
+
window.__healOverlay_drag = { wireDrag, applyDockTransform };
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=drag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag.js","sourceRoot":"","sources":["../../../healing/overlay/drag.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU;IACxC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACvB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,MAAM,IAAI,GAAI,MAAc,CAAC,kBAA4C,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,EAAE,aAAa,CAAC,OAAO,CAAuB,CAAC;YAChE,IAAI,IAAI;gBAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,WAAW,OAAO,WAAW,KAAK,CAAC;QACnF,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,MAAM,IAAI,GAAI,MAAc,CAAC,kBAA4C,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,EAAE,aAAa,CAAC,OAAO,CAAuB,CAAC;YAChE,MAAM,IAAI,GAAG,IAAI,EAAE,aAAa,CAAC,OAAO,CAAuB,CAAC;YAChE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO;YAC3B,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;gBACvC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAqB,CAAC;gBAClC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;oBAAE,OAAO;gBACvD,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC/B,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC;gBAAC,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC;gBAC/C,MAAM,GAAG,WAAW,CAAC;gBAAC,MAAM,GAAG,WAAW,CAAC;gBAC3C,CAAC,CAAC,cAAc,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;YAC3C,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,UAAU,CAAC,CAAC;YAChD,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,UAAU,CAAC,CAAC;YAChD,kBAAkB,EAAE,CAAC;QACvB,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;YACxC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,GAAG,KAAK,CAAC;YACjB,MAAM,IAAI,GAAI,MAAc,CAAC,kBAA4C,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,EAAE,aAAa,CAAC,OAAO,CAAuB,CAAC;YAChE,IAAI,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC,EAAE,IAAI,CAAC,CAAC;QAER,MAAc,CAAC,kBAAkB,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Page } from '@playwright/test';
|
|
2
|
+
import { type DockState } from './dock.html.js';
|
|
3
|
+
import { type OverlayInbound } from './bridge.js';
|
|
4
|
+
/**
|
|
5
|
+
* Handle returned by `injectOverlay`. The orchestrator drives the overlay
|
|
6
|
+
* exclusively through this interface — it never touches the page DOM
|
|
7
|
+
* directly after injection.
|
|
8
|
+
*/
|
|
9
|
+
export interface OverlayHandle {
|
|
10
|
+
/** Re-render the dock with a new state snapshot. */
|
|
11
|
+
setState(state: DockState): Promise<void>;
|
|
12
|
+
/** Enter pick mode: hover highlights, next click fires a `pick` message. */
|
|
13
|
+
enablePickMode(): Promise<void>;
|
|
14
|
+
/** Leave pick mode. */
|
|
15
|
+
disablePickMode(): Promise<void>;
|
|
16
|
+
/** Flash the element at `xpath` (used when previewing candidate locators). */
|
|
17
|
+
highlight(xpath: string): Promise<void>;
|
|
18
|
+
/** Resolve with the next inbound message from the overlay. */
|
|
19
|
+
waitForMessage(): Promise<OverlayInbound>;
|
|
20
|
+
/** Tear down the shadow host. Safe to call multiple times. */
|
|
21
|
+
destroy(): Promise<void>;
|
|
22
|
+
/** Register / clear a one-shot cancel callback for an in-flight LLM call. */
|
|
23
|
+
setCancelInFlight(fn: (() => void) | null): void;
|
|
24
|
+
/** Trigger the in-flight cancel callback, if any. */
|
|
25
|
+
cancelInFlight(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Register an out-of-band handler that gets first-look at every inbound
|
|
28
|
+
* message. Return `true` to mark the message consumed (skips normal queue).
|
|
29
|
+
*/
|
|
30
|
+
setAbortHandler(fn: ((m: OverlayInbound) => boolean) | null): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Inject the heal overlay (shadow host + dock UI + drag + keybinds) into
|
|
34
|
+
* the given Playwright page. Idempotent per page: subsequent calls reuse
|
|
35
|
+
* the same message queue. The returned handle owns the lifecycle.
|
|
36
|
+
*
|
|
37
|
+
* @param page - Playwright `Page` to inject into.
|
|
38
|
+
* @returns Handle the orchestrator uses to drive the overlay.
|
|
39
|
+
*/
|
|
40
|
+
export declare function injectOverlay(page: Page): Promise<OverlayHandle>;
|
|
41
|
+
//# sourceMappingURL=inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.d.ts","sourceRoot":"","sources":["../../../healing/overlay/inject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAIhE;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,4EAA4E;IAC5E,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,uBAAuB;IACvB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,8EAA8E;IAC9E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,8DAA8D;IAC9D,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1C,8DAA8D;IAC9D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACjD,qDAAqD;IACrD,cAAc,IAAI,IAAI,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CACpE;AASD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CA0NtE"}
|