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
@@ -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
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { realpathSync } from 'node:fs';
2
+ import { realpathSync, readFileSync } from 'node:fs';
3
3
  import { fileURLToPath } from 'node:url';
4
4
  import { normalizeRequest } from './request/request.js';
5
5
  import { getProducerInfo } from './domain/schema.js';
@@ -35,10 +35,34 @@ Required:
35
35
 
36
36
  Options:
37
37
  --viewport <WIDTHxHEIGHT> Viewport size, e.g. 1280x720.
38
- --target <id=selector> An explicit observation target. Repeatable.
39
- Parsed on the first "=" only, so selectors
40
- containing "=" (e.g. button[data-state="active"])
41
- are preserved intact.
38
+ --target <id=selector> An explicit CSS-shorthand observation target.
39
+ Repeatable. Parsed on the first "=" only, so
40
+ selectors containing "=" (e.g.
41
+ button[data-state="active"]) are preserved
42
+ intact. Cannot be combined with --targets-file.
43
+ --targets-file <json-file> Loads structured semantic observation targets
44
+ from a local JSON file: { "targets": [ { "name":
45
+ "...", "locators": [ { "kind": "role"|"id"|
46
+ "data-attribute"|"semantic-element"|"css"|"text",
47
+ ... } ] } ] }. Locator order within a target is
48
+ the fallback order. Relative paths resolve from
49
+ the current working directory; the file path
50
+ itself is never persisted into the artifact or
51
+ included in the observation's request identity.
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.
42
66
  --output <directory> Portable, relative output location for the
43
67
  observation artifact.
44
68
  --timeout <ms> Overall request timeout in milliseconds.
@@ -71,6 +95,10 @@ function parseObserveArgs(argv) {
71
95
  const targets = [];
72
96
  let outputLocation;
73
97
  let timeoutMs;
98
+ let targetsFilePath;
99
+ let targetsFileFlagCount = 0;
100
+ let scrollScenarioFilePath;
101
+ let scrollScenarioFileFlagCount = 0;
74
102
  for (let i = 0; i < argv.length; i += 1) {
75
103
  const arg = argv[i];
76
104
  switch (arg) {
@@ -99,6 +127,34 @@ function parseObserveArgs(argv) {
99
127
  }
100
128
  break;
101
129
  }
130
+ case '--targets-file': {
131
+ const value = argv[(i += 1)];
132
+ targetsFileFlagCount += 1;
133
+ if (value === undefined) {
134
+ errors.push('--targets-file requires a file path argument');
135
+ }
136
+ else if (targetsFileFlagCount > 1) {
137
+ errors.push('--targets-file may only be specified once');
138
+ }
139
+ else {
140
+ targetsFilePath = value;
141
+ }
142
+ break;
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
+ }
102
158
  case '--output':
103
159
  outputLocation = argv[(i += 1)];
104
160
  break;
@@ -119,6 +175,9 @@ function parseObserveArgs(argv) {
119
175
  }
120
176
  if (targetUrl === undefined)
121
177
  errors.push('--url is required');
178
+ if (targets.length > 0 && targetsFilePath !== undefined) {
179
+ errors.push('--target and --targets-file cannot be combined; use one or the other');
180
+ }
122
181
  if (errors.length > 0)
123
182
  return { ok: false, errors };
124
183
  const raw = {
@@ -128,7 +187,87 @@ function parseObserveArgs(argv) {
128
187
  ...(outputLocation === undefined ? {} : { outputLocation }),
129
188
  ...(timeoutMs === undefined ? {} : { timeoutMs }),
130
189
  };
131
- return { ok: true, raw };
190
+ return {
191
+ ok: true,
192
+ raw,
193
+ ...(targetsFilePath === undefined ? {} : { targetsFilePath }),
194
+ ...(scrollScenarioFilePath === undefined ? {} : { scrollScenarioFilePath }),
195
+ };
196
+ }
197
+ const TARGETS_FILE_ALLOWED_ROOT_FIELDS = new Set(['targets']);
198
+ /**
199
+ * CLI/input-boundary-only responsibility: read one local JSON file, validate
200
+ * only the root wrapper this file format owns (object root, exactly the
201
+ * "targets" field, nothing else), and hand the still-unvalidated `targets`
202
+ * value to the existing `normalizeRequest()` - every target/locator-internal
203
+ * rule (bounds, locator kinds, per-kind fields) stays owned there, not
204
+ * duplicated here. The file path itself is never returned to the caller
205
+ * beyond this function, so it can never reach the persisted request/artifact.
206
+ */
207
+ function loadTargetsFile(filePath) {
208
+ let rawText;
209
+ try {
210
+ rawText = readFileSync(filePath, 'utf8');
211
+ }
212
+ catch (err) {
213
+ const message = err instanceof Error ? err.message : String(err);
214
+ return { ok: false, error: `--targets-file could not be read: ${message}` };
215
+ }
216
+ let parsed;
217
+ try {
218
+ parsed = JSON.parse(rawText);
219
+ }
220
+ catch (err) {
221
+ const message = err instanceof Error ? err.message : String(err);
222
+ return { ok: false, error: `--targets-file is not valid JSON: ${message}` };
223
+ }
224
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
225
+ return { ok: false, error: '--targets-file root must be a JSON object' };
226
+ }
227
+ const record = parsed;
228
+ const unknownFields = Object.keys(record).filter((key) => !TARGETS_FILE_ALLOWED_ROOT_FIELDS.has(key));
229
+ if (unknownFields.length > 0) {
230
+ return { ok: false, error: `--targets-file has unsupported top-level field(s): ${unknownFields.join(', ')}` };
231
+ }
232
+ if (!('targets' in record)) {
233
+ return { ok: false, error: '--targets-file must have a "targets" property' };
234
+ }
235
+ return { ok: true, targets: record.targets };
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 };
132
271
  }
133
272
  function formatDiagnostic(diagnostic) {
134
273
  const target = diagnostic.targetName === undefined ? '' : ` (target: ${diagnostic.targetName})`;
@@ -148,7 +287,26 @@ async function runObserveCommand(argv, io) {
148
287
  io.stderr(OBSERVE_HELP);
149
288
  return 1;
150
289
  }
151
- const normalized = normalizeRequest(parsedArgs.raw);
290
+ let raw = parsedArgs.raw;
291
+ if (parsedArgs.targetsFilePath !== undefined) {
292
+ const loaded = loadTargetsFile(parsedArgs.targetsFilePath);
293
+ if (!loaded.ok) {
294
+ io.stderr(`error: ${loaded.error}\n`);
295
+ io.stderr(OBSERVE_HELP);
296
+ return 1;
297
+ }
298
+ raw = { ...raw, targets: loaded.targets };
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
+ }
309
+ const normalized = normalizeRequest(raw);
152
310
  if (!normalized.ok) {
153
311
  for (const diagnostic of normalized.diagnostics)
154
312
  io.stderr(`${formatDiagnostic(diagnostic)}\n`);
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":";AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAOlE,MAAM,SAAS,GAAU;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;CActB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CpB,CAAC;AAEF,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACvD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAMD,0HAA0H;AAC1H,SAAS,gBAAgB,CAAC,IAAuB;IAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAA6B,CAAC;IAClC,IAAI,QAAuD,CAAC;IAC5D,MAAM,OAAO,GAAyC,EAAE,CAAC;IACzD,IAAI,cAAkC,CAAC;IACvC,IAAI,SAA6B,CAAC;IAClC,IAAI,eAAmC,CAAC;IACxC,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,sBAA0C,CAAC;IAC/C,IAAI,2BAA2B,GAAG,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,OAAO;gBACV,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACtE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,wDAAwD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/F,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,MAAM,CAAC;gBACpB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACpE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,yCAAyC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAChF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,oBAAoB,IAAI,CAAC,CAAC;gBAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;gBAC3D,CAAC;qBAAM,CAAC;oBACN,eAAe,GAAG,KAAK,CAAC;gBAC1B,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,2BAA2B,IAAI,CAAC,CAAC;gBACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBACtE,CAAC;qBAAM,IAAI,2BAA2B,GAAG,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACN,sBAAsB,GAAG,KAAK,CAAC;gBACjC,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,UAAU;gBACb,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,CAAC,mDAAmD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC1F,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,YAAY,CAAC;gBAC3B,CAAC;gBACD,MAAM;YACR,CAAC;YACD;gBACE,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEpD,MAAM,GAAG,GAA0B;QACjC,SAAS;QACT,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;QAC3D,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;KAClD,CAAC;IACF,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG;QACH,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;QAC7D,GAAG,CAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,MAAM,gCAAgC,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAI9D;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,OAAO,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,OAAO,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,gCAAgC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAChH,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;IAC/E,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AAC/C,CAAC;AAID;;;;;;;;;;;;GAYG;AACH,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,OAAO,EAAE,EAAE,CAAC;IACtF,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,OAAO,EAAE,EAAE,CAAC;IACtF,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mDAAmD,EAAE,CAAC;IACnF,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAsB;IAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,UAAU,CAAC,UAAU,GAAG,CAAC;IAChG,OAAO,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;AAC/D,CAAC;AAED,wIAAwI;AACxI,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAE5E,KAAK,UAAU,iBAAiB,CAAC,IAAuB,EAAE,EAAS;IACjE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM;YAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;QACtE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;IACzB,IAAI,UAAU,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,EAAE,CAAC,MAAM,CAAC,UAAU,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YACtC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC;IACD,IAAI,UAAU,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,EAAE,CAAC,MAAM,CAAC,UAAU,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YACtC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,WAAW;YAAE,EAAE,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,4FAA4F;IAC5F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW;YAAE,EAAE,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;IACpD,EAAE,CAAC,MAAM,CAAC,UAAU,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;IACjD,EAAE,CAAC,MAAM,CAAC,aAAa,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IAChD,EAAE,CAAC,MAAM,CAAC,YAAY,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IAC9C,EAAE,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;IAEzD,OAAO,6BAA6B,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAuB,EAAE,KAAY,SAAS;IACzE,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEhC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7C,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,EAAE,CAAC,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,gCAAgC,OAAO,KAAK,CAAC,CAAC;IACxD,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1B,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,YAAY,EAAE,EAAE,CAAC;IACnB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9C,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,4 +1,4 @@
1
- export declare const DIAGNOSTIC_CODES: readonly ["invalid-request", "unsupported-configuration", "unsafe-url", "prohibited-navigation", "prohibited-redirect", "prohibited-subresource-request", "readiness-timeout", "navigation-failure", "target-missing", "target-ambiguous", "browser-evidence-unavailable", "partial-evidence", "bounded-truncated-evidence", "artifact-write-failure", "browser-runtime-failure"];
1
+ export declare const DIAGNOSTIC_CODES: readonly ["invalid-request", "unsupported-configuration", "unsafe-url", "prohibited-navigation", "prohibited-redirect", "prohibited-subresource-request", "readiness-timeout", "navigation-failure", "target-missing", "target-ambiguous", "target-hidden", "browser-evidence-unavailable", "partial-evidence", "bounded-truncated-evidence", "artifact-write-failure", "browser-runtime-failure"];
2
2
  export type DiagnosticCode = (typeof DIAGNOSTIC_CODES)[number];
3
3
  export type DiagnosticSeverity = 'error' | 'warning';
4
4
  /** Single source of truth for code->severity; ordering/completion logic must consult this, never a duplicated mapping. */
@@ -9,6 +9,7 @@ export const DIAGNOSTIC_CODES = [
9
9
  'navigation-failure',
10
10
  'target-missing',
11
11
  'target-ambiguous',
12
+ 'target-hidden',
12
13
  'browser-evidence-unavailable',
13
14
  'partial-evidence',
14
15
  'bounded-truncated-evidence',
@@ -27,6 +28,7 @@ export const DIAGNOSTIC_SEVERITY = {
27
28
  'navigation-failure': 'error',
28
29
  'target-missing': 'warning',
29
30
  'target-ambiguous': 'warning',
31
+ 'target-hidden': 'warning',
30
32
  'browser-evidence-unavailable': 'warning',
31
33
  'partial-evidence': 'warning',
32
34
  'bounded-truncated-evidence': 'warning',
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/domain/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,iBAAiB;IACjB,2BAA2B;IAC3B,YAAY;IACZ,uBAAuB;IACvB,qBAAqB;IACrB,gCAAgC;IAChC,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,8BAA8B;IAC9B,kBAAkB;IAClB,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;CACjB,CAAC;AAMX,0HAA0H;AAC1H,MAAM,CAAC,MAAM,mBAAmB,GAA+C;IAC7E,iBAAiB,EAAE,OAAO;IAC1B,2BAA2B,EAAE,OAAO;IACpC,YAAY,EAAE,OAAO;IACrB,uBAAuB,EAAE,OAAO;IAChC,qBAAqB,EAAE,OAAO;IAC9B,gCAAgC,EAAE,OAAO;IACzC,mBAAmB,EAAE,SAAS;IAC9B,oBAAoB,EAAE,OAAO;IAC7B,gBAAgB,EAAE,SAAS;IAC3B,kBAAkB,EAAE,SAAS;IAC7B,8BAA8B,EAAE,SAAS;IACzC,kBAAkB,EAAE,SAAS;IAC7B,4BAA4B,EAAE,SAAS;IACvC,wBAAwB,EAAE,OAAO;IACjC,yBAAyB,EAAE,OAAO;CACnC,CAAC;AAUF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAkC;IACjE,MAAM,YAAY,GAAG,CAAC,CAAa,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/domain/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,iBAAiB;IACjB,2BAA2B;IAC3B,YAAY;IACZ,uBAAuB;IACvB,qBAAqB;IACrB,gCAAgC;IAChC,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,8BAA8B;IAC9B,kBAAkB;IAClB,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;CACjB,CAAC;AAMX,0HAA0H;AAC1H,MAAM,CAAC,MAAM,mBAAmB,GAA+C;IAC7E,iBAAiB,EAAE,OAAO;IAC1B,2BAA2B,EAAE,OAAO;IACpC,YAAY,EAAE,OAAO;IACrB,uBAAuB,EAAE,OAAO;IAChC,qBAAqB,EAAE,OAAO;IAC9B,gCAAgC,EAAE,OAAO;IACzC,mBAAmB,EAAE,SAAS;IAC9B,oBAAoB,EAAE,OAAO;IAC7B,gBAAgB,EAAE,SAAS;IAC3B,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,SAAS;IAC1B,8BAA8B,EAAE,SAAS;IACzC,kBAAkB,EAAE,SAAS;IAC7B,4BAA4B,EAAE,SAAS;IACvC,wBAAwB,EAAE,OAAO;IACjC,yBAAyB,EAAE,OAAO;CACnC,CAAC;AAUF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAkC;IACjE,MAAM,YAAY,GAAG,CAAC,CAAa,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -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,16 +12,22 @@ 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 = {
21
26
  targetUrl: request.targetUrl,
22
27
  viewport: { width: request.viewport.width, height: request.viewport.height },
23
- targets: request.targets.map((target) => ({ name: target.name.toLowerCase(), selector: target.selector })),
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"}