@juxtapose/core 0.4.0 → 0.6.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 (153) hide show
  1. package/dist/agent/handoff.d.ts +8 -1
  2. package/dist/agent/handoff.js +75 -7
  3. package/dist/agent/handoff.js.map +1 -1
  4. package/dist/analysis/affected.d.ts +37 -0
  5. package/dist/analysis/affected.js +97 -22
  6. package/dist/analysis/affected.js.map +1 -1
  7. package/dist/analysis/cause.d.ts +32 -0
  8. package/dist/analysis/cause.js +187 -0
  9. package/dist/analysis/cause.js.map +1 -0
  10. package/dist/baseline/approve.d.ts +24 -0
  11. package/dist/baseline/approve.js +54 -0
  12. package/dist/baseline/approve.js.map +1 -0
  13. package/dist/baseline/git-store.d.ts +4 -0
  14. package/dist/baseline/git-store.js +22 -0
  15. package/dist/baseline/git-store.js.map +1 -1
  16. package/dist/browser/acquire.d.ts +15 -0
  17. package/dist/browser/acquire.js +26 -0
  18. package/dist/browser/acquire.js.map +1 -0
  19. package/dist/browser/browser.d.ts +53 -0
  20. package/dist/browser/browser.js +122 -0
  21. package/dist/browser/browser.js.map +1 -0
  22. package/dist/browser/cdp.d.ts +81 -0
  23. package/dist/browser/cdp.js +230 -0
  24. package/dist/browser/cdp.js.map +1 -0
  25. package/dist/browser/daemon/client.d.ts +145 -0
  26. package/dist/browser/daemon/client.js +764 -0
  27. package/dist/browser/daemon/client.js.map +1 -0
  28. package/dist/browser/daemon/state.d.ts +99 -0
  29. package/dist/browser/daemon/state.js +297 -0
  30. package/dist/browser/daemon/state.js.map +1 -0
  31. package/dist/browser/daemon/supervisor-main.d.ts +1 -0
  32. package/dist/browser/daemon/supervisor-main.js +54 -0
  33. package/dist/browser/daemon/supervisor-main.js.map +1 -0
  34. package/dist/browser/daemon/supervisor.d.ts +37 -0
  35. package/dist/browser/daemon/supervisor.js +777 -0
  36. package/dist/browser/daemon/supervisor.js.map +1 -0
  37. package/dist/{capture/launch.d.ts → browser/flags.d.ts} +19 -1
  38. package/dist/browser/flags.js +146 -0
  39. package/dist/browser/flags.js.map +1 -0
  40. package/dist/browser/index.d.ts +14 -0
  41. package/dist/browser/index.js +14 -0
  42. package/dist/browser/index.js.map +1 -0
  43. package/dist/browser/install.d.ts +33 -0
  44. package/dist/browser/install.js +167 -0
  45. package/dist/browser/install.js.map +1 -0
  46. package/dist/browser/launch.d.ts +37 -0
  47. package/dist/browser/launch.js +254 -0
  48. package/dist/browser/launch.js.map +1 -0
  49. package/dist/browser/page.d.ts +125 -0
  50. package/dist/browser/page.js +564 -0
  51. package/dist/browser/page.js.map +1 -0
  52. package/dist/browser/pins.d.ts +12 -0
  53. package/dist/browser/pins.js +57 -0
  54. package/dist/browser/pins.js.map +1 -0
  55. package/dist/browser/private-dir.d.ts +7 -0
  56. package/dist/browser/private-dir.js +24 -0
  57. package/dist/browser/private-dir.js.map +1 -0
  58. package/dist/browser/resolve.d.ts +31 -0
  59. package/dist/browser/resolve.js +126 -0
  60. package/dist/browser/resolve.js.map +1 -0
  61. package/dist/browser/selectors.d.ts +10 -0
  62. package/dist/browser/selectors.js +60 -0
  63. package/dist/browser/selectors.js.map +1 -0
  64. package/dist/browser/transport.d.ts +51 -0
  65. package/dist/browser/transport.js +124 -0
  66. package/dist/browser/transport.js.map +1 -0
  67. package/dist/browser/types.d.ts +4 -0
  68. package/dist/browser/types.js +2 -0
  69. package/dist/browser/types.js.map +1 -0
  70. package/dist/browser/zip.d.ts +27 -0
  71. package/dist/browser/zip.js +241 -0
  72. package/dist/browser/zip.js.map +1 -0
  73. package/dist/capture/capture.d.ts +7 -1
  74. package/dist/capture/capture.js +25 -8
  75. package/dist/capture/capture.js.map +1 -1
  76. package/dist/capture/env.d.ts +1 -1
  77. package/dist/capture/pool.d.ts +1 -1
  78. package/dist/capture/pool.js +41 -8
  79. package/dist/capture/pool.js.map +1 -1
  80. package/dist/capture/settle.d.ts +1 -1
  81. package/dist/capture/settle.js +2 -0
  82. package/dist/capture/settle.js.map +1 -1
  83. package/dist/capture/snap.d.ts +43 -0
  84. package/dist/capture/snap.js +103 -0
  85. package/dist/capture/snap.js.map +1 -0
  86. package/dist/capture/structure.d.ts +77 -0
  87. package/dist/capture/structure.js +498 -0
  88. package/dist/capture/structure.js.map +1 -0
  89. package/dist/diff/compare.d.ts +19 -0
  90. package/dist/diff/compare.js +19 -0
  91. package/dist/diff/compare.js.map +1 -0
  92. package/dist/diff/crops.d.ts +26 -0
  93. package/dist/diff/crops.js +92 -0
  94. package/dist/diff/crops.js.map +1 -0
  95. package/dist/diff/structural/classify.d.ts +29 -0
  96. package/dist/diff/structural/classify.js +113 -0
  97. package/dist/diff/structural/classify.js.map +1 -0
  98. package/dist/diff/structural/coverage.d.ts +11 -0
  99. package/dist/diff/structural/coverage.js +37 -0
  100. package/dist/diff/structural/coverage.js.map +1 -0
  101. package/dist/diff/structural/deltas.d.ts +29 -0
  102. package/dist/diff/structural/deltas.js +218 -0
  103. package/dist/diff/structural/deltas.js.map +1 -0
  104. package/dist/diff/structural/disambiguate.d.ts +3 -0
  105. package/dist/diff/structural/disambiguate.js +89 -0
  106. package/dist/diff/structural/disambiguate.js.map +1 -0
  107. package/dist/diff/structural/label.d.ts +15 -0
  108. package/dist/diff/structural/label.js +64 -0
  109. package/dist/diff/structural/label.js.map +1 -0
  110. package/dist/diff/structural/match.d.ts +13 -0
  111. package/dist/diff/structural/match.js +135 -0
  112. package/dist/diff/structural/match.js.map +1 -0
  113. package/dist/diff/structural/shift.d.ts +2 -0
  114. package/dist/diff/structural/shift.js +144 -0
  115. package/dist/diff/structural/shift.js.map +1 -0
  116. package/dist/diff/structural/summary.d.ts +31 -0
  117. package/dist/diff/structural/summary.js +420 -0
  118. package/dist/diff/structural/summary.js.map +1 -0
  119. package/dist/diff/structural.d.ts +40 -0
  120. package/dist/diff/structural.js +219 -0
  121. package/dist/diff/structural.js.map +1 -0
  122. package/dist/index.d.ts +28 -4
  123. package/dist/index.js +32 -3
  124. package/dist/index.js.map +1 -1
  125. package/dist/platform.d.ts +1 -1
  126. package/dist/platforms/urls.d.ts +3 -0
  127. package/dist/platforms/urls.js +89 -0
  128. package/dist/platforms/urls.js.map +1 -0
  129. package/dist/report/comment.js +9 -3
  130. package/dist/report/comment.js.map +1 -1
  131. package/dist/report/format.d.ts +18 -0
  132. package/dist/report/format.js +20 -0
  133. package/dist/report/format.js.map +1 -1
  134. package/dist/report/html.js +2 -2
  135. package/dist/report/html.js.map +1 -1
  136. package/dist/run/groups.d.ts +2 -0
  137. package/dist/run/groups.js +45 -0
  138. package/dist/run/groups.js.map +1 -0
  139. package/dist/run/run.d.ts +6 -2
  140. package/dist/run/run.js +74 -6
  141. package/dist/run/run.js.map +1 -1
  142. package/dist/shell-quote.d.ts +2 -0
  143. package/dist/shell-quote.js +10 -0
  144. package/dist/shell-quote.js.map +1 -0
  145. package/dist/types.d.ts +201 -5
  146. package/dist/types.js +0 -2
  147. package/dist/types.js.map +1 -1
  148. package/dist/url-platform.d.ts +2 -2
  149. package/dist/url-platform.js +2 -2
  150. package/dist/url-platform.js.map +1 -1
  151. package/package.json +6 -10
  152. package/dist/capture/launch.js +0 -56
  153. package/dist/capture/launch.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/capture/structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ChangedRegion, StructureSnapshot, StructuralVerdict } from '../types.js';
2
+ import { type DiffOutput } from './diff.js';
3
+ export interface SnapSide {
4
+ image: Buffer;
5
+ structure?: StructureSnapshot;
6
+ }
7
+ export interface SnapComparison {
8
+ pixels: DiffOutput;
9
+ verdict: StructuralVerdict;
10
+ /** Every region no delta explains, in diff order, not the budget-fitted
11
+ * prefix on the verdict. `--crops` orders and labels from this. */
12
+ unexplainedRegions: ChangedRegion[];
13
+ /** The changed elements' boxes, in delta order: `--crops` falls back to
14
+ * these when the pixel diff marked nothing. */
15
+ elementRegions: ChangedRegion[];
16
+ }
17
+ export declare function compareSnaps(a: SnapSide, b: SnapSide, escalate: {
18
+ command: string;
19
+ }): Promise<SnapComparison>;
@@ -0,0 +1,19 @@
1
+ // Two snaps on disk → pixels + verdict. The public seam for `jux diff`: it
2
+ // keeps diffImages and the structural internals unexported while giving the
3
+ // CLI the one call it needs. No browser is involved anywhere below this line.
4
+ import { diffImages } from './diff.js';
5
+ import { structuralDiffWithCoverage } from './structural.js';
6
+ export async function compareSnaps(a, b, escalate) {
7
+ const pixels = await diffImages(a.image, b.image);
8
+ const { verdict, unexplainedRegions, elementRegions } = structuralDiffWithCoverage({
9
+ baseline: a.structure,
10
+ current: b.structure,
11
+ // Byte equality, not mismatchPixels === 0: a sub-threshold colour change
12
+ // has no mismatching pixels but is still a different image.
13
+ imagesIdentical: a.image.equals(b.image),
14
+ pixels,
15
+ escalate,
16
+ });
17
+ return { pixels, verdict, unexplainedRegions, elementRegions };
18
+ }
19
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/diff/compare.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,8EAA8E;AAG9E,OAAO,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAkB7D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,CAAW,EACX,CAAW,EACX,QAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,GAAG,0BAA0B,CAAC;QACjF,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,OAAO,EAAE,CAAC,CAAC,SAAS;QACpB,yEAAyE;QACzE,4DAA4D;QAC5D,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACxC,MAAM;QACN,QAAQ;KACT,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ChangedRegion } from '../types.js';
2
+ export declare const MAX_CROPS = 8;
3
+ export declare const MAX_CROP_SIDE = 512;
4
+ export interface Crop {
5
+ /** The changed region this strip shows, page px. */
6
+ region: ChangedRegion;
7
+ /** What was cropped: the region doubled about its centre, clamped to both frames. */
8
+ box: ChangedRegion;
9
+ /** Output px per page px: an integer above 1 when enlarged, under 1 when reduced. */
10
+ scale: number;
11
+ /** The whole strip: left side, gutter, right side. */
12
+ width: number;
13
+ height: number;
14
+ png: Buffer;
15
+ }
16
+ export declare function renderCrops(a: Buffer, b: Buffer, regions: ChangedRegion[]): Promise<Crop[]>;
17
+ /** The region doubled about its centre, at least MIN_BOX a side, clamped to
18
+ * the frame, integer px. A zero-size box means the region lies outside the
19
+ * frame. */
20
+ export declare function cropBox(r: ChangedRegion, frame: {
21
+ width: number;
22
+ height: number;
23
+ }): ChangedRegion;
24
+ /** An integer enlargement that keeps the longer side within MAX_CROP_SIDE,
25
+ * or a fractional reduction once the box itself is past it. */
26
+ export declare function scaleFor(box: ChangedRegion): number;
@@ -0,0 +1,92 @@
1
+ // Tier-3: the pixels, but only where they changed and only as much as an
2
+ // agent needs. One PNG per changed region — baseline | current, side by
3
+ // side — with the region's bounding box doubled about its centre for
4
+ // context and scaled so the longer side is at most 512px. Nearest-neighbour
5
+ // when scaling up, so a 1px border reads as a hard 6px step and not a blur.
6
+ // No browser; sharp only, which `diffImages` already loads.
7
+ import sharp from 'sharp';
8
+ export const MAX_CROPS = 8;
9
+ export const MAX_CROP_SIDE = 512;
10
+ const GUTTER = 4;
11
+ /** A 1×1 region still needs enough around it to recognise. */
12
+ const MIN_BOX = 16;
13
+ /** Pinned so the same input is the same bytes: sharp strips metadata by
14
+ * default; the level and filter fix the zlib stream. */
15
+ const PNG = { compressionLevel: 9, adaptiveFiltering: false };
16
+ /** The gutter colour: magenta is in no UI palette, so it never reads as content. */
17
+ const GUTTER_RGBA = { r: 255, g: 0, b: 255, alpha: 1 };
18
+ export async function renderCrops(a, b, regions) {
19
+ const [ma, mb] = await Promise.all([sharp(a).metadata(), sharp(b).metadata()]);
20
+ // Only the overlap exists on both sides; after a size change that is the
21
+ // smaller frame's extent.
22
+ const frame = {
23
+ width: Math.min(ma.width ?? 0, mb.width ?? 0),
24
+ height: Math.min(ma.height ?? 0, mb.height ?? 0),
25
+ };
26
+ // Nothing marked (sub-threshold, or a size change): the whole frame is
27
+ // the one thing worth looking at.
28
+ const wanted = regions.length > 0 ? regions : [{ x: 0, y: 0, ...frame }];
29
+ const out = [];
30
+ for (const region of wanted) {
31
+ // The cap counts rendered crops, not candidates: off-frame regions at the
32
+ // front must not starve a valid later one.
33
+ if (out.length >= MAX_CROPS)
34
+ break;
35
+ const box = cropBox(region, frame);
36
+ if (box.width === 0 || box.height === 0)
37
+ continue;
38
+ const scale = scaleFor(box);
39
+ const sw = Math.max(1, Math.round(box.width * scale));
40
+ const sh = Math.max(1, Math.round(box.height * scale));
41
+ const side = (img) => sharp(img)
42
+ .extract({ left: box.x, top: box.y, width: box.width, height: box.height })
43
+ .resize(sw, sh, { kernel: scale >= 1 ? 'nearest' : 'lanczos3', fit: 'fill' })
44
+ .ensureAlpha()
45
+ .png(PNG)
46
+ .toBuffer();
47
+ const [left, right] = await Promise.all([side(a), side(b)]);
48
+ const width = sw * 2 + GUTTER;
49
+ const png = await sharp({
50
+ create: { width, height: sh, channels: 4, background: GUTTER_RGBA },
51
+ })
52
+ .composite([
53
+ { input: left, left: 0, top: 0 },
54
+ { input: right, left: sw + GUTTER, top: 0 },
55
+ ])
56
+ .png(PNG)
57
+ .toBuffer();
58
+ out.push({ region, box, scale, width, height: sh, png });
59
+ }
60
+ return out;
61
+ }
62
+ /** The region doubled about its centre, at least MIN_BOX a side, clamped to
63
+ * the frame, integer px. A zero-size box means the region lies outside the
64
+ * frame. */
65
+ export function cropBox(r, frame) {
66
+ // Clamping alone would drag a region left of / above the frame back to the
67
+ // origin and crop something unrelated, so outside means no box. The edges
68
+ // are exclusive: a region starting at x == width covers no pixel. A
69
+ // zero-area region counts as one px, so (0, 0, 0, 0) is still inside.
70
+ if (r.x + Math.max(1, r.width) <= 0 ||
71
+ r.y + Math.max(1, r.height) <= 0 ||
72
+ r.x >= frame.width ||
73
+ r.y >= frame.height) {
74
+ return { x: 0, y: 0, width: 0, height: 0 };
75
+ }
76
+ const w = Math.max(MIN_BOX, r.width * 2);
77
+ const h = Math.max(MIN_BOX, r.height * 2);
78
+ const x0 = Math.min(frame.width, Math.max(0, Math.floor(r.x + r.width / 2 - w / 2)));
79
+ const y0 = Math.min(frame.height, Math.max(0, Math.floor(r.y + r.height / 2 - h / 2)));
80
+ const x1 = Math.min(frame.width, Math.ceil(x0 + w));
81
+ const y1 = Math.min(frame.height, Math.ceil(y0 + h));
82
+ return { x: x0, y: y0, width: Math.max(0, x1 - x0), height: Math.max(0, y1 - y0) };
83
+ }
84
+ /** An integer enlargement that keeps the longer side within MAX_CROP_SIDE,
85
+ * or a fractional reduction once the box itself is past it. */
86
+ export function scaleFor(box) {
87
+ const longer = Math.max(box.width, box.height);
88
+ return longer <= MAX_CROP_SIDE
89
+ ? Math.max(1, Math.floor(MAX_CROP_SIDE / longer))
90
+ : MAX_CROP_SIDE / longer;
91
+ }
92
+ //# sourceMappingURL=crops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crops.js","sourceRoot":"","sources":["../../src/diff/crops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ChangedRegion, Classification, Flag, StructureElement, StructureSnapshot, StyleTag } from '../../types.js';
2
+ import type { Fact } from './deltas.js';
3
+ export interface ClassifyContext {
4
+ baseline?: StructureSnapshot;
5
+ current?: StructureSnapshot;
6
+ facts: Fact[];
7
+ explained: 'full' | 'partial' | 'none';
8
+ unexplainedRegions: ChangedRegion[];
9
+ pixels: {
10
+ /** Byte-identical images: the only pixel evidence of "no change". */
11
+ imagesIdentical: boolean;
12
+ dimensionMismatch: boolean;
13
+ /** The pixel diff marked at least one region with area. */
14
+ hasRegions: boolean;
15
+ /** The images differ but the pixel diff marked no region. */
16
+ subThreshold: boolean;
17
+ };
18
+ }
19
+ export declare function styleTagOf(prop: string): StyleTag;
20
+ export declare function classify(ctx: ClassifyContext): {
21
+ classification: Classification;
22
+ styleTags: StyleTag[];
23
+ };
24
+ /** The first self-painting element (canvas, video, img…) on the current side
25
+ * under an unexplained region: its content changes without the DOM or styles
26
+ * changing, so the pixels there are content, not drift. */
27
+ export declare function selfPaintingAt(current: StructureSnapshot, unexplained: ChangedRegion[]): StructureElement | undefined;
28
+ /** In a fixed order, so the flag list serializes identically every run. */
29
+ export declare function computeFlags(ctx: ClassifyContext): Flag[];
@@ -0,0 +1,113 @@
1
+ // Classification and risk flags. First match wins, in an order that puts
2
+ // causes before consequences: a padding change that reflows the page is a
3
+ // spacing change with a shift in its deltas, not a "reflow" — the spec's own
4
+ // summary example says so.
5
+ import { SELF_PAINTING } from './label.js';
6
+ import { intersects } from './coverage.js';
7
+ const TAG_ORDER = ['color', 'typography', 'spacing', 'border', 'effects'];
8
+ export function styleTagOf(prop) {
9
+ if (/^(padding|margin)-|^gap$/.test(prop))
10
+ return 'spacing';
11
+ if (/^border-.*-(width|radius)$/.test(prop) || /^border-.*-color$/.test(prop))
12
+ return 'border';
13
+ if (/^(font-|line-height|letter-spacing|text-|content$)/.test(prop))
14
+ return 'typography';
15
+ if (/^(opacity|transform|box-shadow|z-index|stroke-width)$/.test(prop))
16
+ return 'effects';
17
+ return 'color'; // color, background-*, fill, stroke
18
+ }
19
+ export function classify(ctx) {
20
+ const none = [];
21
+ const { pixels, baseline, current, facts } = ctx;
22
+ // Never "0 mismatch pixels": pixelmatch's tolerance hides real changes
23
+ // (the corpus `background` case changes the bytes and marks 0 pixels).
24
+ if (pixels.imagesIdentical &&
25
+ !pixels.dimensionMismatch &&
26
+ !pixels.hasRegions &&
27
+ facts.length === 0)
28
+ return { classification: 'identical', styleTags: none };
29
+ // Before the structure checks: a size change is a size change whether or
30
+ // not either side captured structure.
31
+ if (pixels.dimensionMismatch)
32
+ return { classification: 'dimension-change', styleTags: none };
33
+ if (!baseline || !current)
34
+ return { classification: 'unknown', styleTags: none };
35
+ if (baseline.viewport.width !== current.viewport.width ||
36
+ baseline.viewport.height !== current.viewport.height) {
37
+ return { classification: 'dimension-change', styleTags: none };
38
+ }
39
+ // Equal hashes and no facts: the DOM and styles did not change, so the
40
+ // pixels are drift or self-painted content. The facts come from the
41
+ // elements themselves, so they outrank a hash that disagrees with them.
42
+ if (facts.length === 0 && baseline.structureHash === current.structureHash) {
43
+ const selfPainted = selfPaintingAt(current, ctx.unexplainedRegions) !== undefined;
44
+ return { classification: selfPainted ? 'unknown' : 'render-drift', styleTags: none };
45
+ }
46
+ const kinds = new Set(facts.map((f) => f.delta.kind));
47
+ if (kinds.has('removed'))
48
+ return { classification: 'element-removed', styleTags: none };
49
+ if (kinds.has('added'))
50
+ return { classification: 'element-added', styleTags: none };
51
+ const primary = ['text', 'style', 'attr'].filter((k) => kinds.has(k));
52
+ const styleTags = kinds.has('style')
53
+ ? TAG_ORDER.filter((t) => facts.some((f) => f.delta.kind === 'style' && styleTagOf(f.delta.prop) === t))
54
+ : none;
55
+ if (primary.length > 1)
56
+ return { classification: 'mixed', styleTags };
57
+ if (primary[0] === 'text')
58
+ return { classification: 'text-only', styleTags: none };
59
+ if (primary[0] === 'style')
60
+ return { classification: 'style-only', styleTags };
61
+ if (primary[0] === 'attr')
62
+ return { classification: 'attr-only', styleTags: none };
63
+ if (kinds.has('shift'))
64
+ return { classification: 'reflow', styleTags: none };
65
+ if (kinds.has('moved') || kinds.has('resized'))
66
+ return { classification: 'geometry', styleTags: none };
67
+ // Bytes differ, nothing marked, nothing structural: antialiasing-scale drift.
68
+ if (pixels.subThreshold)
69
+ return { classification: 'render-drift', styleTags: none };
70
+ return { classification: 'unknown', styleTags: none };
71
+ }
72
+ /** The first self-painting element (canvas, video, img…) on the current side
73
+ * under an unexplained region: its content changes without the DOM or styles
74
+ * changing, so the pixels there are content, not drift. */
75
+ export function selfPaintingAt(current, unexplained) {
76
+ for (const r of unexplained) {
77
+ const e = current.elements.find((e) => SELF_PAINTING.has(e.tag) && intersects(r, e.rect));
78
+ if (e)
79
+ return e;
80
+ }
81
+ return undefined;
82
+ }
83
+ const LARGE_SHIFT_COUNT = 10;
84
+ const LARGE_SHIFT_PX = 50;
85
+ /** In a fixed order, so the flag list serializes identically every run. */
86
+ export function computeFlags(ctx) {
87
+ const flags = [];
88
+ const { baseline, current, facts } = ctx;
89
+ const has = (k) => facts.some((f) => f.delta.kind === k);
90
+ if (has('removed'))
91
+ flags.push('element-removed');
92
+ if (has('text'))
93
+ flags.push('text-changed');
94
+ if (facts.some((f) => f.delta.kind === 'shift' &&
95
+ (f.delta.count >= LARGE_SHIFT_COUNT || Math.abs(f.delta.dy) >= LARGE_SHIFT_PX))) {
96
+ flags.push('large-reflow');
97
+ }
98
+ if (ctx.explained !== 'full')
99
+ flags.push('unexplained-pixels');
100
+ if (ctx.pixels.subThreshold)
101
+ flags.push('sub-threshold');
102
+ if (baseline?.truncated || current?.truncated)
103
+ flags.push('structure-truncated');
104
+ if (!baseline)
105
+ flags.push('no-baseline-structure');
106
+ if (!current)
107
+ flags.push('no-current-structure');
108
+ const belowFold = (s) => s !== undefined && s.contentHeight > s.viewport.height;
109
+ if (belowFold(baseline) || belowFold(current))
110
+ flags.push('below-fold');
111
+ return flags;
112
+ }
113
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/diff/structural/classify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ChangedRegion, StructureRect } from '../../types.js';
2
+ import type { Fact } from './deltas.js';
3
+ export interface Coverage {
4
+ /** Changed regions with area; zero-area boxes carry no pixels. */
5
+ regionCount: number;
6
+ coverage: number;
7
+ explained: 'full' | 'partial' | 'none';
8
+ unexplainedRegions: ChangedRegion[];
9
+ }
10
+ export declare function intersects(r: ChangedRegion, rect: StructureRect): boolean;
11
+ export declare function computeCoverage(regions: ChangedRegion[], facts: Fact[]): Coverage;
@@ -0,0 +1,37 @@
1
+ // Does the structure explain the pixels? A changed region is explained when
2
+ // it intersects the old or new rect of some delta's element. Coverage is by
3
+ // region area: the diff carries bounding boxes, not per-pixel membership, and
4
+ // boxes are what an agent reads back.
5
+ export function intersects(r, rect) {
6
+ return (r.x < rect.x + rect.w &&
7
+ r.x + r.width > rect.x &&
8
+ r.y < rect.y + rect.h &&
9
+ r.y + r.height > rect.y);
10
+ }
11
+ export function computeCoverage(regions, facts) {
12
+ // No marked regions: nothing is left unexplained. That includes a change
13
+ // below the pixel diff's tolerance, where the deltas are the whole story.
14
+ const real = regions.filter((r) => r.width > 0 && r.height > 0);
15
+ if (real.length === 0)
16
+ return { regionCount: 0, coverage: 1, explained: 'full', unexplainedRegions: [] };
17
+ const rects = facts.flatMap((f) => f.rects);
18
+ let total = 0;
19
+ let explained = 0;
20
+ const unexplainedRegions = [];
21
+ for (const r of real) {
22
+ const area = r.width * r.height;
23
+ total += area;
24
+ if (rects.some((rect) => intersects(r, rect)))
25
+ explained += area;
26
+ else
27
+ unexplainedRegions.push(r);
28
+ }
29
+ const coverage = total === 0 ? 1 : Math.round((explained / total) * 1000) / 1000;
30
+ return {
31
+ regionCount: real.length,
32
+ coverage,
33
+ explained: coverage >= 0.98 ? 'full' : coverage >= 0.5 ? 'partial' : 'none',
34
+ unexplainedRegions,
35
+ };
36
+ }
37
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/diff/structural/coverage.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,sCAAsC;AAatC,MAAM,UAAU,UAAU,CAAC,CAAgB,EAAE,IAAmB;IAC9D,OAAO,CACL,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAwB,EAAE,KAAa;IACrE,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QACnB,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;IACpF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,kBAAkB,GAAoB,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;QAChC,KAAK,IAAI,IAAI,CAAC;QACd,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAAE,SAAS,IAAI,IAAI,CAAC;;YAC5D,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACjF,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,QAAQ;QACR,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QAC3E,kBAAkB;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Delta, StructureRect, StructureSnapshot } from '../../types.js';
2
+ import type { ElementMatch } from './match.js';
3
+ export interface Fact {
4
+ delta: Delta;
5
+ /** Old and new rects of the element(s) this fact is about, for coverage. */
6
+ rects: StructureRect[];
7
+ /** `role|tag` of the element, for the signature. */
8
+ abstract: string;
9
+ /** Position in the current document; for `removed`, that of the preceding
10
+ * matched element. Keeps output order stable across runs. */
11
+ order: number;
12
+ /** The element this fact is about, as an index into one side's snapshot:
13
+ * the baseline for matched and removed elements (their label comes from
14
+ * it), the current side for added ones; a shift carries its anchor's.
15
+ * Labels are not identities — two `div.card`s are two elements — so
16
+ * anything that groups facts by element keys on this. */
17
+ source: Source;
18
+ }
19
+ export interface Source {
20
+ side: 'baseline' | 'current';
21
+ index: number;
22
+ }
23
+ /** Within one position, which fact reads first. */
24
+ export declare const KIND_RANK: Record<Delta['kind'], number>;
25
+ export declare function computeFacts(a: StructureSnapshot, b: StructureSnapshot, match: ElementMatch): Fact[];
26
+ export declare function sortFacts(facts: Fact[]): Fact[];
27
+ /** Byte-identical output across machines needs a locale-free order;
28
+ * `localeCompare` is not one. */
29
+ export declare const compareCodeUnits: (a: string, b: string) => number;