fix(markdown): preserve encoded image paths after rebase

Keep the shared renderer image normalization and file-read regression coverage that originally lived in the main integration merge.
This commit is contained in:
Mohamed Boudra
2026-10-15 15:33:33 +02:00
parent 307f0dee0d
commit f5fb20cc55
2 changed files with 60 additions and 8 deletions
@@ -1,4 +1,9 @@
import { describe, expect, it } from "vitest";
import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { prepareMarkdownSource } from "./source";
import { resolveAssistantImageSource } from "@/utils/assistant-image-source";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { resolveMarkdownFileDirectory, resolveMarkdownPreviewImageSource } from "./image-source";
@@ -163,3 +168,52 @@ describe("resolveMarkdownPreviewImageSource", () => {
).toBe("C:/Users/test/repo/images/hero.png");
});
});
describe("local assistant Markdown images", () => {
let workspaceRoot: string;
const imageBytes = Buffer.from(
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==",
"base64",
);
beforeEach(async () => {
workspaceRoot = await mkdtemp(path.join(os.tmpdir(), "assistant-markdown-image-"));
await mkdir(path.join(workspaceRoot, "My Apps", "Мои"), { recursive: true });
await writeFile(path.join(workspaceRoot, "My Apps", "Мои", "test.png"), imageBytes);
await writeFile(path.join(workspaceRoot, "literal%20name.png"), imageBytes);
});
afterEach(async () => {
await rm(workspaceRoot, { recursive: true, force: true });
});
it.each([
"absolute angle",
"absolute encoded",
"relative angle",
"relative encoded",
"file URI",
"literal percent",
])("reads the actual image for the %s destination", async (form) => {
const absolute = path.join(workspaceRoot, "My Apps", "Мои", "test.png");
const destinations: Record<string, string> = {
"absolute angle": `<${absolute}>`,
"absolute encoded": encodeURI(absolute),
"relative angle": "<My Apps/Мои/test.png>",
"relative encoded": encodeURI("My Apps/Мои/test.png"),
"file URI": `file://${encodeURI(absolute)}`,
"literal percent": `${workspaceRoot}/literal%2520name.png`,
};
const prepared = prepareMarkdownSource(`![test](${destinations[form]})`);
expect(prepared.images).toHaveLength(1);
const source = resolveMarkdownPreviewImageSource({
source: prepared.images[0]!.source,
markdownPath: "",
workspaceRoot,
})!;
const target = resolveAssistantImageSource({ source, workspaceRoot });
expect(target?.kind).toBe("file_rpc");
if (target?.kind !== "file_rpc") throw new Error("Expected a local image read target");
await expect(readFile(path.resolve(target.cwd, target.path))).resolves.toEqual(imageBytes);
});
});
@@ -40,13 +40,11 @@ export function useMarkdownSource(text: string, context: MarkdownImageContext) {
);
const sources = [...new Set(prepared.images.map((image) => image.source))];
const acquisitions = sources.map((source) => {
const resolved = context.filePath
? resolveMarkdownPreviewImageSource({
source,
markdownPath: context.filePath,
workspaceRoot: context.workspaceRoot,
})
: source;
const resolved = resolveMarkdownPreviewImageSource({
source,
markdownPath: context.filePath ?? "",
workspaceRoot: context.workspaceRoot,
});
return createAssistantImageFileAcquisition({
port: context.client
? {