my-frontend-observer 0.1.0 → 0.3.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 (46) hide show
  1. package/CHANGELOG.md +82 -1
  2. package/README.md +30 -7
  3. package/dist/application/observationPersistence.js +1 -0
  4. package/dist/application/observationPersistence.js.map +1 -1
  5. package/dist/browser/chromiumAdapter.js +58 -4
  6. package/dist/browser/chromiumAdapter.js.map +1 -1
  7. package/dist/browser/evidenceCapture.d.ts +46 -3
  8. package/dist/browser/evidenceCapture.js +393 -94
  9. package/dist/browser/evidenceCapture.js.map +1 -1
  10. package/dist/browser/scrollCapture.d.ts +32 -0
  11. package/dist/browser/scrollCapture.js +163 -0
  12. package/dist/browser/scrollCapture.js.map +1 -0
  13. package/dist/browser/types.d.ts +3 -1
  14. package/dist/cli.js +165 -7
  15. package/dist/cli.js.map +1 -1
  16. package/dist/domain/diagnostics.d.ts +1 -1
  17. package/dist/domain/diagnostics.js +2 -0
  18. package/dist/domain/diagnostics.js.map +1 -1
  19. package/dist/domain/identity.d.ts +8 -3
  20. package/dist/domain/identity.js +10 -4
  21. package/dist/domain/identity.js.map +1 -1
  22. package/dist/domain/schema.d.ts +164 -6
  23. package/dist/domain/schema.js +314 -4
  24. package/dist/domain/schema.js.map +1 -1
  25. package/dist/domain/scrollEvidence.d.ts +51 -0
  26. package/dist/domain/scrollEvidence.js +134 -0
  27. package/dist/domain/scrollEvidence.js.map +1 -0
  28. package/dist/index.d.ts +4 -4
  29. package/dist/index.js +2 -2
  30. package/dist/index.js.map +1 -1
  31. package/dist/request/request.d.ts +57 -1
  32. package/dist/request/request.js +292 -14
  33. package/dist/request/request.js.map +1 -1
  34. package/docs/ARCHITECTURE.md +62 -1
  35. package/docs/CI_CD.md +49 -8
  36. package/docs/COMMANDS.md +184 -9
  37. package/docs/CONTRACTS.md +135 -6
  38. package/docs/CURRENT_STATE.md +128 -6
  39. package/docs/DEVELOPMENT.md +41 -3
  40. package/docs/PROJECT_OVERVIEW.md +12 -6
  41. package/docs/QUICKSTART.md +3 -1
  42. package/docs/RELEASE.md +12 -5
  43. package/docs/ROADMAP.md +9 -0
  44. package/docs/SECURITY.md +6 -2
  45. package/docs/WORKFLOWS.md +41 -14
  46. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
2
+ import { TARGET_LANDMARK_ROLES } from '../domain/schema.js';
2
3
  function diagnostic(code, message, targetName) {
3
4
  const base = { code, severity: DIAGNOSTIC_SEVERITY[code], message };
4
5
  return targetName === undefined ? base : { ...base, targetName };
@@ -63,7 +64,12 @@ function parseAriaSnapshotFirstLine(snapshot) {
63
64
  const firstLine = snapshot.split('\n')[0]?.trim();
64
65
  if (!firstLine)
65
66
  return undefined;
66
- const match = /^-\s+([A-Za-z][\w-]*)\s*(?:"([^"]*)")?:?$/.exec(firstLine);
67
+ // No trailing `$` anchor: an element with no accessible name still produces
68
+ // a role line with unquoted trailing content (e.g. `- banner: Site Header`,
69
+ // verified empirically against real Chromium), which must still yield the
70
+ // role even though there is no quoted, genuinely-computed accessible name
71
+ // to report - trailing unquoted text is never treated as a name.
72
+ const match = /^-\s+([A-Za-z][\w-]*)\s*(?:"([^"]*)")?:?/.exec(firstLine);
67
73
  if (!match)
68
74
  return undefined;
69
75
  const role = match[1];
@@ -72,130 +78,423 @@ function parseAriaSnapshotFirstLine(snapshot) {
72
78
  return undefined;
73
79
  return name !== undefined && name.length > 0 ? { role, name } : { role };
74
80
  }
75
- function missingTargetRecord() {
76
- const reason = 'target selector matched no element';
77
- return {
78
- resolution: { state: 'available', source: 'derived', value: { selectionMethod: 'css-selector', selectionStatus: 'not-found' }, derivedFrom: ['selector-query'] },
79
- tag: unavailableField(reason),
80
- geometry: unavailableField(reason),
81
- style: unavailableField(reason),
82
- layout: unavailableField(reason),
83
- visibility: unavailableField(reason),
84
- semantics: unavailableField(reason),
81
+ /** Builds the shared unresolved-target evidence record (not-found/ambiguous/unavailable) with the full ordered attempt history and no selected locator. Containment is reported separately by the caller (its own "self unresolved" reason differs from the measurement-unavailable reason used here). */
82
+ function unresolvedTargetRecord(selectionStatus, attempts, reason, containment) {
83
+ const resolution = {
84
+ selectionMethod: 'ordered-locators',
85
+ selectionStatus,
86
+ usedFallback: false,
87
+ confidence: 'none',
88
+ attempts,
85
89
  };
86
- }
87
- function ambiguousTargetRecord(matchCount) {
88
- const reason = `target selector matched ${matchCount} elements; expected exactly one`;
89
90
  return {
90
- resolution: { state: 'available', source: 'derived', value: { selectionMethod: 'css-selector', selectionStatus: 'ambiguous' }, derivedFrom: ['selector-query'] },
91
+ resolution: { state: 'available', source: 'derived', value: resolution, derivedFrom: ['locator-attempts'] },
91
92
  tag: unavailableField(reason),
92
93
  geometry: unavailableField(reason),
93
94
  style: unavailableField(reason),
94
95
  layout: unavailableField(reason),
95
96
  visibility: unavailableField(reason),
96
97
  semantics: unavailableField(reason),
98
+ semanticState: unavailableField(reason),
99
+ landmark: unavailableField(reason),
100
+ containment,
97
101
  };
98
102
  }
103
+ const TARGET_LANDMARK_ROLE_SET = new Set(TARGET_LANDMARK_ROLES);
99
104
  /**
100
- * Captures the v0.1 minimum target evidence for one resolved (single-match)
101
- * target element, from the same live page/readiness state as the page
102
- * evidence and screenshot. Role/name come from Playwright's real
103
- * accessibility tree (`page.accessibility.snapshot`), not a hand-rolled
104
- * approximation; when the browser cannot supply them reliably for this
105
- * element, they are reported `unavailable` rather than guessed.
105
+ * Reads the resolved element's own native form-control properties and
106
+ * explicit `aria-*` attributes: bounded, target-local browser/ARIA state.
107
+ * `ariaSnapshot()`'s bracket annotations were verified empirically (real
108
+ * Chromium via the installed Playwright 1.62.1) to appear only for
109
+ * true/mixed values - they cannot distinguish an explicit false from "not
110
+ * applicable to this element", and they never expose `aria-current` at all.
111
+ * This direct property/attribute read is the investigated, honest
112
+ * alternative for exactly those two gaps; it still reads only real
113
+ * browser-native/ARIA semantics (never class names, CSS, text content, or
114
+ * source ownership). A key is present in the result only when the browser
115
+ * exposes that state as applicable to this specific element.
106
116
  */
107
- async function captureResolvedTargetRecord(page, selector) {
108
- const handle = await page.$(selector);
109
- if (!handle)
110
- return missingTargetRecord();
111
- try {
112
- const raw = await handle.evaluate((el) => {
113
- const rect = el.getBoundingClientRect();
114
- const computed = getComputedStyle(el);
115
- return {
116
- tag: el.tagName.toLowerCase(),
117
- geometry: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, right: rect.right, bottom: rect.bottom },
118
- style: { display: computed.display, position: computed.position, overflowX: computed.overflowX, overflowY: computed.overflowY },
119
- layout: {
120
- scrollWidth: el.scrollWidth,
121
- scrollHeight: el.scrollHeight,
122
- clientWidth: el.clientWidth,
123
- clientHeight: el.clientHeight,
124
- scrollTop: el.scrollTop,
125
- scrollLeft: el.scrollLeft,
126
- },
127
- computedVisibility: computed.visibility,
128
- };
129
- });
130
- const visible = raw.style.display !== 'none' && raw.computedVisibility !== 'hidden' && raw.geometry.width > 0 && raw.geometry.height > 0;
131
- let semantics;
132
- try {
133
- const snapshot = await page.locator(selector).ariaSnapshot();
134
- const parsed = parseAriaSnapshotFirstLine(snapshot);
135
- semantics = parsed ? computedField(parsed) : unavailableField('no distinct accessible role/name is exposed for this target');
117
+ async function captureSemanticState(handle) {
118
+ return handle.evaluate((el) => {
119
+ const result = {};
120
+ const ariaDisabled = el.getAttribute('aria-disabled');
121
+ const nativeDisabled = 'disabled' in el ? Boolean(el.disabled) : false;
122
+ if (nativeDisabled || ariaDisabled !== null)
123
+ result.disabled = nativeDisabled || ariaDisabled === 'true';
124
+ const ariaExpanded = el.getAttribute('aria-expanded');
125
+ if (ariaExpanded !== null)
126
+ result.expanded = ariaExpanded === 'true';
127
+ const ariaChecked = el.getAttribute('aria-checked');
128
+ const isNativeCheckable = el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio');
129
+ if (ariaChecked !== null) {
130
+ result.checked = ariaChecked === 'mixed' ? 'mixed' : ariaChecked === 'true';
136
131
  }
137
- catch (err) {
138
- const message = err instanceof Error ? err.message : String(err);
139
- semantics = unavailableField(`accessibility snapshot failed: ${message}`);
132
+ else if (isNativeCheckable) {
133
+ result.checked = el.indeterminate ? 'mixed' : el.checked;
140
134
  }
135
+ const ariaSelected = el.getAttribute('aria-selected');
136
+ if (ariaSelected !== null)
137
+ result.selected = ariaSelected === 'true';
138
+ const ariaPressed = el.getAttribute('aria-pressed');
139
+ if (ariaPressed !== null)
140
+ result.pressed = ariaPressed === 'mixed' ? 'mixed' : ariaPressed === 'true';
141
+ const ariaCurrent = el.getAttribute('aria-current');
142
+ if (ariaCurrent !== null && ariaCurrent !== 'false' && ariaCurrent.length > 0) {
143
+ result.current = ariaCurrent === 'true' ? true : ariaCurrent;
144
+ }
145
+ return result;
146
+ });
147
+ }
148
+ /** Wraps the raw captured state: an empty object means no supported state applies to this target ("not-applicable"), never an unexplained empty available value. */
149
+ function semanticStateEvidence(raw) {
150
+ if (Object.keys(raw).length === 0) {
151
+ return { state: 'not-applicable', reason: 'no supported semantic state is exposed for this target' };
152
+ }
153
+ return { state: 'available', source: 'computed-browser', value: raw };
154
+ }
155
+ /** Derives landmark identity from the already-captured browser-exposed role only - never from locator kind or HTML tag (Section 15). */
156
+ function landmarkEvidence(role) {
157
+ if (role === undefined)
158
+ return unavailableField('no distinct accessible role is exposed for this target');
159
+ if (TARGET_LANDMARK_ROLE_SET.has(role)) {
160
+ return { state: 'available', source: 'derived', value: role, derivedFrom: ['semantics.role'] };
161
+ }
162
+ return { state: 'not-applicable', reason: `role "${role}" is not a recognized landmark role` };
163
+ }
164
+ /**
165
+ * Wraps a computed configured-target-only containment result into the
166
+ * persisted EvidenceField. `selfUnresolvedReason` covers the case where the
167
+ * current target itself never resolved (Section 18: containment is
168
+ * `unavailable`, not partial, when there is no resolved element to check
169
+ * containment for). A computed result with any `unresolvedTargetIds` is
170
+ * `partial` (already-proven relationships are preserved, never dropped);
171
+ * with none, it is `available`.
172
+ */
173
+ function containmentEvidence(computed, selfUnresolvedReason) {
174
+ if (selfUnresolvedReason !== undefined)
175
+ return { state: 'unavailable', reason: selfUnresolvedReason };
176
+ if (!computed)
177
+ return { state: 'unavailable', reason: 'containment could not be computed' };
178
+ if (computed.unresolvedTargetIds.length > 0) {
141
179
  return {
142
- resolution: {
143
- state: 'available',
144
- source: 'derived',
145
- value: { selectionMethod: 'css-selector', selectionStatus: 'matched' },
146
- derivedFrom: ['selector-query'],
180
+ state: 'partial',
181
+ source: 'browser',
182
+ value: computed,
183
+ reason: `containment could not be evaluated against: ${computed.unresolvedTargetIds.join(', ')}`,
184
+ };
185
+ }
186
+ return { state: 'available', source: 'browser', value: computed };
187
+ }
188
+ /**
189
+ * Captures the full target evidence for one resolved (single-match) target
190
+ * element, from the same live page/readiness state as the page evidence and
191
+ * screenshot: tag/geometry/style/layout/visibility (v0.1), role/name
192
+ * semantics (v0.1, via `ariaSnapshot()`), and semantic state/landmark
193
+ * (Batch 3). Takes an already-resolved `{ locator, handle }` pair - not a
194
+ * raw CSS selector, and never re-resolves - so every locator kind converges
195
+ * on this one measurement path and containment (computed once by the caller
196
+ * across every resolved target before this runs) is simply passed through.
197
+ */
198
+ async function captureResolvedTargetRecord(target, handle, attempts, selectedLocatorIndex, containment) {
199
+ const raw = await handle.evaluate((el) => {
200
+ const rect = el.getBoundingClientRect();
201
+ const computed = getComputedStyle(el);
202
+ return {
203
+ tag: el.tagName.toLowerCase(),
204
+ geometry: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, right: rect.right, bottom: rect.bottom },
205
+ style: { display: computed.display, position: computed.position, overflowX: computed.overflowX, overflowY: computed.overflowY },
206
+ layout: {
207
+ scrollWidth: el.scrollWidth,
208
+ scrollHeight: el.scrollHeight,
209
+ clientWidth: el.clientWidth,
210
+ clientHeight: el.clientHeight,
211
+ scrollTop: el.scrollTop,
212
+ scrollLeft: el.scrollLeft,
147
213
  },
214
+ computedVisibility: computed.visibility,
215
+ };
216
+ });
217
+ const visible = raw.style.display !== 'none' && raw.computedVisibility !== 'hidden' && raw.geometry.width > 0 && raw.geometry.height > 0;
218
+ let semantics;
219
+ let resolvedRole;
220
+ try {
221
+ const snapshot = await target.ariaSnapshot();
222
+ const parsed = parseAriaSnapshotFirstLine(snapshot);
223
+ semantics = parsed ? computedField(parsed) : unavailableField('no distinct accessible role/name is exposed for this target');
224
+ resolvedRole = parsed?.role;
225
+ }
226
+ catch (err) {
227
+ const message = err instanceof Error ? err.message : String(err);
228
+ semantics = unavailableField(`accessibility snapshot failed: ${message}`);
229
+ }
230
+ let semanticState;
231
+ try {
232
+ semanticState = semanticStateEvidence(await captureSemanticState(handle));
233
+ }
234
+ catch (err) {
235
+ const message = err instanceof Error ? err.message : String(err);
236
+ semanticState = unavailableField(`semantic-state evaluation failed: ${message}`);
237
+ }
238
+ const resolution = {
239
+ selectionMethod: 'ordered-locators',
240
+ selectionStatus: 'matched',
241
+ selectedLocatorKind: attempts[selectedLocatorIndex]?.locatorKind ?? 'css',
242
+ selectedLocatorIndex,
243
+ usedFallback: selectedLocatorIndex > 0,
244
+ confidence: 'exact',
245
+ attempts,
246
+ };
247
+ return {
248
+ record: {
249
+ resolution: { state: 'available', source: 'derived', value: resolution, derivedFrom: ['locator-attempts'] },
148
250
  tag: browserField(raw.tag),
149
251
  geometry: browserField(raw.geometry),
150
252
  style: computedField(raw.style),
151
253
  layout: browserField(raw.layout),
152
254
  visibility: derivedField({ visible }, ['style.display', 'computed-visibility', 'geometry.width', 'geometry.height']),
153
255
  semantics,
154
- };
256
+ semanticState,
257
+ landmark: landmarkEvidence(resolvedRole),
258
+ containment,
259
+ },
260
+ visible,
261
+ };
262
+ }
263
+ /**
264
+ * A CSS quoted-string literal for an attribute selector value (`[attr="..."]`).
265
+ * Only backslash and double-quote need escaping inside a CSS quoted string;
266
+ * this keeps the configured id/data-attribute value literal - it is never
267
+ * reinterpreted as selector syntax (e.g. a value containing `#`, `.`, `[`,
268
+ * or `"` still matches exactly, it cannot escape the attribute-value
269
+ * position it was placed in).
270
+ */
271
+ function cssAttributeValueLiteral(value) {
272
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
273
+ }
274
+ /**
275
+ * Maps one frozen v0.2 TargetLocator to the Playwright `Locator` that
276
+ * resolves it - the single point where locator kind becomes a real browser
277
+ * query. `role`/`text` use Playwright's own semantic locators (real
278
+ * accessibility-tree/text resolution, not a hand-rolled approximation);
279
+ * `id`/`data-attribute` use an exact CSS attribute-equals selector (never
280
+ * `#id`/bare-value syntax, so the configured value can never be
281
+ * reinterpreted as selector syntax); `semantic-element` uses a plain tag
282
+ * selector from the Batch 1 frozen tag set; `css` is unchanged v0.1
283
+ * behavior. Every kind converges on the same Playwright `Locator` type, so
284
+ * cardinality/measurement downstream never branches on locator kind again.
285
+ */
286
+ function buildPlaywrightLocator(page, locator) {
287
+ switch (locator.kind) {
288
+ case 'css':
289
+ return page.locator(locator.selector);
290
+ case 'id':
291
+ return page.locator(`[id=${cssAttributeValueLiteral(locator.value)}]`);
292
+ case 'data-attribute':
293
+ return page.locator(`[${locator.attribute}=${cssAttributeValueLiteral(locator.value)}]`);
294
+ case 'semantic-element':
295
+ return page.locator(locator.tag);
296
+ case 'role':
297
+ return page.getByRole(locator.role, locator.name === undefined ? undefined : { name: locator.name, exact: true });
298
+ case 'text':
299
+ return page.getByText(locator.text, { exact: true });
155
300
  }
156
- finally {
157
- await handle.dispose();
301
+ }
302
+ /**
303
+ * Evaluates one locator against the live page: builds its real Playwright
304
+ * `Locator` and measures cardinality via `.count()` (no waiting, no
305
+ * `.first()`/`.nth(0)` shortcut that would silently resolve an ambiguous
306
+ * match). A locator that cannot be constructed or counted reliably is
307
+ * `unavailable`, never silently treated as zero matches.
308
+ */
309
+ async function evaluateLocatorAttempt(page, locator) {
310
+ try {
311
+ const playwrightLocator = buildPlaywrightLocator(page, locator);
312
+ const matchCount = await playwrightLocator.count();
313
+ if (matchCount === 0)
314
+ return { playwrightLocator, outcome: { status: 'not-found', matchCount: 0 } };
315
+ if (matchCount > 1)
316
+ return { playwrightLocator, outcome: { status: 'ambiguous', matchCount } };
317
+ return { playwrightLocator, outcome: { status: 'matched', matchCount: 1 } };
318
+ }
319
+ catch {
320
+ return { playwrightLocator: undefined, outcome: { status: 'unavailable' } };
158
321
  }
159
322
  }
160
- /** Observes every explicitly configured Batch 1 target from the same live page, honoring the 0/1/many cardinality contract. */
161
- export async function captureTargetEvidence(page, targets) {
162
- const targetEvidence = {};
163
- const diagnostics = [];
323
+ /**
324
+ * Looks up one already-resolved configured target by its stable observer
325
+ * name (case-insensitively, matching the same case-insensitive comparison
326
+ * `request.ts#normalizeRequest` already uses for target-name uniqueness) -
327
+ * never a second locator/resolution algorithm, just a lookup into the
328
+ * `resolveConfiguredTargets` result already computed once for this
329
+ * observation.
330
+ */
331
+ export function findResolvedTarget(resolved, name) {
332
+ const lower = name.toLowerCase();
333
+ return resolved.find((info) => info.name.toLowerCase() === lower);
334
+ }
335
+ /**
336
+ * The one canonical target-resolution algorithm (Phase 1 of the v0.2 Batch 3
337
+ * three-phase design below), exported so v0.3 Batch 2 scroll-scenario
338
+ * runtime-snapshot capture can resolve configured targets exactly once and
339
+ * reuse the same live `{locator, handle}` pairs across its initial/final
340
+ * snapshots, instead of re-implementing resolution with different locator
341
+ * semantics. Callers own disposing any returned `handle`.
342
+ */
343
+ export async function resolveConfiguredTargets(page, targets) {
344
+ const infos = [];
164
345
  for (const target of targets) {
165
- const matchCount = await page.evaluate((selector) => document.querySelectorAll(selector).length, target.selector);
166
- if (matchCount === 0) {
167
- targetEvidence[target.name] = missingTargetRecord();
168
- diagnostics.push(diagnostic('target-missing', `no element matched selector for target "${target.name}"`, target.name));
169
- continue;
346
+ const attempts = [];
347
+ let stopStatus;
348
+ let matchedIndex;
349
+ let matchedPlaywrightLocator;
350
+ for (let index = 0; index < target.locators.length; index += 1) {
351
+ const locator = target.locators[index];
352
+ const { playwrightLocator, outcome } = await evaluateLocatorAttempt(page, locator);
353
+ attempts.push({
354
+ locatorIndex: index,
355
+ locatorKind: locator.kind,
356
+ status: outcome.status,
357
+ ...(outcome.matchCount !== undefined ? { matchCount: outcome.matchCount } : {}),
358
+ });
359
+ if (outcome.status === 'matched' && playwrightLocator) {
360
+ stopStatus = 'matched';
361
+ matchedIndex = index;
362
+ matchedPlaywrightLocator = playwrightLocator;
363
+ break;
364
+ }
365
+ if (outcome.status === 'ambiguous') {
366
+ stopStatus = 'ambiguous';
367
+ break;
368
+ }
369
+ if (outcome.status === 'unavailable') {
370
+ stopStatus = 'unavailable';
371
+ break;
372
+ }
373
+ // 'not-found': fall through to the next configured locator.
374
+ }
375
+ if (stopStatus === 'matched' && matchedPlaywrightLocator && matchedIndex !== undefined) {
376
+ try {
377
+ const handles = await matchedPlaywrightLocator.elementHandles();
378
+ const handle = handles[0];
379
+ if (handle) {
380
+ infos.push({
381
+ name: target.name,
382
+ attempts,
383
+ status: 'matched',
384
+ selectedIndex: matchedIndex,
385
+ locator: matchedPlaywrightLocator,
386
+ handle: handle,
387
+ });
388
+ }
389
+ else {
390
+ infos.push({ name: target.name, attempts, status: 'not-found' });
391
+ }
392
+ }
393
+ catch (err) {
394
+ const message = err instanceof Error ? err.message : String(err);
395
+ infos.push({ name: target.name, attempts, status: 'unavailable', unavailableReason: `target evaluation failed: ${message}` });
396
+ }
170
397
  }
171
- if (matchCount > 1) {
172
- targetEvidence[target.name] = ambiguousTargetRecord(matchCount);
173
- diagnostics.push(diagnostic('target-ambiguous', `${matchCount} elements matched selector for target "${target.name}"`, target.name));
174
- continue;
398
+ else if (stopStatus === 'ambiguous') {
399
+ infos.push({ name: target.name, attempts, status: 'ambiguous' });
175
400
  }
176
- try {
177
- targetEvidence[target.name] = await captureResolvedTargetRecord(page, target.selector);
401
+ else if (stopStatus === 'unavailable') {
402
+ infos.push({ name: target.name, attempts, status: 'unavailable' });
403
+ }
404
+ else {
405
+ infos.push({ name: target.name, attempts, status: 'not-found' });
406
+ }
407
+ }
408
+ return infos;
409
+ }
410
+ /**
411
+ * Observes every explicitly configured target from the same live page,
412
+ * honoring the frozen ordered-locator resolution contract: 0 matches tries
413
+ * the next locator; exactly 1 match selects and stops; more than 1 match is
414
+ * ambiguous and stops (never falls through); an unevaluable locator is
415
+ * unavailable and stops (never falls through). Ambiguity never triggers
416
+ * fallback.
417
+ *
418
+ * Batch 3 restructures this into three phases over one resolved set: (1)
419
+ * resolve every configured target exactly once, keeping a live
420
+ * `{locator, handle}` for each match; (2) compute bounded pairwise DOM
421
+ * containment among only the resolved configured targets, reusing those
422
+ * same handles (never re-resolving, never a second/independent resolution
423
+ * algorithm); (3) measure every resolved target and assemble its evidence,
424
+ * attaching the phase-2 containment result. Every handle is disposed once,
425
+ * after all three phases, regardless of outcome.
426
+ */
427
+ export async function captureTargetEvidence(page, targets) {
428
+ const targetEvidence = {};
429
+ const diagnostics = [];
430
+ // Phase 1: resolve every configured target exactly once.
431
+ const infos = await resolveConfiguredTargets(page, targets);
432
+ try {
433
+ // Phase 2: bounded pairwise DOM containment among the configured targets
434
+ // only (never unconfigured ancestors), in configured target order.
435
+ const containmentByName = new Map();
436
+ for (const info of infos) {
437
+ if (info.status !== 'matched' || !info.handle)
438
+ continue;
439
+ const selfHandle = info.handle;
440
+ const containedByTargetIds = [];
441
+ const evaluatedTargetIds = [];
442
+ const unresolvedTargetIds = [];
443
+ for (const other of infos) {
444
+ if (other.name === info.name)
445
+ continue;
446
+ if (other.status === 'matched' && other.handle) {
447
+ evaluatedTargetIds.push(other.name);
448
+ const contains = await other.handle.evaluate((elOther, elSelf) => elOther !== elSelf && elOther.contains(elSelf), selfHandle);
449
+ if (contains)
450
+ containedByTargetIds.push(other.name);
451
+ }
452
+ else {
453
+ unresolvedTargetIds.push(other.name);
454
+ }
455
+ }
456
+ containmentByName.set(info.name, containmentEvidence({ containedByTargetIds, evaluatedTargetIds, unresolvedTargetIds }, undefined));
178
457
  }
179
- catch (err) {
180
- const message = err instanceof Error ? err.message : String(err);
181
- const reason = `target evaluation failed: ${message}`;
182
- targetEvidence[target.name] = {
183
- resolution: {
184
- state: 'available',
185
- source: 'derived',
186
- value: { selectionMethod: 'css-selector', selectionStatus: 'matched' },
187
- derivedFrom: ['selector-query'],
188
- },
189
- tag: unavailableField(reason),
190
- geometry: unavailableField(reason),
191
- style: unavailableField(reason),
192
- layout: unavailableField(reason),
193
- visibility: unavailableField(reason),
194
- semantics: unavailableField(reason),
195
- };
196
- diagnostics.push(diagnostic('browser-evidence-unavailable', reason, target.name));
458
+ // Phase 3: measure resolved targets and assemble every target's evidence.
459
+ for (const info of infos) {
460
+ if (info.status === 'matched' && info.locator && info.handle && info.selectedIndex !== undefined) {
461
+ try {
462
+ const containment = containmentByName.get(info.name) ?? containmentEvidence(undefined, 'containment could not be computed');
463
+ const { record, visible } = await captureResolvedTargetRecord(info.locator, info.handle, info.attempts, info.selectedIndex, containment);
464
+ targetEvidence[info.name] = record;
465
+ if (!visible) {
466
+ diagnostics.push(diagnostic('target-hidden', `target "${info.name}" resolved but is not visible`, info.name));
467
+ }
468
+ }
469
+ catch (err) {
470
+ const message = err instanceof Error ? err.message : String(err);
471
+ const reason = `target evaluation failed: ${message}`;
472
+ targetEvidence[info.name] = unresolvedTargetRecord('unavailable', info.attempts, reason, containmentEvidence(undefined, `target itself could not be measured: ${reason}`));
473
+ diagnostics.push(diagnostic('browser-evidence-unavailable', reason, info.name));
474
+ }
475
+ continue;
476
+ }
477
+ const selfUnresolvedReason = `target itself did not resolve (status: ${info.status})`;
478
+ if (info.status === 'ambiguous') {
479
+ const lastAttempt = info.attempts[info.attempts.length - 1];
480
+ const matchCount = lastAttempt?.matchCount ?? 0;
481
+ targetEvidence[info.name] = unresolvedTargetRecord('ambiguous', info.attempts, `target locator matched ${matchCount} elements; expected exactly one`, containmentEvidence(undefined, selfUnresolvedReason));
482
+ diagnostics.push(diagnostic('target-ambiguous', `${matchCount} elements matched a locator for target "${info.name}"`, info.name));
483
+ }
484
+ else if (info.status === 'unavailable') {
485
+ const reason = info.unavailableReason ?? `target locator could not be evaluated reliably for "${info.name}"`;
486
+ targetEvidence[info.name] = unresolvedTargetRecord('unavailable', info.attempts, reason, containmentEvidence(undefined, selfUnresolvedReason));
487
+ diagnostics.push(diagnostic('browser-evidence-unavailable', reason, info.name));
488
+ }
489
+ else {
490
+ targetEvidence[info.name] = unresolvedTargetRecord('not-found', info.attempts, 'no configured locator matched an element', containmentEvidence(undefined, selfUnresolvedReason));
491
+ diagnostics.push(diagnostic('target-missing', `no locator matched an element for target "${info.name}"`, info.name));
492
+ }
197
493
  }
198
494
  }
495
+ finally {
496
+ await Promise.all(infos.filter((info) => info.handle).map((info) => info.handle.dispose()));
497
+ }
199
498
  return { targetEvidence, diagnostics };
200
499
  }
201
500
  //# sourceMappingURL=evidenceCapture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evidenceCapture.js","sourceRoot":"","sources":["../../src/browser/evidenceCapture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evidenceCapture.js","sourceRoot":"","sources":["../../src/browser/evidenceCapture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Page } from 'playwright';
2
+ import type { Viewport } from '../request/request.js';
3
+ import type { ScrollRuntimeSnapshot } from '../domain/schema.js';
4
+ import type { ResolvedTargetInfo } from './evidenceCapture.js';
5
+ /**
6
+ * Captures one point-in-time bounded `ScrollRuntimeSnapshot` (Batch 1 frozen
7
+ * contract) from the live page, using already-resolved target handles -
8
+ * never re-resolving targets itself. Called twice by the scenario lifecycle
9
+ * (once before the scroll action, once after stabilization) against the
10
+ * exact same `resolved` set, so "which browser element is target X" is
11
+ * answered exactly once per observation's scenario capture.
12
+ */
13
+ export declare function captureScrollRuntimeSnapshot(page: Page, resolved: readonly ResolvedTargetInfo[], viewport: Viewport): Promise<ScrollRuntimeSnapshot>;
14
+ /**
15
+ * Immediate, non-smooth window scroll using the Batch 1 normalized delta.
16
+ * `behavior: 'instant'` guarantees no smooth-scroll animation regardless of
17
+ * any `scroll-behavior: smooth` the observed page's own CSS declares - the
18
+ * position change is synchronous within this one `evaluate()` call.
19
+ */
20
+ export declare function performWindowScrollBy(page: Page, deltaX: number, deltaY: number): Promise<void>;
21
+ /**
22
+ * Immediate, non-smooth scroll of one uniquely-resolved configured target
23
+ * element, using the same `behavior: 'instant'` primitive as
24
+ * {@link performWindowScrollBy} - one stabilization/execution contract for
25
+ * both action kinds, never a forked one. `element.scrollBy` is a real,
26
+ * browser-native immediate-scroll method on every `Element` (no dependency
27
+ * on the target actually being scrollable - a non-overflowing target simply
28
+ * produces no position change, which is a valid, honestly-reported outcome).
29
+ */
30
+ export declare function performTargetScrollBy(handle: NonNullable<ResolvedTargetInfo['handle']>, deltaX: number, deltaY: number): Promise<void>;
31
+ /** The Batch 1 frozen stabilization contract: exactly two `requestAnimationFrame` cycles on the live page, no timers/sleeps/network-idle substitutes. */
32
+ export declare function waitTwoAnimationFrames(page: Page): Promise<void>;