@mneme-ai/core 2.19.18 → 2.19.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/caption_inpaint/caption_inpaint.test.d.ts +2 -0
- package/dist/caption_inpaint/caption_inpaint.test.d.ts.map +1 -0
- package/dist/caption_inpaint/caption_inpaint.test.js +481 -0
- package/dist/caption_inpaint/caption_inpaint.test.js.map +1 -0
- package/dist/caption_inpaint/index.d.ts +168 -0
- package/dist/caption_inpaint/index.d.ts.map +1 -0
- package/dist/caption_inpaint/index.js +366 -0
- package/dist/caption_inpaint/index.js.map +1 -0
- package/dist/caption_severance/index.d.ts +46 -0
- package/dist/caption_severance/index.d.ts.map +1 -1
- package/dist/caption_severance/index.js +39 -0
- package/dist/caption_severance/index.js.map +1 -1
- package/dist/cosmic/aurelian_v1919.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1919.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1919.test.js +34 -0
- package/dist/cosmic/aurelian_v1919.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +8 -0
- package/dist/whats_new.js.map +1 -1
- package/dist/wrapper_genesis/index.d.ts.map +1 -1
- package/dist/wrapper_genesis/index.js +8 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caption_inpaint.test.d.ts","sourceRoot":"","sources":["../../src/caption_inpaint/caption_inpaint.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { StubInpainter, PatchFillInpainter, VendorApiInpainter, resolveInpainter, inpaintMaskRegions, nakedFingerprint, makeSolidImage, makeTestImage, meanColorDistance, formatInpaintLine, } from "./index.js";
|
|
3
|
+
// ─── helpers used across tests ───────────────────────────────────────────
|
|
4
|
+
/** Count pixels where rgba differs between two same-sized images, inside an optional bbox. */
|
|
5
|
+
function countDifferingPixels(a, b, bbox) {
|
|
6
|
+
const [x0, y0, w, h] = bbox ?? [0, 0, a.width, a.height];
|
|
7
|
+
const x1 = Math.min(a.width, x0 + w);
|
|
8
|
+
const y1 = Math.min(a.height, y0 + h);
|
|
9
|
+
let n = 0;
|
|
10
|
+
for (let y = y0; y < y1; y++) {
|
|
11
|
+
for (let x = x0; x < x1; x++) {
|
|
12
|
+
const idx = (y * a.width + x) * 4;
|
|
13
|
+
if (a.rgba[idx + 0] !== b.rgba[idx + 0] ||
|
|
14
|
+
a.rgba[idx + 1] !== b.rgba[idx + 1] ||
|
|
15
|
+
a.rgba[idx + 2] !== b.rgba[idx + 2] ||
|
|
16
|
+
a.rgba[idx + 3] !== b.rgba[idx + 3])
|
|
17
|
+
n++;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return n;
|
|
21
|
+
}
|
|
22
|
+
/** Run a closure N times, return success ratio. Used for measurable accuracy assertions. */
|
|
23
|
+
async function accuracyRate(trials, predicate) {
|
|
24
|
+
let pass = 0;
|
|
25
|
+
for (let i = 0; i < trials; i++) {
|
|
26
|
+
if (await predicate())
|
|
27
|
+
pass++;
|
|
28
|
+
}
|
|
29
|
+
return pass / trials;
|
|
30
|
+
}
|
|
31
|
+
// ─── 1. nakedFingerprint contract ────────────────────────────────────────
|
|
32
|
+
describe("v2.19.19 INPAINT · nakedFingerprint", () => {
|
|
33
|
+
it("is deterministic: same image → identical 64-char hex hash", () => {
|
|
34
|
+
const img = makeSolidImage(10, 10, [255, 0, 0, 255]);
|
|
35
|
+
const a = nakedFingerprint(img);
|
|
36
|
+
const b = nakedFingerprint(img);
|
|
37
|
+
expect(a).toBe(b);
|
|
38
|
+
expect(a).toMatch(/^[a-f0-9]{64}$/);
|
|
39
|
+
});
|
|
40
|
+
it("differs for different pixel content (no collisions on basic variation)", () => {
|
|
41
|
+
const red = makeSolidImage(10, 10, [255, 0, 0, 255]);
|
|
42
|
+
const green = makeSolidImage(10, 10, [0, 255, 0, 255]);
|
|
43
|
+
expect(nakedFingerprint(red)).not.toBe(nakedFingerprint(green));
|
|
44
|
+
});
|
|
45
|
+
it("differs for different dimensions even with same byte pattern", () => {
|
|
46
|
+
const wide = makeSolidImage(100, 1, [0, 0, 0, 255]);
|
|
47
|
+
const tall = makeSolidImage(1, 100, [0, 0, 0, 255]);
|
|
48
|
+
expect(nakedFingerprint(wide)).not.toBe(nakedFingerprint(tall));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
// ─── 2. StubInpainter (Phase A baseline) ─────────────────────────────────
|
|
52
|
+
describe("v2.19.19 INPAINT · StubInpainter (Phase A baseline)", () => {
|
|
53
|
+
it("returns rgba IDENTICAL to input (100% pixel preservation)", async () => {
|
|
54
|
+
const img = makeTestImage({
|
|
55
|
+
width: 32, height: 32,
|
|
56
|
+
background: [200, 200, 200, 255],
|
|
57
|
+
foreground: [50, 50, 200, 255],
|
|
58
|
+
fgBbox: [10, 10, 12, 12],
|
|
59
|
+
});
|
|
60
|
+
const stub = new StubInpainter();
|
|
61
|
+
const out = await stub.inpaint({ image: img, mask: [{ bbox: [10, 10, 12, 12] }] });
|
|
62
|
+
expect(out.width).toBe(img.width);
|
|
63
|
+
expect(out.height).toBe(img.height);
|
|
64
|
+
expect(Array.from(out.rgba)).toEqual(Array.from(img.rgba));
|
|
65
|
+
});
|
|
66
|
+
it("name is 'stub:noop'", () => {
|
|
67
|
+
expect(new StubInpainter().name).toBe("stub:noop");
|
|
68
|
+
});
|
|
69
|
+
it("rejects malformed images (rgba length mismatch)", async () => {
|
|
70
|
+
const bad = { width: 10, height: 10, rgba: new Uint8Array(50) }; // should be 400
|
|
71
|
+
await expect(new StubInpainter().inpaint({ image: bad, mask: [] })).rejects.toThrow(/rgba length/);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
// ─── 3. PatchFillInpainter (Phase B — pure-TS content-aware fill) ────────
|
|
75
|
+
describe("v2.19.19 INPAINT · PatchFillInpainter (Phase B — PATCH HARVEST FILL)", () => {
|
|
76
|
+
it("returns image UNCHANGED when mask is empty (zero touched)", async () => {
|
|
77
|
+
const img = makeSolidImage(16, 16, [100, 100, 100, 255]);
|
|
78
|
+
const fill = new PatchFillInpainter();
|
|
79
|
+
const out = await fill.inpaint({ image: img, mask: [] });
|
|
80
|
+
expect(Array.from(out.rgba)).toEqual(Array.from(img.rgba));
|
|
81
|
+
});
|
|
82
|
+
it("changes pixels INSIDE the mask (genuine fill, not pass-through)", async () => {
|
|
83
|
+
const img = makeTestImage({
|
|
84
|
+
width: 24, height: 24,
|
|
85
|
+
background: [220, 220, 220, 255], // light grey background
|
|
86
|
+
foreground: [10, 10, 10, 255], // black foreground (the "caption")
|
|
87
|
+
fgBbox: [8, 8, 8, 8],
|
|
88
|
+
});
|
|
89
|
+
const fill = new PatchFillInpainter();
|
|
90
|
+
const out = await fill.inpaint({ image: img, mask: [{ bbox: [8, 8, 8, 8] }] });
|
|
91
|
+
const diffInsideMask = countDifferingPixels(img, out, [8, 8, 8, 8]);
|
|
92
|
+
// Every pixel inside the 8x8 mask region must be changed
|
|
93
|
+
expect(diffInsideMask).toBeGreaterThan(0);
|
|
94
|
+
expect(diffInsideMask).toBe(8 * 8); // all 64 mask pixels touched
|
|
95
|
+
});
|
|
96
|
+
it("MEASURABLE 100% pixel preservation OUTSIDE the mask (no smear into clean regions)", async () => {
|
|
97
|
+
const img = makeTestImage({
|
|
98
|
+
width: 24, height: 24,
|
|
99
|
+
background: [220, 220, 220, 255],
|
|
100
|
+
foreground: [10, 10, 10, 255],
|
|
101
|
+
fgBbox: [8, 8, 8, 8],
|
|
102
|
+
});
|
|
103
|
+
// Use blurBandPx=0 to test pure-fill behaviour without boundary blending
|
|
104
|
+
const fill = new PatchFillInpainter({ blurBandPx: 0 });
|
|
105
|
+
const out = await fill.inpaint({ image: img, mask: [{ bbox: [8, 8, 8, 8] }] });
|
|
106
|
+
// ALL pixels outside the 8x8 mask must be byte-identical
|
|
107
|
+
// We check all 4 quadrants around the mask
|
|
108
|
+
expect(countDifferingPixels(img, out, [0, 0, 24, 8])).toBe(0); // top strip
|
|
109
|
+
expect(countDifferingPixels(img, out, [0, 16, 24, 8])).toBe(0); // bottom strip
|
|
110
|
+
expect(countDifferingPixels(img, out, [0, 8, 8, 8])).toBe(0); // left strip
|
|
111
|
+
expect(countDifferingPixels(img, out, [16, 8, 8, 8])).toBe(0); // right strip
|
|
112
|
+
});
|
|
113
|
+
it("fills mask pixels with colour close to surrounding background (semantic plausibility)", async () => {
|
|
114
|
+
const img = makeTestImage({
|
|
115
|
+
width: 32, height: 32,
|
|
116
|
+
background: [200, 100, 50, 255], // orange-ish background
|
|
117
|
+
foreground: [10, 10, 10, 255], // black caption
|
|
118
|
+
fgBbox: [12, 12, 8, 8],
|
|
119
|
+
});
|
|
120
|
+
const fill = new PatchFillInpainter({ blurBandPx: 0 });
|
|
121
|
+
const out = await fill.inpaint({ image: img, mask: [{ bbox: [12, 12, 8, 8] }] });
|
|
122
|
+
// After fill, the masked region's mean color should be close to the background
|
|
123
|
+
// Distance threshold: mean per-channel diff < 20 (out of 255) = 92% closeness
|
|
124
|
+
const reference = makeSolidImage(32, 32, [200, 100, 50, 255]);
|
|
125
|
+
const dist = meanColorDistance(out, reference, [12, 12, 8, 8]);
|
|
126
|
+
expect(dist).toBeLessThan(20); // within 7.8% of true background colour
|
|
127
|
+
});
|
|
128
|
+
it("DETERMINISM: same image + same mask → identical output bytes (100% reproducibility)", async () => {
|
|
129
|
+
const img = makeTestImage({
|
|
130
|
+
width: 32, height: 32,
|
|
131
|
+
background: [128, 64, 200, 255],
|
|
132
|
+
foreground: [255, 255, 0, 255],
|
|
133
|
+
fgBbox: [10, 10, 12, 12],
|
|
134
|
+
});
|
|
135
|
+
const fill = new PatchFillInpainter();
|
|
136
|
+
const out1 = await fill.inpaint({ image: img, mask: [{ bbox: [10, 10, 12, 12] }] });
|
|
137
|
+
const out2 = await fill.inpaint({ image: img, mask: [{ bbox: [10, 10, 12, 12] }] });
|
|
138
|
+
expect(nakedFingerprint(out1)).toBe(nakedFingerprint(out2));
|
|
139
|
+
});
|
|
140
|
+
it("ring-search handles mask at image CORNER (no out-of-bounds reads)", async () => {
|
|
141
|
+
const img = makeTestImage({
|
|
142
|
+
width: 16, height: 16,
|
|
143
|
+
background: [100, 200, 100, 255],
|
|
144
|
+
foreground: [0, 0, 0, 255],
|
|
145
|
+
fgBbox: [0, 0, 4, 4], // corner mask
|
|
146
|
+
});
|
|
147
|
+
const fill = new PatchFillInpainter({ blurBandPx: 0 });
|
|
148
|
+
const out = await fill.inpaint({ image: img, mask: [{ bbox: [0, 0, 4, 4] }] });
|
|
149
|
+
// Should not throw; mask pixels should be filled with green-ish (background harvest)
|
|
150
|
+
expect(out.rgba.length).toBe(img.rgba.length);
|
|
151
|
+
const dist = meanColorDistance(out, makeSolidImage(16, 16, [100, 200, 100, 255]), [0, 0, 4, 4]);
|
|
152
|
+
expect(dist).toBeLessThan(20);
|
|
153
|
+
});
|
|
154
|
+
it("ring-search falls back to grey when ENTIRE image is masked (no neighbours)", async () => {
|
|
155
|
+
const img = makeSolidImage(8, 8, [200, 50, 100, 255]);
|
|
156
|
+
const fill = new PatchFillInpainter({ blurBandPx: 0 });
|
|
157
|
+
const out = await fill.inpaint({ image: img, mask: [{ bbox: [0, 0, 8, 8] }] });
|
|
158
|
+
// All pixels should be grey (128, 128, 128, 255) — the documented fallback
|
|
159
|
+
for (let i = 0; i < out.rgba.length; i += 4) {
|
|
160
|
+
expect(out.rgba[i + 0]).toBe(128);
|
|
161
|
+
expect(out.rgba[i + 1]).toBe(128);
|
|
162
|
+
expect(out.rgba[i + 2]).toBe(128);
|
|
163
|
+
expect(out.rgba[i + 3]).toBe(255);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
it("multiple disjoint mask regions all get filled independently", async () => {
|
|
167
|
+
const img = makeSolidImage(32, 32, [200, 200, 200, 255]);
|
|
168
|
+
// Paint two black squares at opposite corners
|
|
169
|
+
for (let y = 2; y < 6; y++) {
|
|
170
|
+
for (let x = 2; x < 6; x++) {
|
|
171
|
+
const idx = (y * 32 + x) * 4;
|
|
172
|
+
img.rgba[idx + 0] = 0;
|
|
173
|
+
img.rgba[idx + 1] = 0;
|
|
174
|
+
img.rgba[idx + 2] = 0;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
for (let y = 26; y < 30; y++) {
|
|
178
|
+
for (let x = 26; x < 30; x++) {
|
|
179
|
+
const idx = (y * 32 + x) * 4;
|
|
180
|
+
img.rgba[idx + 0] = 0;
|
|
181
|
+
img.rgba[idx + 1] = 0;
|
|
182
|
+
img.rgba[idx + 2] = 0;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const fill = new PatchFillInpainter({ blurBandPx: 0 });
|
|
186
|
+
const out = await fill.inpaint({
|
|
187
|
+
image: img,
|
|
188
|
+
mask: [{ bbox: [2, 2, 4, 4] }, { bbox: [26, 26, 4, 4] }],
|
|
189
|
+
});
|
|
190
|
+
// Both regions should be filled with light grey (harvested from background)
|
|
191
|
+
expect(out.rgba[(3 * 32 + 3) * 4 + 0]).toBeGreaterThan(150);
|
|
192
|
+
expect(out.rgba[(27 * 32 + 27) * 4 + 0]).toBeGreaterThan(150);
|
|
193
|
+
});
|
|
194
|
+
it("Gaussian blur band is applied (boundary pixels softened on a non-uniform background)", async () => {
|
|
195
|
+
// Use a horizontal-gradient background so boundary pixels are NOT all
|
|
196
|
+
// the same colour — blur then has work to do (softens the gradient).
|
|
197
|
+
const W = 32, H = 32;
|
|
198
|
+
const rgba = new Uint8Array(W * H * 4);
|
|
199
|
+
for (let y = 0; y < H; y++) {
|
|
200
|
+
for (let x = 0; x < W; x++) {
|
|
201
|
+
const idx = (y * W + x) * 4;
|
|
202
|
+
rgba[idx + 0] = Math.round((x / W) * 255);
|
|
203
|
+
rgba[idx + 1] = 100;
|
|
204
|
+
rgba[idx + 2] = Math.round((y / H) * 255);
|
|
205
|
+
rgba[idx + 3] = 255;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Paint a solid black mask region in the middle
|
|
209
|
+
for (let y = 12; y < 20; y++) {
|
|
210
|
+
for (let x = 12; x < 20; x++) {
|
|
211
|
+
const idx = (y * W + x) * 4;
|
|
212
|
+
rgba[idx + 0] = 0;
|
|
213
|
+
rgba[idx + 1] = 0;
|
|
214
|
+
rgba[idx + 2] = 0;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const img = { width: W, height: H, rgba };
|
|
218
|
+
const noBlur = new PatchFillInpainter({ blurBandPx: 0 });
|
|
219
|
+
const withBlur = new PatchFillInpainter({ blurBandPx: 3 });
|
|
220
|
+
const outA = await noBlur.inpaint({ image: img, mask: [{ bbox: [12, 12, 8, 8] }] });
|
|
221
|
+
const outB = await withBlur.inpaint({ image: img, mask: [{ bbox: [12, 12, 8, 8] }] });
|
|
222
|
+
// On a non-uniform gradient, the blur ACTUALLY changes the boundary band.
|
|
223
|
+
expect(nakedFingerprint(outA)).not.toBe(nakedFingerprint(outB));
|
|
224
|
+
});
|
|
225
|
+
it("naked fingerprint DIFFERS from stub (proves real inpainting happened)", async () => {
|
|
226
|
+
const img = makeTestImage({
|
|
227
|
+
width: 32, height: 32,
|
|
228
|
+
background: [220, 220, 220, 255],
|
|
229
|
+
foreground: [10, 10, 10, 255],
|
|
230
|
+
fgBbox: [12, 12, 8, 8],
|
|
231
|
+
});
|
|
232
|
+
const stub = new StubInpainter();
|
|
233
|
+
const fill = new PatchFillInpainter();
|
|
234
|
+
const sOut = await stub.inpaint({ image: img, mask: [{ bbox: [12, 12, 8, 8] }] });
|
|
235
|
+
const fOut = await fill.inpaint({ image: img, mask: [{ bbox: [12, 12, 8, 8] }] });
|
|
236
|
+
expect(nakedFingerprint(sOut)).not.toBe(nakedFingerprint(fOut));
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
// ─── 4. ACCURACY measurements (>= 97.5% on 200 trials) ──────────────────
|
|
240
|
+
describe("v2.19.19 INPAINT · ACCURACY MEASUREMENTS (97.5%+ targets)", () => {
|
|
241
|
+
it("MEASURED >= 97.5% DETERMINISM across 200 trials (varied images + masks)", async () => {
|
|
242
|
+
const rate = await accuracyRate(200, async () => {
|
|
243
|
+
// Random-ish but deterministic image params per trial (mulberry32-style)
|
|
244
|
+
const r1 = Math.floor(Math.random() * 256);
|
|
245
|
+
const r2 = Math.floor(Math.random() * 256);
|
|
246
|
+
const img = makeTestImage({
|
|
247
|
+
width: 16, height: 16,
|
|
248
|
+
background: [r1, r2, r1, 255],
|
|
249
|
+
foreground: [255 - r1, 255 - r2, 255 - r1, 255],
|
|
250
|
+
fgBbox: [4, 4, 8, 8],
|
|
251
|
+
});
|
|
252
|
+
const fill = new PatchFillInpainter();
|
|
253
|
+
const a = await fill.inpaint({ image: img, mask: [{ bbox: [4, 4, 8, 8] }] });
|
|
254
|
+
const b = await fill.inpaint({ image: img, mask: [{ bbox: [4, 4, 8, 8] }] });
|
|
255
|
+
return nakedFingerprint(a) === nakedFingerprint(b);
|
|
256
|
+
});
|
|
257
|
+
expect(rate).toBeGreaterThanOrEqual(0.975);
|
|
258
|
+
expect(rate).toBe(1); // actually 100% — algorithm is fully deterministic
|
|
259
|
+
});
|
|
260
|
+
it("MEASURED >= 97.5% PIXEL PRESERVATION outside mask across 100 trials", async () => {
|
|
261
|
+
const rate = await accuracyRate(100, async () => {
|
|
262
|
+
const r1 = Math.floor(Math.random() * 256);
|
|
263
|
+
const r2 = Math.floor(Math.random() * 256);
|
|
264
|
+
const img = makeTestImage({
|
|
265
|
+
width: 24, height: 24,
|
|
266
|
+
background: [r1, r2, 50, 255],
|
|
267
|
+
foreground: [0, 0, 0, 255],
|
|
268
|
+
fgBbox: [8, 8, 8, 8],
|
|
269
|
+
});
|
|
270
|
+
const fill = new PatchFillInpainter({ blurBandPx: 0 });
|
|
271
|
+
const out = await fill.inpaint({ image: img, mask: [{ bbox: [8, 8, 8, 8] }] });
|
|
272
|
+
// Strictly: pixels outside mask must be 100% byte-identical
|
|
273
|
+
const top = countDifferingPixels(img, out, [0, 0, 24, 8]);
|
|
274
|
+
const bot = countDifferingPixels(img, out, [0, 16, 24, 8]);
|
|
275
|
+
const left = countDifferingPixels(img, out, [0, 8, 8, 8]);
|
|
276
|
+
const right = countDifferingPixels(img, out, [16, 8, 8, 8]);
|
|
277
|
+
return top === 0 && bot === 0 && left === 0 && right === 0;
|
|
278
|
+
});
|
|
279
|
+
expect(rate).toBe(1); // 100% — invariant by design
|
|
280
|
+
expect(rate).toBeGreaterThanOrEqual(0.975);
|
|
281
|
+
});
|
|
282
|
+
it("MEASURED >= 97.5% FINGERPRINT DISCRIMINATION (no collisions on 100 distinct inputs)", async () => {
|
|
283
|
+
const fingerprints = new Set();
|
|
284
|
+
for (let i = 0; i < 100; i++) {
|
|
285
|
+
const img = makeTestImage({
|
|
286
|
+
width: 16, height: 16,
|
|
287
|
+
background: [i, 128, 255 - i, 255],
|
|
288
|
+
foreground: [255, 0, 0, 255],
|
|
289
|
+
fgBbox: [4, 4, 8, 8],
|
|
290
|
+
});
|
|
291
|
+
const fill = new PatchFillInpainter();
|
|
292
|
+
const out = await fill.inpaint({ image: img, mask: [{ bbox: [4, 4, 8, 8] }] });
|
|
293
|
+
fingerprints.add(nakedFingerprint(out));
|
|
294
|
+
}
|
|
295
|
+
// No two distinct images should produce the same fingerprint
|
|
296
|
+
expect(fingerprints.size).toBe(100); // 100/100 unique
|
|
297
|
+
expect(fingerprints.size / 100).toBeGreaterThanOrEqual(0.975);
|
|
298
|
+
});
|
|
299
|
+
it("MEASURED >= 97.5% MASK-COLOUR PLAUSIBILITY (mean color distance < 25 from background)", async () => {
|
|
300
|
+
const rate = await accuracyRate(50, async () => {
|
|
301
|
+
const bg = [
|
|
302
|
+
Math.floor(Math.random() * 256),
|
|
303
|
+
Math.floor(Math.random() * 256),
|
|
304
|
+
Math.floor(Math.random() * 256),
|
|
305
|
+
255,
|
|
306
|
+
];
|
|
307
|
+
const fg = [255 - bg[0], 255 - bg[1], 255 - bg[2], 255];
|
|
308
|
+
const img = makeTestImage({
|
|
309
|
+
width: 24, height: 24,
|
|
310
|
+
background: bg,
|
|
311
|
+
foreground: fg,
|
|
312
|
+
fgBbox: [8, 8, 8, 8],
|
|
313
|
+
});
|
|
314
|
+
const fill = new PatchFillInpainter({ blurBandPx: 0 });
|
|
315
|
+
const out = await fill.inpaint({ image: img, mask: [{ bbox: [8, 8, 8, 8] }] });
|
|
316
|
+
const reference = makeSolidImage(24, 24, bg);
|
|
317
|
+
const dist = meanColorDistance(out, reference, [8, 8, 8, 8]);
|
|
318
|
+
return dist < 25; // within ~10% of background = "plausible fill"
|
|
319
|
+
});
|
|
320
|
+
expect(rate).toBeGreaterThanOrEqual(0.975);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
// ─── 5. VendorApiInpainter (mock fetch) ──────────────────────────────────
|
|
324
|
+
describe("v2.19.19 INPAINT · VendorApiInpainter", () => {
|
|
325
|
+
it("POSTs to caller-supplied endpoint + reshapes response into RawImage", async () => {
|
|
326
|
+
const img = makeSolidImage(4, 4, [100, 200, 100, 255]);
|
|
327
|
+
let receivedUrl = "";
|
|
328
|
+
let receivedBody = "";
|
|
329
|
+
const mockFetch = (async (url, init) => {
|
|
330
|
+
receivedUrl = url.toString();
|
|
331
|
+
receivedBody = typeof init?.body === "string" ? init.body : "";
|
|
332
|
+
return new Response(JSON.stringify({ pixels: Array.from(new Uint8Array(64)) }), {
|
|
333
|
+
status: 200, headers: { "content-type": "application/json" },
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
const inp = new VendorApiInpainter({
|
|
337
|
+
endpoint: "https://fake-inpainter.example.com/v1/fill",
|
|
338
|
+
shapeRequest: (input) => ({ body: { w: input.image.width, h: input.image.height, mask: input.mask } }),
|
|
339
|
+
shapeResponse: (raw, orig) => ({
|
|
340
|
+
width: orig.width, height: orig.height,
|
|
341
|
+
rgba: new Uint8Array(raw.pixels),
|
|
342
|
+
}),
|
|
343
|
+
fetcher: mockFetch,
|
|
344
|
+
});
|
|
345
|
+
const out = await inp.inpaint({ image: img, mask: [{ bbox: [0, 0, 2, 2] }] });
|
|
346
|
+
expect(receivedUrl).toBe("https://fake-inpainter.example.com/v1/fill");
|
|
347
|
+
expect(receivedBody).toContain('"w":4');
|
|
348
|
+
expect(out.rgba.length).toBe(64); // 4x4x4
|
|
349
|
+
});
|
|
350
|
+
it("throws on non-2xx HTTP response", async () => {
|
|
351
|
+
const mockFetch = (async () => new Response("nope", { status: 500 }));
|
|
352
|
+
const inp = new VendorApiInpainter({
|
|
353
|
+
endpoint: "https://fake.example.com/x",
|
|
354
|
+
shapeRequest: () => ({ body: {} }),
|
|
355
|
+
shapeResponse: (_r, orig) => orig,
|
|
356
|
+
fetcher: mockFetch,
|
|
357
|
+
});
|
|
358
|
+
const img = makeSolidImage(2, 2, [0, 0, 0, 255]);
|
|
359
|
+
await expect(inp.inpaint({ image: img, mask: [] })).rejects.toThrow(/HTTP 500/);
|
|
360
|
+
});
|
|
361
|
+
it("name encodes the host so multi-vendor setups are distinguishable", () => {
|
|
362
|
+
const inp = new VendorApiInpainter({
|
|
363
|
+
endpoint: "https://deepai.example.com/api/inpaint",
|
|
364
|
+
shapeRequest: () => ({ body: {} }),
|
|
365
|
+
shapeResponse: (_r, orig) => orig,
|
|
366
|
+
});
|
|
367
|
+
expect(inp.name).toBe("vendor-api:deepai.example.com");
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
// ─── 6. resolveInpainter ladder ─────────────────────────────────────────
|
|
371
|
+
describe("v2.19.19 INPAINT · resolveInpainter ladder", () => {
|
|
372
|
+
it("auto → returns PatchFillInpainter (always available, offline, deterministic)", () => {
|
|
373
|
+
const inp = resolveInpainter({ provider: "auto" });
|
|
374
|
+
expect(inp.name).toBe("patch-harvest-fill:v1");
|
|
375
|
+
});
|
|
376
|
+
it("explicit stub returns StubInpainter", () => {
|
|
377
|
+
const inp = resolveInpainter({ provider: "stub" });
|
|
378
|
+
expect(inp.name).toBe("stub:noop");
|
|
379
|
+
});
|
|
380
|
+
it("explicit patch-fill honours custom ringSearchLimit", () => {
|
|
381
|
+
const inp = resolveInpainter({ provider: "patch-fill", patchFillOptions: { ringSearchLimit: 32 } });
|
|
382
|
+
expect(inp.ringSearchLimit).toBe(32);
|
|
383
|
+
});
|
|
384
|
+
it("vendor-api throws when no vendorApiOptions supplied (fail-fast on misconfig)", () => {
|
|
385
|
+
expect(() => resolveInpainter({ provider: "vendor-api" })).toThrow(/vendorApiOptions/);
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
// ─── 7. inpaintMaskRegions orchestrator ─────────────────────────────────
|
|
389
|
+
describe("v2.19.19 INPAINT · inpaintMaskRegions orchestrator", () => {
|
|
390
|
+
it("returns nakedImage + fingerprint + touched/preserved pixel counts", async () => {
|
|
391
|
+
const img = makeTestImage({
|
|
392
|
+
width: 16, height: 16,
|
|
393
|
+
background: [200, 200, 200, 255],
|
|
394
|
+
foreground: [0, 0, 0, 255],
|
|
395
|
+
fgBbox: [4, 4, 8, 8],
|
|
396
|
+
});
|
|
397
|
+
const r = await inpaintMaskRegions({ image: img, mask: [{ bbox: [4, 4, 8, 8] }] });
|
|
398
|
+
expect(r.nakedImage.width).toBe(16);
|
|
399
|
+
expect(r.nakedFingerprint).toMatch(/^[a-f0-9]{64}$/);
|
|
400
|
+
expect(r.provider).toBe("patch-harvest-fill:v1");
|
|
401
|
+
expect(r.pixelsTouched + r.pixelsPreserved).toBe(16 * 16);
|
|
402
|
+
// Default blurBandPx=3 may touch boundary pixels beyond the mask
|
|
403
|
+
expect(r.pixelsTouched).toBeGreaterThanOrEqual(64);
|
|
404
|
+
});
|
|
405
|
+
it("custom provider parameter is honoured", async () => {
|
|
406
|
+
const img = makeSolidImage(8, 8, [100, 100, 100, 255]);
|
|
407
|
+
const r = await inpaintMaskRegions({
|
|
408
|
+
image: img,
|
|
409
|
+
mask: [{ bbox: [0, 0, 8, 8] }],
|
|
410
|
+
provider: new StubInpainter(),
|
|
411
|
+
});
|
|
412
|
+
expect(r.provider).toBe("stub:noop");
|
|
413
|
+
expect(r.pixelsTouched).toBe(0); // stub does nothing
|
|
414
|
+
expect(r.pixelsPreserved).toBe(64);
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
// ─── 8. formatter + helpers ──────────────────────────────────────────────
|
|
418
|
+
describe("v2.19.19 INPAINT · formatter + utility helpers", () => {
|
|
419
|
+
it("formatInpaintLine includes provider + counts + fingerprint prefix", async () => {
|
|
420
|
+
const img = makeSolidImage(4, 4, [50, 50, 50, 255]);
|
|
421
|
+
const r = await inpaintMaskRegions({ image: img, mask: [{ bbox: [1, 1, 2, 2] }] });
|
|
422
|
+
const line = formatInpaintLine(r);
|
|
423
|
+
expect(line).toContain("🎨 INPAINT");
|
|
424
|
+
expect(line).toContain("patch-harvest-fill:v1");
|
|
425
|
+
expect(line).toContain("touched=");
|
|
426
|
+
expect(line).toContain("naked=");
|
|
427
|
+
});
|
|
428
|
+
it("meanColorDistance returns 0 for identical images", () => {
|
|
429
|
+
const a = makeSolidImage(4, 4, [10, 20, 30, 255]);
|
|
430
|
+
const b = makeSolidImage(4, 4, [10, 20, 30, 255]);
|
|
431
|
+
expect(meanColorDistance(a, b)).toBe(0);
|
|
432
|
+
});
|
|
433
|
+
it("meanColorDistance returns expected magnitude for known difference", () => {
|
|
434
|
+
const a = makeSolidImage(4, 4, [100, 100, 100, 255]);
|
|
435
|
+
const b = makeSolidImage(4, 4, [110, 110, 110, 255]);
|
|
436
|
+
// Per-pixel: |10|+|10|+|10|+|0| = 30, divided by 4 channels = 7.5
|
|
437
|
+
expect(meanColorDistance(a, b)).toBeCloseTo(7.5, 1);
|
|
438
|
+
});
|
|
439
|
+
it("makeTestImage produces the expected background + foreground layout", () => {
|
|
440
|
+
const img = makeTestImage({
|
|
441
|
+
width: 4, height: 4,
|
|
442
|
+
background: [255, 0, 0, 255],
|
|
443
|
+
foreground: [0, 255, 0, 255],
|
|
444
|
+
fgBbox: [1, 1, 2, 2],
|
|
445
|
+
});
|
|
446
|
+
// Corner (0,0) = background red
|
|
447
|
+
expect(img.rgba[0]).toBe(255);
|
|
448
|
+
expect(img.rgba[1]).toBe(0);
|
|
449
|
+
// Center (1,1) = foreground green
|
|
450
|
+
const ci = (1 * 4 + 1) * 4;
|
|
451
|
+
expect(img.rgba[ci + 0]).toBe(0);
|
|
452
|
+
expect(img.rgba[ci + 1]).toBe(255);
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
// ─── 9. THE CAA DEFEAT END-TO-END (composes onto v2.19.18 severCaption) ─
|
|
456
|
+
describe("v2.19.19 INPAINT · canonical CAA defeat (composes onto severCaption)", () => {
|
|
457
|
+
it("real inpainter produces a DIFFERENT naked fingerprint than the v2.19.18 deterministic stub for the same scam image", async () => {
|
|
458
|
+
// Simulate a product image with a corner-sticker caption region
|
|
459
|
+
const img = makeTestImage({
|
|
460
|
+
width: 64, height: 64,
|
|
461
|
+
background: [180, 90, 50, 255], // orange product
|
|
462
|
+
foreground: [255, 255, 255, 255], // white sticker
|
|
463
|
+
fgBbox: [4, 4, 24, 12], // corner sticker
|
|
464
|
+
});
|
|
465
|
+
const fill = new PatchFillInpainter();
|
|
466
|
+
const fillResult = await inpaintMaskRegions({
|
|
467
|
+
image: img,
|
|
468
|
+
mask: [{ bbox: [4, 4, 24, 12] }],
|
|
469
|
+
provider: fill,
|
|
470
|
+
});
|
|
471
|
+
// Phase B fingerprint differs from raw image fingerprint AND from stub fingerprint
|
|
472
|
+
const rawFp = nakedFingerprint(img);
|
|
473
|
+
const stubResult = await inpaintMaskRegions({
|
|
474
|
+
image: img, mask: [{ bbox: [4, 4, 24, 12] }],
|
|
475
|
+
provider: new StubInpainter(),
|
|
476
|
+
});
|
|
477
|
+
expect(fillResult.nakedFingerprint).not.toBe(rawFp);
|
|
478
|
+
expect(fillResult.nakedFingerprint).not.toBe(stubResult.nakedFingerprint);
|
|
479
|
+
});
|
|
480
|
+
});
|
|
481
|
+
//# sourceMappingURL=caption_inpaint.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caption_inpaint.test.js","sourceRoot":"","sources":["../../src/caption_inpaint/caption_inpaint.test.ts"],"names":[],"mappings":"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"}
|