@stigmer/react 3.8.0 → 3.9.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 (52) hide show
  1. package/attachment/AttachmentChipList.d.ts.map +1 -1
  2. package/attachment/AttachmentChipList.js +30 -1
  3. package/attachment/AttachmentChipList.js.map +1 -1
  4. package/attachment/attachment-utils.d.ts +11 -0
  5. package/attachment/attachment-utils.d.ts.map +1 -1
  6. package/attachment/attachment-utils.js +23 -0
  7. package/attachment/attachment-utils.js.map +1 -1
  8. package/attachment/clipboard.d.ts +51 -0
  9. package/attachment/clipboard.d.ts.map +1 -0
  10. package/attachment/clipboard.js +89 -0
  11. package/attachment/clipboard.js.map +1 -0
  12. package/attachment/index.d.ts +6 -1
  13. package/attachment/index.d.ts.map +1 -1
  14. package/attachment/index.js +4 -1
  15. package/attachment/index.js.map +1 -1
  16. package/attachment/prepare-image.d.ts +43 -0
  17. package/attachment/prepare-image.d.ts.map +1 -0
  18. package/attachment/prepare-image.js +162 -0
  19. package/attachment/prepare-image.js.map +1 -0
  20. package/attachment/useAttachments.d.ts.map +1 -1
  21. package/attachment/useAttachments.js +23 -3
  22. package/attachment/useAttachments.js.map +1 -1
  23. package/attachment/vision-fit.d.ts +50 -0
  24. package/attachment/vision-fit.d.ts.map +1 -0
  25. package/attachment/vision-fit.js +76 -0
  26. package/attachment/vision-fit.js.map +1 -0
  27. package/composer/SessionComposer.d.ts +3 -1
  28. package/composer/SessionComposer.d.ts.map +1 -1
  29. package/composer/SessionComposer.js +50 -4
  30. package/composer/SessionComposer.js.map +1 -1
  31. package/index.d.ts +2 -2
  32. package/index.d.ts.map +1 -1
  33. package/index.js +3 -2
  34. package/index.js.map +1 -1
  35. package/package.json +4 -4
  36. package/src/attachment/AttachmentChipList.tsx +45 -1
  37. package/src/attachment/__tests__/AttachmentChipList.test.tsx +103 -0
  38. package/src/attachment/__tests__/attachment-utils.test.ts +54 -0
  39. package/src/attachment/__tests__/clipboard.test.ts +110 -0
  40. package/src/attachment/__tests__/prepare-image.browser.test.ts +166 -0
  41. package/src/attachment/__tests__/prepare-image.test.ts +32 -0
  42. package/src/attachment/__tests__/vision-fit.test.ts +93 -0
  43. package/src/attachment/attachment-utils.ts +27 -0
  44. package/src/attachment/clipboard.ts +102 -0
  45. package/src/attachment/index.ts +13 -0
  46. package/src/attachment/prepare-image.ts +179 -0
  47. package/src/attachment/useAttachments.ts +26 -2
  48. package/src/attachment/vision-fit.ts +90 -0
  49. package/src/composer/SessionComposer.tsx +73 -4
  50. package/src/composer/__tests__/SessionComposer-paste.test.tsx +263 -0
  51. package/src/composer/__tests__/SessionComposer-uploadGate.test.tsx +239 -0
  52. package/src/index.ts +11 -1
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stigmer/react",
3
- "version": "3.8.0",
3
+ "version": "3.9.0",
4
4
  "description": "React provider and client hook for the Stigmer platform SDK",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -37,7 +37,7 @@
37
37
  "dependencies": {
38
38
  "@bufbuild/protovalidate": "^1.1.1",
39
39
  "@dagrejs/dagre": "^1.1.4",
40
- "@stigmer/theme": "3.8.0",
40
+ "@stigmer/theme": "3.9.0",
41
41
  "diff": "^8.0.3",
42
42
  "fflate": "^0.8.2",
43
43
  "hast-util-to-jsx-runtime": "^2.3.6",
@@ -60,8 +60,8 @@
60
60
  "@codemirror/state": "^6.0.0",
61
61
  "@codemirror/view": "^6.0.0",
62
62
  "@lezer/highlight": "^1.0.0",
63
- "@stigmer/protos": "3.8.0",
64
- "@stigmer/sdk": "3.8.0",
63
+ "@stigmer/protos": "3.9.0",
64
+ "@stigmer/sdk": "3.9.0",
65
65
  "@tanstack/react-table": "^8.20.0",
66
66
  "@xyflow/react": "^12.0.0",
67
67
  "elkjs": "^0.9.0",
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import { useEffect, useState } from "react";
3
4
  import { cn } from "@stigmer/theme";
4
5
  import type { AttachmentEntry } from "./useAttachments.js";
5
6
  import { formatFileSize } from "./attachment-utils.js";
@@ -103,7 +104,12 @@ function AttachmentChip({
103
104
  >
104
105
  {isUploading && <ChipSpinner />}
105
106
  {isError && <ErrorDot />}
106
- {!isUploading && !isError && <FileIcon />}
107
+ {!isUploading && !isError &&
108
+ (entry.contentType.startsWith("image/") ? (
109
+ <ChipThumbnail file={entry.file} />
110
+ ) : (
111
+ <FileIcon />
112
+ ))}
107
113
 
108
114
  <span className="truncate">{entry.file.name}</span>
109
115
 
@@ -136,6 +142,44 @@ function AttachmentChip({
136
142
  );
137
143
  }
138
144
 
145
+ // ---------------------------------------------------------------------------
146
+ // Image thumbnail — a #284 ask: a pasted screenshot's chip shows the image,
147
+ // not a generic file glyph
148
+ // ---------------------------------------------------------------------------
149
+
150
+ /**
151
+ * Tiny preview of an image attachment, driven by an object URL over the
152
+ * locally-held `File` (no fetch — the bytes are already in memory).
153
+ *
154
+ * The URL is created in an effect, not a memo: StrictMode double-invokes
155
+ * memos and would leak the first URL without a revoke. The effect cleanup
156
+ * revokes on removal, unmount, and file change. Until the effect runs (or
157
+ * if it never gets a URL) the generic icon renders instead.
158
+ *
159
+ * `aria-hidden`: the chip's own `aria-label` already names the file; a
160
+ * 16px thumbnail adds nothing for screen readers.
161
+ */
162
+ function ChipThumbnail({ file }: { readonly file: File }) {
163
+ const [url, setUrl] = useState<string | null>(null);
164
+
165
+ useEffect(() => {
166
+ const objectUrl = URL.createObjectURL(file);
167
+ setUrl(objectUrl);
168
+ return () => URL.revokeObjectURL(objectUrl);
169
+ }, [file]);
170
+
171
+ if (!url) return <FileIcon />;
172
+
173
+ return (
174
+ <img
175
+ src={url}
176
+ alt=""
177
+ aria-hidden="true"
178
+ className="h-4 w-4 shrink-0 rounded-sm object-cover"
179
+ />
180
+ );
181
+ }
182
+
139
183
  // ---------------------------------------------------------------------------
140
184
  // Inline SVG icons — kept minimal and consistent with SessionComposer icons
141
185
  // ---------------------------------------------------------------------------
@@ -0,0 +1,103 @@
1
+ import { describe, it, expect, vi, afterEach } from "vitest";
2
+ import { render, cleanup, waitFor } from "@testing-library/react";
3
+ import { AttachmentChipList } from "../AttachmentChipList.js";
4
+ import type { AttachmentEntry } from "../useAttachments.js";
5
+
6
+ // ---------------------------------------------------------------------------
7
+ // Helpers
8
+ // ---------------------------------------------------------------------------
9
+
10
+ function entry(overrides: Partial<AttachmentEntry> = {}): AttachmentEntry {
11
+ return {
12
+ id: overrides.id ?? "entry-1",
13
+ file:
14
+ overrides.file ??
15
+ new File([new Uint8Array([0x89, 0x50, 0x4e, 0x47])], "shot.png", {
16
+ type: "image/png",
17
+ }),
18
+ phase: overrides.phase ?? "ready",
19
+ contentType: overrides.contentType ?? "image/png",
20
+ storageKey: overrides.storageKey ?? "attachments/test/shot.png",
21
+ error: overrides.error ?? null,
22
+ };
23
+ }
24
+
25
+ function renderChips(entries: AttachmentEntry[]) {
26
+ return render(
27
+ <AttachmentChipList entries={entries} onRemove={vi.fn()} onRetry={vi.fn()} />,
28
+ );
29
+ }
30
+
31
+ afterEach(() => {
32
+ cleanup();
33
+ vi.restoreAllMocks();
34
+ });
35
+
36
+ // ---------------------------------------------------------------------------
37
+ // Tests
38
+ // ---------------------------------------------------------------------------
39
+
40
+ describe("AttachmentChipList — image thumbnails", () => {
41
+ it("renders an object-URL thumbnail for a ready image entry", async () => {
42
+ const { container } = renderChips([entry()]);
43
+
44
+ await waitFor(() => {
45
+ const img = container.querySelector("img");
46
+ expect(img).toBeTruthy();
47
+ expect(img!.getAttribute("src")).toContain("blob:");
48
+ expect(img!.getAttribute("aria-hidden")).toBe("true");
49
+ expect(img!.getAttribute("alt")).toBe("");
50
+ });
51
+ });
52
+
53
+ it("keeps the generic file icon for non-image entries", () => {
54
+ const md = entry({
55
+ file: new File(["# notes"], "notes.md", { type: "text/markdown" }),
56
+ contentType: "text/markdown",
57
+ });
58
+
59
+ const { container } = renderChips([md]);
60
+
61
+ expect(container.querySelector("img")).toBeNull();
62
+ expect(container.querySelector("svg")).toBeTruthy();
63
+ });
64
+
65
+ it("shows no thumbnail while uploading or errored (spinner / error dot own the slot)", () => {
66
+ const uploading = entry({ id: "up", phase: "uploading", storageKey: null });
67
+ const errored = entry({ id: "err", phase: "error", error: "boom", storageKey: null });
68
+
69
+ const { container } = renderChips([uploading, errored]);
70
+
71
+ expect(container.querySelector("img")).toBeNull();
72
+ });
73
+
74
+ it("revokes the object URL on unmount", async () => {
75
+ const revokeSpy = vi.spyOn(URL, "revokeObjectURL");
76
+ const { container, unmount } = renderChips([entry()]);
77
+
78
+ await waitFor(() => expect(container.querySelector("img")).toBeTruthy());
79
+ const src = container.querySelector("img")!.getAttribute("src")!;
80
+
81
+ unmount();
82
+
83
+ expect(revokeSpy).toHaveBeenCalledWith(src);
84
+ });
85
+
86
+ it("revokes the object URL when the entry is removed from the list", async () => {
87
+ const revokeSpy = vi.spyOn(URL, "revokeObjectURL");
88
+ const image = entry();
89
+ const { container, rerender } = render(
90
+ <AttachmentChipList entries={[image]} onRemove={vi.fn()} onRetry={vi.fn()} />,
91
+ );
92
+
93
+ await waitFor(() => expect(container.querySelector("img")).toBeTruthy());
94
+ const src = container.querySelector("img")!.getAttribute("src")!;
95
+
96
+ rerender(
97
+ <AttachmentChipList entries={[]} onRemove={vi.fn()} onRetry={vi.fn()} />,
98
+ );
99
+
100
+ expect(container.querySelector("img")).toBeNull();
101
+ expect(revokeSpy).toHaveBeenCalledWith(src);
102
+ });
103
+ });
@@ -0,0 +1,54 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { uniquifyFilename } from "../attachment-utils.js";
3
+
4
+ describe("uniquifyFilename", () => {
5
+ const cases: Array<{
6
+ scenario: string;
7
+ name: string;
8
+ taken: string[];
9
+ expected: string;
10
+ }> = [
11
+ {
12
+ scenario: "returns the name unchanged when nothing collides",
13
+ name: "report.pdf",
14
+ taken: [],
15
+ expected: "report.pdf",
16
+ },
17
+ {
18
+ scenario: "suffixes -2 before the extension on first collision",
19
+ name: "report.pdf",
20
+ taken: ["report.pdf"],
21
+ expected: "report-2.pdf",
22
+ },
23
+ {
24
+ scenario: "walks past already-taken suffixes",
25
+ name: "report.pdf",
26
+ taken: ["report.pdf", "report-2.pdf", "report-3.pdf"],
27
+ expected: "report-4.pdf",
28
+ },
29
+ {
30
+ scenario: "handles names without an extension",
31
+ name: "Makefile",
32
+ taken: ["Makefile"],
33
+ expected: "Makefile-2",
34
+ },
35
+ {
36
+ scenario: "treats a leading dot as a hidden-file prefix, not an extension",
37
+ name: ".env",
38
+ taken: [".env"],
39
+ expected: ".env-2",
40
+ },
41
+ {
42
+ scenario: "only splits on the last dot of a multi-dot name",
43
+ name: "backup.tar.gz",
44
+ taken: ["backup.tar.gz"],
45
+ expected: "backup.tar-2.gz",
46
+ },
47
+ ];
48
+
49
+ for (const { scenario, name, taken, expected } of cases) {
50
+ it(scenario, () => {
51
+ expect(uniquifyFilename(name, new Set(taken))).toBe(expected);
52
+ });
53
+ }
54
+ });
@@ -0,0 +1,110 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { extractClipboardFiles } from "../clipboard.js";
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // Helpers
6
+ // ---------------------------------------------------------------------------
7
+
8
+ /**
9
+ * The function only reads `clipboardData.files` as an array-like, so a
10
+ * plain array cast to FileList is a faithful stand-in (same pattern as the
11
+ * composer fileref tests).
12
+ */
13
+ function clipboardEventWith(files: File[]): { clipboardData: { files: FileList } } {
14
+ return { clipboardData: { files: files as unknown as FileList } };
15
+ }
16
+
17
+ function imageFile(name: string, type = "image/png"): File {
18
+ return new File([new Uint8Array([0x89, 0x50, 0x4e, 0x47])], name, { type });
19
+ }
20
+
21
+ const SYNTHESIZED_NAME = /^pasted-image-\d{6}-\d+\.[a-z]+$/;
22
+
23
+ // ---------------------------------------------------------------------------
24
+ // Tests
25
+ // ---------------------------------------------------------------------------
26
+
27
+ describe("extractClipboardFiles", () => {
28
+ it("returns an empty array for a text-only paste (null clipboardData)", () => {
29
+ expect(extractClipboardFiles({ clipboardData: null })).toEqual([]);
30
+ });
31
+
32
+ it("returns an empty array when the clipboard carries no files", () => {
33
+ expect(extractClipboardFiles(clipboardEventWith([]))).toEqual([]);
34
+ });
35
+
36
+ it("renames the browser's generic image.png to a synthesized name", () => {
37
+ const [file] = extractClipboardFiles(clipboardEventWith([imageFile("image.png")]));
38
+
39
+ expect(file.name).toMatch(SYNTHESIZED_NAME);
40
+ expect(file.name.endsWith(".png")).toBe(true);
41
+ expect(file.type).toBe("image/png");
42
+ });
43
+
44
+ it("renames generic names for every image flavor browsers produce", () => {
45
+ const cases: Array<[string, string, string]> = [
46
+ ["image.jpg", "image/jpeg", ".jpg"],
47
+ ["image.jpeg", "image/jpeg", ".jpg"],
48
+ ["image.gif", "image/gif", ".gif"],
49
+ ["image.webp", "image/webp", ".webp"],
50
+ ["image.tiff", "image/tiff", ".tiff"],
51
+ ["IMAGE.PNG", "image/png", ".png"],
52
+ // Empty name with an image MIME (some WebKit paste payloads).
53
+ ["", "image/png", ".png"],
54
+ ];
55
+
56
+ for (const [name, type, expectedExt] of cases) {
57
+ const [file] = extractClipboardFiles(clipboardEventWith([imageFile(name, type)]));
58
+ expect(file.name, `input name '${name}'`).toMatch(SYNTHESIZED_NAME);
59
+ expect(file.name.endsWith(expectedExt), `'${file.name}' should end with ${expectedExt}`).toBe(true);
60
+ }
61
+ });
62
+
63
+ it("gives two images pasted together distinct names", () => {
64
+ const files = extractClipboardFiles(
65
+ clipboardEventWith([imageFile("image.png"), imageFile("image.png")]),
66
+ );
67
+
68
+ expect(files).toHaveLength(2);
69
+ expect(files[0].name).not.toBe(files[1].name);
70
+ });
71
+
72
+ it("gives images from separate pastes distinct names (session inputs/ dir accumulates)", () => {
73
+ const [first] = extractClipboardFiles(clipboardEventWith([imageFile("image.png")]));
74
+ const [second] = extractClipboardFiles(clipboardEventWith([imageFile("image.png")]));
75
+
76
+ expect(first.name).not.toBe(second.name);
77
+ });
78
+
79
+ it("keeps the real name of a file pasted from a file manager", () => {
80
+ const [file] = extractClipboardFiles(
81
+ clipboardEventWith([imageFile("architecture-sketch.png")]),
82
+ );
83
+
84
+ expect(file.name).toBe("architecture-sketch.png");
85
+ });
86
+
87
+ it("does not rename a non-image file even when named image.png", () => {
88
+ const pdf = new File([new Uint8Array([0x25, 0x50])], "image.png", {
89
+ type: "application/pdf",
90
+ });
91
+
92
+ const [file] = extractClipboardFiles(clipboardEventWith([pdf]));
93
+ expect(file.name).toBe("image.png");
94
+ });
95
+
96
+ it("preserves bytes and metadata across a rename", async () => {
97
+ const original = new File([new Uint8Array([1, 2, 3, 4])], "image.png", {
98
+ type: "image/png",
99
+ lastModified: 1723200000000,
100
+ });
101
+
102
+ const [renamed] = extractClipboardFiles(clipboardEventWith([original]));
103
+
104
+ expect(renamed.type).toBe("image/png");
105
+ expect(renamed.lastModified).toBe(1723200000000);
106
+ expect(new Uint8Array(await renamed.arrayBuffer())).toEqual(
107
+ new Uint8Array([1, 2, 3, 4]),
108
+ );
109
+ });
110
+ });
@@ -0,0 +1,166 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { prepareImageForVision } from "../prepare-image.js";
3
+ import { fitToVisionResolution } from "../vision-fit.js";
4
+
5
+ /**
6
+ * Real-Chromium half of the prepare-image coverage: decode, resize, and
7
+ * encode against an actual rendering engine (happy-dom has no canvas 2D
8
+ * or createImageBitmap — see prepare-image.test.ts for the guard rails).
9
+ */
10
+
11
+ // ---------------------------------------------------------------------------
12
+ // Helpers
13
+ // ---------------------------------------------------------------------------
14
+
15
+ function makeCanvas(width: number, height: number): [HTMLCanvasElement, CanvasRenderingContext2D] {
16
+ const canvas = document.createElement("canvas");
17
+ canvas.width = width;
18
+ canvas.height = height;
19
+ const ctx = canvas.getContext("2d");
20
+ if (!ctx) throw new Error("test environment must provide a 2D context");
21
+ return [canvas, ctx];
22
+ }
23
+
24
+ /** Flat fills and text — the compressible content of a UI screenshot. */
25
+ function drawUiLike(ctx: CanvasRenderingContext2D, width: number, height: number) {
26
+ ctx.fillStyle = "#f5f5f5";
27
+ ctx.fillRect(0, 0, width, height);
28
+ ctx.fillStyle = "#3355aa";
29
+ ctx.fillRect(40, 40, width / 2, 120);
30
+ ctx.fillStyle = "#111111";
31
+ ctx.font = "24px sans-serif";
32
+ for (let y = 220; y < height - 40; y += 48) {
33
+ ctx.fillText("Error: connection refused at line 42 — retry failed", 48, y);
34
+ }
35
+ }
36
+
37
+ /** Per-pixel noise — the least-compressible content a photo can approach. */
38
+ function drawNoise(ctx: CanvasRenderingContext2D, width: number, height: number) {
39
+ const imageData = ctx.createImageData(width, height);
40
+ const data = imageData.data;
41
+ for (let i = 0; i < data.length; i += 4) {
42
+ data[i] = Math.floor(Math.random() * 256);
43
+ data[i + 1] = Math.floor(Math.random() * 256);
44
+ data[i + 2] = Math.floor(Math.random() * 256);
45
+ data[i + 3] = 255;
46
+ }
47
+ ctx.putImageData(imageData, 0, 0);
48
+ }
49
+
50
+ async function fileFromCanvas(
51
+ canvas: HTMLCanvasElement,
52
+ name: string,
53
+ type: string,
54
+ ): Promise<File> {
55
+ const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, type));
56
+ if (!blob) throw new Error(`canvas could not encode ${type}`);
57
+ return new File([blob], name, { type });
58
+ }
59
+
60
+ async function imageFile(
61
+ width: number,
62
+ height: number,
63
+ name: string,
64
+ type: string,
65
+ draw: (ctx: CanvasRenderingContext2D, w: number, h: number) => void = drawUiLike,
66
+ ): Promise<File> {
67
+ const [canvas, ctx] = makeCanvas(width, height);
68
+ draw(ctx, width, height);
69
+ return fileFromCanvas(canvas, name, type);
70
+ }
71
+
72
+ async function decodedSize(file: File): Promise<{ width: number; height: number }> {
73
+ const bitmap = await createImageBitmap(file);
74
+ const size = { width: bitmap.width, height: bitmap.height };
75
+ bitmap.close();
76
+ return size;
77
+ }
78
+
79
+ // ---------------------------------------------------------------------------
80
+ // Tests
81
+ // ---------------------------------------------------------------------------
82
+
83
+ describe("prepareImageForVision — real pixel pipeline", () => {
84
+ it("resizes an oversized PNG screenshot to the fitted resolution, staying PNG", async () => {
85
+ const input = await imageFile(3000, 2000, "screenshot.png", "image/png");
86
+ const expected = fitToVisionResolution(3000, 2000);
87
+
88
+ const prepared = await prepareImageForVision(input);
89
+
90
+ expect(prepared).not.toBe(input);
91
+ expect(prepared.type).toBe("image/png");
92
+ expect(prepared.name).toBe("screenshot.png");
93
+ expect(prepared.size).toBeLessThan(input.size);
94
+ expect(prepared.lastModified).toBe(input.lastModified);
95
+ await expect(decodedSize(prepared)).resolves.toEqual(expected);
96
+ });
97
+
98
+ it("passes a within-limits PNG through byte-identical (no generation loss on re-edit)", async () => {
99
+ const input = await imageFile(400, 300, "small.png", "image/png");
100
+
101
+ const prepared = await prepareImageForVision(input);
102
+
103
+ expect(prepared).toBe(input);
104
+ });
105
+
106
+ it("passes a within-limits JPEG through byte-identical", async () => {
107
+ const input = await imageFile(640, 480, "photo.jpg", "image/jpeg");
108
+
109
+ const prepared = await prepareImageForVision(input);
110
+
111
+ expect(prepared).toBe(input);
112
+ });
113
+
114
+ it("keeps JPEG format when resizing a JPEG source", async () => {
115
+ const input = await imageFile(4000, 3000, "camera.jpg", "image/jpeg");
116
+ const expected = fitToVisionResolution(4000, 3000);
117
+
118
+ const prepared = await prepareImageForVision(input);
119
+
120
+ expect(prepared.type).toBe("image/jpeg");
121
+ expect(prepared.name).toBe("camera.jpg");
122
+ await expect(decodedSize(prepared)).resolves.toEqual(expected);
123
+ });
124
+
125
+ it("re-encodes a within-limits WebP to PNG so the Cursor harness can display it", async () => {
126
+ const input = await imageFile(800, 600, "clip.webp", "image/webp");
127
+
128
+ const prepared = await prepareImageForVision(input);
129
+
130
+ expect(prepared).not.toBe(input);
131
+ expect(prepared.type).toBe("image/png");
132
+ expect(prepared.name).toBe("clip.png");
133
+ // Format normalization only — the dimensions stay untouched.
134
+ await expect(decodedSize(prepared)).resolves.toEqual({ width: 800, height: 600 });
135
+ });
136
+
137
+ it("keeps worst-case photographic content under the runner's inline byte cap", async () => {
138
+ // Evidence gate from the T05 plan. Pure noise is the least-compressible
139
+ // content an image can carry; at the fitted resolution a noise PNG
140
+ // encodes to ~3.4 MB — over the runner's per-image inline cap — which
141
+ // is exactly what the PNG-density JPEG fallback exists to catch.
142
+ // The cap constant mirrors MAX_VISION_IMAGE_BYTES in the runner's
143
+ // shared/attachment-vision.ts (a measurement bound in a test, never a
144
+ // production dependency).
145
+ const RUNNER_INLINE_IMAGE_CAP = 3 * 1024 * 1024;
146
+
147
+ const input = await imageFile(3000, 2000, "photo.png", "image/png", drawNoise);
148
+
149
+ const prepared = await prepareImageForVision(input);
150
+
151
+ expect(prepared.size).toBeLessThan(RUNNER_INLINE_IMAGE_CAP);
152
+ // Noise defeats PNG, so the ratio rule must have picked JPEG.
153
+ expect(prepared.type).toBe("image/jpeg");
154
+ expect(prepared.name).toBe("photo.jpg");
155
+ });
156
+
157
+ it("prefers PNG for UI-like content even though JPEG is available", async () => {
158
+ const input = await imageFile(3000, 2000, "dialog.png", "image/png", drawUiLike);
159
+
160
+ const prepared = await prepareImageForVision(input);
161
+
162
+ // Flat fills and text compress better in PNG than JPEG-at-half-size,
163
+ // and PNG keeps UI text crisp — the ratio rule must keep PNG here.
164
+ expect(prepared.type).toBe("image/png");
165
+ });
166
+ });
@@ -0,0 +1,32 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { prepareImageForVision } from "../prepare-image.js";
3
+
4
+ /**
5
+ * happy-dom half of the prepare-image coverage: the guard rails that make
6
+ * the function safe to call from any environment. The actual pixel work
7
+ * (decode, resize, encode) runs in real Chromium — see
8
+ * prepare-image.browser.test.ts.
9
+ */
10
+ describe("prepareImageForVision — environment guard rails", () => {
11
+ it("returns a non-image file untouched (same instance)", async () => {
12
+ const pdf = new File([new Uint8Array([0x25, 0x50, 0x44, 0x46])], "brief.pdf", {
13
+ type: "application/pdf",
14
+ });
15
+
16
+ await expect(prepareImageForVision(pdf)).resolves.toBe(pdf);
17
+ });
18
+
19
+ it("returns an image untouched when the canvas pipeline is unavailable", async () => {
20
+ // happy-dom has no createImageBitmap — the exact situation of an old
21
+ // browser or a privacy extension that blocks canvas. The paste must
22
+ // still work end to end with the original bytes; it merely degrades
23
+ // at the runner with the standard disclosure.
24
+ expect(typeof createImageBitmap).toBe("undefined");
25
+
26
+ const png = new File([new Uint8Array([0x89, 0x50, 0x4e, 0x47])], "shot.png", {
27
+ type: "image/png",
28
+ });
29
+
30
+ await expect(prepareImageForVision(png)).resolves.toBe(png);
31
+ });
32
+ });