my-frontend-observer 0.2.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 (43) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +24 -10
  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 +29 -2
  8. package/dist/browser/evidenceCapture.js +43 -19
  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 +79 -1
  15. package/dist/cli.js.map +1 -1
  16. package/dist/domain/identity.d.ts +8 -3
  17. package/dist/domain/identity.js +9 -3
  18. package/dist/domain/identity.js.map +1 -1
  19. package/dist/domain/schema.d.ts +116 -2
  20. package/dist/domain/schema.js +186 -2
  21. package/dist/domain/schema.js.map +1 -1
  22. package/dist/domain/scrollEvidence.d.ts +51 -0
  23. package/dist/domain/scrollEvidence.js +134 -0
  24. package/dist/domain/scrollEvidence.js.map +1 -0
  25. package/dist/index.d.ts +3 -3
  26. package/dist/index.js +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/request/request.d.ts +29 -0
  29. package/dist/request/request.js +108 -0
  30. package/dist/request/request.js.map +1 -1
  31. package/docs/ARCHITECTURE.md +35 -2
  32. package/docs/CI_CD.md +33 -6
  33. package/docs/COMMANDS.md +110 -6
  34. package/docs/CONTRACTS.md +77 -4
  35. package/docs/CURRENT_STATE.md +55 -10
  36. package/docs/DEVELOPMENT.md +25 -8
  37. package/docs/PROJECT_OVERVIEW.md +10 -7
  38. package/docs/QUICKSTART.md +2 -1
  39. package/docs/RELEASE.md +10 -5
  40. package/docs/ROADMAP.md +5 -0
  41. package/docs/SECURITY.md +1 -1
  42. package/docs/WORKFLOWS.md +36 -18
  43. package/package.json +1 -1
@@ -0,0 +1,163 @@
1
+ import { deriveOverflowEvidence, deriveViewportRelation } from '../domain/scrollEvidence.js';
2
+ function browserField(value) {
3
+ return { state: 'available', source: 'browser', value };
4
+ }
5
+ function computedField(value) {
6
+ return { state: 'available', source: 'computed-browser', value };
7
+ }
8
+ function derivedField(value, derivedFrom) {
9
+ return { state: 'available', source: 'derived', value, derivedFrom };
10
+ }
11
+ function unavailableField(reason) {
12
+ return { state: 'unavailable', reason };
13
+ }
14
+ function notApplicableField(reason) {
15
+ return { state: 'not-applicable', reason };
16
+ }
17
+ /**
18
+ * `document.scrollingElement` (falling back to `documentElement`, which is
19
+ * what `scrollingElement` resolves to for any standards-mode document) is
20
+ * the browser's own answer to "which element actually scrolls the page" -
21
+ * that becomes `document.root`. `documentElement` is included as its own
22
+ * field only when it is a *different* element from the scrolling root
23
+ * (legacy quirks-mode pages, not exercised by this repository's fixtures);
24
+ * otherwise it would just duplicate `root`'s own metrics. `body` is always
25
+ * a distinct DOM element from `documentElement` when present, so its own
26
+ * metrics are genuine measurement, not fabrication, even when numerically
27
+ * equal to `root`.
28
+ */
29
+ async function captureWindowAndDocument(page) {
30
+ return page.evaluate(() => {
31
+ const metricsOf = (el) => ({
32
+ scrollTop: el.scrollTop,
33
+ scrollLeft: el.scrollLeft,
34
+ scrollWidth: el.scrollWidth,
35
+ scrollHeight: el.scrollHeight,
36
+ clientWidth: el.clientWidth,
37
+ clientHeight: el.clientHeight,
38
+ });
39
+ const scrollingElement = document.scrollingElement ?? document.documentElement;
40
+ const rootStyle = getComputedStyle(scrollingElement);
41
+ const body = document.body;
42
+ return {
43
+ scrollX: window.scrollX,
44
+ scrollY: window.scrollY,
45
+ root: metricsOf(scrollingElement),
46
+ rootOverflowX: rootStyle.overflowX,
47
+ rootOverflowY: rootStyle.overflowY,
48
+ documentElement: scrollingElement !== document.documentElement ? metricsOf(document.documentElement) : undefined,
49
+ body: body ? metricsOf(body) : undefined,
50
+ };
51
+ });
52
+ }
53
+ /** Same hidden-element convention as `evidenceCapture.ts#captureResolvedTargetRecord`: `display:none`/`visibility:hidden`/zero-size all mean "not visibly rendered". */
54
+ async function captureTargetScrollMeasurement(handle) {
55
+ return handle.evaluate((el) => {
56
+ const rect = el.getBoundingClientRect();
57
+ const computed = getComputedStyle(el);
58
+ return {
59
+ metrics: {
60
+ scrollTop: el.scrollTop,
61
+ scrollLeft: el.scrollLeft,
62
+ scrollWidth: el.scrollWidth,
63
+ scrollHeight: el.scrollHeight,
64
+ clientWidth: el.clientWidth,
65
+ clientHeight: el.clientHeight,
66
+ },
67
+ overflowX: computed.overflowX,
68
+ overflowY: computed.overflowY,
69
+ rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, right: rect.right, bottom: rect.bottom },
70
+ visible: computed.display !== 'none' && computed.visibility !== 'hidden' && rect.width > 0 && rect.height > 0,
71
+ };
72
+ });
73
+ }
74
+ /**
75
+ * Builds one bounded `TargetScrollRuntimeState` for a single already-resolved
76
+ * configured target. Metrics/overflow/boundingRect are reported as real
77
+ * browser measurement (even when zero, for a hidden element) - consistent
78
+ * with how `evidenceCapture.ts` already reports geometry for hidden v0.2
79
+ * targets - but `viewportRelation` is `not-applicable` for a hidden target
80
+ * (Batch 1 Section 20/24: hidden is not the same claim as offscreen, so a
81
+ * hidden target must never receive ordinary above/below/intersecting
82
+ * geometry).
83
+ */
84
+ async function captureTargetScrollRuntimeState(info, viewport) {
85
+ if (info.status !== 'matched' || !info.handle) {
86
+ const reason = info.unavailableReason ?? `target itself did not resolve (status: ${info.status})`;
87
+ return {
88
+ metrics: unavailableField(reason),
89
+ overflow: unavailableField(reason),
90
+ boundingRect: unavailableField(reason),
91
+ viewportRelation: unavailableField(reason),
92
+ };
93
+ }
94
+ const raw = await captureTargetScrollMeasurement(info.handle);
95
+ const overflow = deriveOverflowEvidence(raw.metrics, raw.overflowX, raw.overflowY);
96
+ const viewportRelation = raw.visible
97
+ ? derivedField(deriveViewportRelation(raw.rect, viewport), ['boundingRect', 'viewport'])
98
+ : notApplicableField('target is hidden or non-rendered; viewport relation is not meaningful');
99
+ return {
100
+ metrics: browserField(raw.metrics),
101
+ overflow: computedField(overflow),
102
+ boundingRect: browserField(raw.rect),
103
+ viewportRelation,
104
+ };
105
+ }
106
+ /**
107
+ * Captures one point-in-time bounded `ScrollRuntimeSnapshot` (Batch 1 frozen
108
+ * contract) from the live page, using already-resolved target handles -
109
+ * never re-resolving targets itself. Called twice by the scenario lifecycle
110
+ * (once before the scroll action, once after stabilization) against the
111
+ * exact same `resolved` set, so "which browser element is target X" is
112
+ * answered exactly once per observation's scenario capture.
113
+ */
114
+ export async function captureScrollRuntimeSnapshot(page, resolved, viewport) {
115
+ const raw = await captureWindowAndDocument(page);
116
+ const rootOverflow = deriveOverflowEvidence(raw.root, raw.rootOverflowX, raw.rootOverflowY);
117
+ const targets = {};
118
+ for (const info of resolved) {
119
+ targets[info.name] = await captureTargetScrollRuntimeState(info, viewport);
120
+ }
121
+ return {
122
+ window: { scrollX: raw.scrollX, scrollY: raw.scrollY },
123
+ document: {
124
+ root: raw.root,
125
+ rootOverflow,
126
+ ...(raw.documentElement ? { documentElement: raw.documentElement } : {}),
127
+ ...(raw.body ? { body: raw.body } : {}),
128
+ },
129
+ targets,
130
+ };
131
+ }
132
+ /**
133
+ * Immediate, non-smooth window scroll using the Batch 1 normalized delta.
134
+ * `behavior: 'instant'` guarantees no smooth-scroll animation regardless of
135
+ * any `scroll-behavior: smooth` the observed page's own CSS declares - the
136
+ * position change is synchronous within this one `evaluate()` call.
137
+ */
138
+ export async function performWindowScrollBy(page, deltaX, deltaY) {
139
+ await page.evaluate(({ deltaX, deltaY }) => {
140
+ window.scrollBy({ left: deltaX, top: deltaY, behavior: 'instant' });
141
+ }, { deltaX, deltaY });
142
+ }
143
+ /**
144
+ * Immediate, non-smooth scroll of one uniquely-resolved configured target
145
+ * element, using the same `behavior: 'instant'` primitive as
146
+ * {@link performWindowScrollBy} - one stabilization/execution contract for
147
+ * both action kinds, never a forked one. `element.scrollBy` is a real,
148
+ * browser-native immediate-scroll method on every `Element` (no dependency
149
+ * on the target actually being scrollable - a non-overflowing target simply
150
+ * produces no position change, which is a valid, honestly-reported outcome).
151
+ */
152
+ export async function performTargetScrollBy(handle, deltaX, deltaY) {
153
+ await handle.evaluate((el, { deltaX, deltaY }) => {
154
+ el.scrollBy({ left: deltaX, top: deltaY, behavior: 'instant' });
155
+ }, { deltaX, deltaY });
156
+ }
157
+ /** The Batch 1 frozen stabilization contract: exactly two `requestAnimationFrame` cycles on the live page, no timers/sleeps/network-idle substitutes. */
158
+ export async function waitTwoAnimationFrames(page) {
159
+ await page.evaluate(() => new Promise((resolve) => {
160
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
161
+ }));
162
+ }
163
+ //# sourceMappingURL=scrollCapture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollCapture.js","sourceRoot":"","sources":["../../src/browser/scrollCapture.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { Diagnostic } from '../domain/diagnostics.js';
2
2
  import type { EvidenceField } from '../domain/evidence.js';
3
- import type { TargetEvidenceRecord } from '../domain/schema.js';
3
+ import type { TargetEvidenceRecord, ScrollScenarioEvidence } from '../domain/schema.js';
4
4
  export interface BrowserProvenance {
5
5
  engine: string;
6
6
  version: string;
@@ -16,6 +16,8 @@ export type BrowserCaptureResult = {
16
16
  pageEvidence: Record<string, EvidenceField<unknown>>;
17
17
  targetEvidence: Record<string, TargetEvidenceRecord>;
18
18
  diagnostics: Diagnostic[];
19
+ /** v0.3 Batch 2: present only when the request configured a scrollScenario. */
20
+ scrollScenarioEvidence?: ScrollScenarioEvidence;
19
21
  } | {
20
22
  ok: false;
21
23
  diagnostics: Diagnostic[];
package/dist/cli.js CHANGED
@@ -50,6 +50,19 @@ Options:
50
50
  itself is never persisted into the artifact or
51
51
  included in the observation's request identity.
52
52
  Cannot be combined with --target.
53
+ --scroll-scenario-file <json-file>
54
+ Loads one bounded runtime scroll scenario from a
55
+ local JSON file: { "action": { "kind":
56
+ "window-scroll-by"|"target-scroll-by", ...,
57
+ "deltaX": <int>, "deltaY": <int> } }.
58
+ "target-scroll-by" additionally requires a
59
+ "target" naming a configured stable target.
60
+ Exactly zero or one scenario per observation.
61
+ Relative paths resolve from the current working
62
+ directory; the file path itself is never
63
+ persisted into the artifact or included in the
64
+ observation's request identity. May be combined
65
+ with either --target or --targets-file.
53
66
  --output <directory> Portable, relative output location for the
54
67
  observation artifact.
55
68
  --timeout <ms> Overall request timeout in milliseconds.
@@ -84,6 +97,8 @@ function parseObserveArgs(argv) {
84
97
  let timeoutMs;
85
98
  let targetsFilePath;
86
99
  let targetsFileFlagCount = 0;
100
+ let scrollScenarioFilePath;
101
+ let scrollScenarioFileFlagCount = 0;
87
102
  for (let i = 0; i < argv.length; i += 1) {
88
103
  const arg = argv[i];
89
104
  switch (arg) {
@@ -126,6 +141,20 @@ function parseObserveArgs(argv) {
126
141
  }
127
142
  break;
128
143
  }
144
+ case '--scroll-scenario-file': {
145
+ const value = argv[(i += 1)];
146
+ scrollScenarioFileFlagCount += 1;
147
+ if (value === undefined) {
148
+ errors.push('--scroll-scenario-file requires a file path argument');
149
+ }
150
+ else if (scrollScenarioFileFlagCount > 1) {
151
+ errors.push('--scroll-scenario-file may only be specified once');
152
+ }
153
+ else {
154
+ scrollScenarioFilePath = value;
155
+ }
156
+ break;
157
+ }
129
158
  case '--output':
130
159
  outputLocation = argv[(i += 1)];
131
160
  break;
@@ -158,7 +187,12 @@ function parseObserveArgs(argv) {
158
187
  ...(outputLocation === undefined ? {} : { outputLocation }),
159
188
  ...(timeoutMs === undefined ? {} : { timeoutMs }),
160
189
  };
161
- return { ok: true, raw, ...(targetsFilePath === undefined ? {} : { targetsFilePath }) };
190
+ return {
191
+ ok: true,
192
+ raw,
193
+ ...(targetsFilePath === undefined ? {} : { targetsFilePath }),
194
+ ...(scrollScenarioFilePath === undefined ? {} : { scrollScenarioFilePath }),
195
+ };
162
196
  }
163
197
  const TARGETS_FILE_ALLOWED_ROOT_FIELDS = new Set(['targets']);
164
198
  /**
@@ -200,6 +234,41 @@ function loadTargetsFile(filePath) {
200
234
  }
201
235
  return { ok: true, targets: record.targets };
202
236
  }
237
+ /**
238
+ * CLI/input-boundary-only responsibility, mirroring `loadTargetsFile`: read
239
+ * one local JSON file and validate only the root shape this file format
240
+ * owns (plain, non-array object) - the file supplies the value of
241
+ * `RawObservationRequest.scrollScenario` directly (no wrapper field), so
242
+ * there is no root-field allowlist to enforce here the way
243
+ * `loadTargetsFile` enforces `{ "targets": [...] }`. Every scenario/action
244
+ * rule (supported kind, required action, delta types/bounds, the both-zero
245
+ * rule, stable target reference, unknown fields) stays owned by
246
+ * `normalizeRequest()`, not duplicated here. The file path itself is never
247
+ * returned to the caller beyond this function, so it can never reach the
248
+ * persisted request/artifact.
249
+ */
250
+ function loadScrollScenarioFile(filePath) {
251
+ let rawText;
252
+ try {
253
+ rawText = readFileSync(filePath, 'utf8');
254
+ }
255
+ catch (err) {
256
+ const message = err instanceof Error ? err.message : String(err);
257
+ return { ok: false, error: `--scroll-scenario-file could not be read: ${message}` };
258
+ }
259
+ let parsed;
260
+ try {
261
+ parsed = JSON.parse(rawText);
262
+ }
263
+ catch (err) {
264
+ const message = err instanceof Error ? err.message : String(err);
265
+ return { ok: false, error: `--scroll-scenario-file is not valid JSON: ${message}` };
266
+ }
267
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
268
+ return { ok: false, error: '--scroll-scenario-file root must be a JSON object' };
269
+ }
270
+ return { ok: true, scenario: parsed };
271
+ }
203
272
  function formatDiagnostic(diagnostic) {
204
273
  const target = diagnostic.targetName === undefined ? '' : ` (target: ${diagnostic.targetName})`;
205
274
  return `[${diagnostic.code}] ${diagnostic.message}${target}`;
@@ -228,6 +297,15 @@ async function runObserveCommand(argv, io) {
228
297
  }
229
298
  raw = { ...raw, targets: loaded.targets };
230
299
  }
300
+ if (parsedArgs.scrollScenarioFilePath !== undefined) {
301
+ const loaded = loadScrollScenarioFile(parsedArgs.scrollScenarioFilePath);
302
+ if (!loaded.ok) {
303
+ io.stderr(`error: ${loaded.error}\n`);
304
+ io.stderr(OBSERVE_HELP);
305
+ return 1;
306
+ }
307
+ raw = { ...raw, scrollScenario: loaded.scenario };
308
+ }
231
309
  const normalized = normalizeRequest(raw);
232
310
  if (!normalized.ok) {
233
311
  for (const diagnostic of normalized.diagnostics)
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,14 @@
1
1
  import type { NormalizedObservationRequest } from '../request/request.js';
2
2
  /**
3
3
  * Pure function of {targetUrl, viewport, targets (order preserved -
4
- * semantic), readiness.condition} only. timeoutMs, readiness.timeoutMs, and
5
- * outputLocation never affect the result - this is the frozen definition of
6
- * "same configuration" for this batch.
4
+ * semantic), readiness.condition, scrollScenario} only. timeoutMs,
5
+ * readiness.timeoutMs, and outputLocation never affect the result - this is
6
+ * the frozen definition of "same configuration" for this batch. A request
7
+ * with no `scrollScenario` omits the key entirely (rather than setting it to
8
+ * `undefined`) so the v0.2 identity for scenario-less requests is unchanged
9
+ * by this v0.3 extension. Only the requested action configuration
10
+ * participates - never runtime scroll results, movement success/failure, or
11
+ * scroll-owner interpretation, which are runtime evidence, not identity.
7
12
  */
8
13
  export declare function buildRequestIdentity(request: NormalizedObservationRequest): string;
9
14
  /**
@@ -12,9 +12,14 @@ function canonicalize(value) {
12
12
  }
13
13
  /**
14
14
  * Pure function of {targetUrl, viewport, targets (order preserved -
15
- * semantic), readiness.condition} only. timeoutMs, readiness.timeoutMs, and
16
- * outputLocation never affect the result - this is the frozen definition of
17
- * "same configuration" for this batch.
15
+ * semantic), readiness.condition, scrollScenario} only. timeoutMs,
16
+ * readiness.timeoutMs, and outputLocation never affect the result - this is
17
+ * the frozen definition of "same configuration" for this batch. A request
18
+ * with no `scrollScenario` omits the key entirely (rather than setting it to
19
+ * `undefined`) so the v0.2 identity for scenario-less requests is unchanged
20
+ * by this v0.3 extension. Only the requested action configuration
21
+ * participates - never runtime scroll results, movement success/failure, or
22
+ * scroll-owner interpretation, which are runtime evidence, not identity.
18
23
  */
19
24
  export function buildRequestIdentity(request) {
20
25
  const semanticView = {
@@ -22,6 +27,7 @@ export function buildRequestIdentity(request) {
22
27
  viewport: { width: request.viewport.width, height: request.viewport.height },
23
28
  targets: request.targets.map((target) => ({ name: target.name.toLowerCase(), locators: target.locators })),
24
29
  readinessCondition: request.readiness.condition,
30
+ ...(request.scrollScenario ? { scrollScenario: request.scrollScenario } : {}),
25
31
  };
26
32
  const serialized = JSON.stringify(canonicalize(semanticView));
27
33
  return createHash('sha256').update(serialized).digest('hex');
@@ -1 +1 @@
1
- {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/domain/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtD,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,CAAC,CAAU,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqC;IACxE,MAAM,YAAY,GAAG;QACnB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC5E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1G,kBAAkB,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS;KAChD,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,eAAuB;IAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,GAAG,eAAe,IAAI,KAAK,EAAE,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/domain/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtD,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,CAAC,CAAU,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqC;IACxE,MAAM,YAAY,GAAG;QACnB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC5E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1G,kBAAkB,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS;QAC/C,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,eAAuB;IAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,GAAG,eAAe,IAAI,KAAK,EAAE,CAAC;AACvC,CAAC"}
@@ -3,7 +3,7 @@ import type { Diagnostic } from './diagnostics.js';
3
3
  import type { CompletionState } from './completion.js';
4
4
  import type { NormalizedObservationRequest } from '../request/request.js';
5
5
  export declare const ARTIFACT_KIND: "my-frontend-observer/observation";
6
- export declare const SCHEMA_VERSION: "1.1.0";
6
+ export declare const SCHEMA_VERSION: "1.2.0";
7
7
  export declare const PRODUCER_NAME: "my-frontend-observer";
8
8
  export type TargetLocatorKind = 'role' | 'id' | 'data-attribute' | 'semantic-element' | 'css' | 'text';
9
9
  export type TargetSelectionStatus = 'matched' | 'not-found' | 'ambiguous' | 'unavailable';
@@ -104,6 +104,119 @@ export interface TargetEvidenceRecord {
104
104
  landmark: EvidenceField<TargetLandmarkRole>;
105
105
  containment: EvidenceField<TargetContainment>;
106
106
  }
107
+ /**
108
+ * v0.3 Batch 1 bounded runtime scroll/overflow evidence model. Frozen here
109
+ * as a contract; no browser capture populates it yet (Batch 2/3), so
110
+ * `scrollScenarioEvidence` on `ObservationArtifact` stays absent for every
111
+ * Batch-1-era observation, including one whose `requestConfig.scrollScenario`
112
+ * is present (see `src/browser/chromiumAdapter.ts`, which fails such a
113
+ * request honestly rather than pretending to execute it).
114
+ */
115
+ export interface ScrollableMetrics {
116
+ scrollTop: number;
117
+ scrollLeft: number;
118
+ scrollWidth: number;
119
+ scrollHeight: number;
120
+ clientWidth: number;
121
+ clientHeight: number;
122
+ }
123
+ /** Distinguishes an `overflow-x`/`overflow-y` CSS declaration from actual browser-observed dimensional overflow - the two are not interchangeable (see docs/CONTRACTS.md). */
124
+ export interface OverflowEvidence {
125
+ horizontalOverflow: boolean;
126
+ verticalOverflow: boolean;
127
+ overflowX: string;
128
+ overflowY: string;
129
+ }
130
+ export interface WindowScrollSnapshot {
131
+ scrollX: number;
132
+ scrollY: number;
133
+ }
134
+ /** `documentElement`/`body` are omitted (not fabricated) when the browser's own scrolling/root-element representation makes them not meaningfully distinct or not observable. */
135
+ export interface DocumentScrollSnapshot {
136
+ root: ScrollableMetrics;
137
+ rootOverflow: OverflowEvidence;
138
+ documentElement?: ScrollableMetrics;
139
+ body?: ScrollableMetrics;
140
+ }
141
+ export type VerticalViewportRelation = 'above' | 'intersecting' | 'below';
142
+ /**
143
+ * Derived only from a target's bounding rectangle plus viewport width/height
144
+ * - never from source styles or locator kind. A hidden/non-rendered target
145
+ * (see `TargetVisibility`/`target-hidden`) must not receive normal
146
+ * above/below/intersecting geometry; its `viewportRelation` field on
147
+ * `TargetScrollRuntimeState` is `not-applicable` instead (hidden is not the
148
+ * same claim as offscreen).
149
+ */
150
+ export interface ViewportRelationEvidence {
151
+ vertical: VerticalViewportRelation;
152
+ intersectsViewport: boolean;
153
+ fullyWithinViewport: boolean;
154
+ }
155
+ /** Bounded per-configured-target runtime scroll/overflow/viewport evidence for one snapshot (initial or final). References targets by the existing stable target `name` - never a second region identity - and never copies the full `TargetEvidenceRecord`. */
156
+ export interface TargetScrollRuntimeState {
157
+ metrics: EvidenceField<ScrollableMetrics>;
158
+ overflow: EvidenceField<OverflowEvidence>;
159
+ boundingRect: EvidenceField<TargetGeometry>;
160
+ viewportRelation: EvidenceField<ViewportRelationEvidence>;
161
+ }
162
+ /** One point-in-time bounded runtime snapshot (captured either before or after the one scroll action). */
163
+ export interface ScrollRuntimeSnapshot {
164
+ window: WindowScrollSnapshot;
165
+ document: DocumentScrollSnapshot;
166
+ targets: Record<string, TargetScrollRuntimeState>;
167
+ }
168
+ export interface ScrollValueChange<T> {
169
+ before: T;
170
+ after: T;
171
+ changed: boolean;
172
+ }
173
+ /**
174
+ * `enteredViewport`/`leftViewport` are only evaluated when both the initial
175
+ * and final `viewportRelation` evidence are valid (never derived from a
176
+ * hidden-to-visible transition, which is a separate evidence concept - see
177
+ * docs/CONTRACTS.md).
178
+ */
179
+ export interface TargetScrollTransition {
180
+ scrollTop: ScrollValueChange<number>;
181
+ scrollLeft: ScrollValueChange<number>;
182
+ boundingRectPosition: ScrollValueChange<{
183
+ x: number;
184
+ y: number;
185
+ }>;
186
+ viewportRelation: ScrollValueChange<VerticalViewportRelation>;
187
+ enteredViewport: boolean;
188
+ leftViewport: boolean;
189
+ }
190
+ /** Bounded explicit before/after change evidence for the one scroll action in this scenario - not a generic recursive diff engine. */
191
+ export interface ScrollScenarioTransition {
192
+ windowScrollX: ScrollValueChange<number>;
193
+ windowScrollY: ScrollValueChange<number>;
194
+ targets: Record<string, TargetScrollTransition>;
195
+ }
196
+ /**
197
+ * Conservative derived interpretation of which scrolling container actually
198
+ * moved. Never forces a winner: `none` when nothing relevant changed,
199
+ * `indeterminate` when more than one plausible owner changed or evidence is
200
+ * insufficient. `target` references the existing stable target `name`.
201
+ */
202
+ export type ScrollOwnerInterpretation = {
203
+ kind: 'document';
204
+ } | {
205
+ kind: 'target';
206
+ target: string;
207
+ } | {
208
+ kind: 'none';
209
+ } | {
210
+ kind: 'indeterminate';
211
+ };
212
+ /** Top-level optional v0.3 evidence family. Present only when the request configured a `scrollScenario`; absent otherwise (never fabricated as empty/zeroed evidence). */
213
+ export interface ScrollScenarioEvidence {
214
+ initial: ScrollRuntimeSnapshot;
215
+ final: ScrollRuntimeSnapshot;
216
+ transition: ScrollScenarioTransition;
217
+ /** Always `source: 'derived'` with a non-empty `derivedFrom` (enforced by `isValidEvidenceField`/`isValidObservationArtifact`) - scroll ownership is an interpretation over browser-observed facts, never itself a direct browser observation. */
218
+ scrollOwner: EvidenceField<ScrollOwnerInterpretation>;
219
+ }
107
220
  export interface ObservationArtifact {
108
221
  artifactKind: typeof ARTIFACT_KIND;
109
222
  schemaVersion: typeof SCHEMA_VERSION;
@@ -124,6 +237,7 @@ export interface ObservationArtifact {
124
237
  };
125
238
  pageEvidence: Record<string, EvidenceField<unknown>>;
126
239
  targetEvidence: Record<string, TargetEvidenceRecord>;
240
+ scrollScenarioEvidence?: ScrollScenarioEvidence;
127
241
  screenshot: EvidenceField<{
128
242
  path: string;
129
243
  }>;
@@ -151,5 +265,5 @@ export declare function getProducerInfo(): {
151
265
  name: typeof PRODUCER_NAME;
152
266
  version: string;
153
267
  };
154
- /** Structural validator for the frozen schema-1.0.0 ObservationArtifact contract. Treats `value` as arbitrary/unknown input. */
268
+ /** Structural validator for the frozen schema-1.2.0 ObservationArtifact contract. Treats `value` as arbitrary/unknown input. */
155
269
  export declare function isValidObservationArtifact(value: unknown): SchemaValidationResult;