* fix(app): keep timeline history and previews stable Treat persisted timeline replicas as display-only so authoritative pagination always comes from the daemon. Require renewed user intent between older-history pages unless the viewport genuinely remains at the history edge. Model assistant image acquisition as loading, loaded, or failed so recreating a preview URL cannot be rendered as an error. * fix(app): keep file image previews current * fix(app): stabilize history pagination edges * fix(app): recover transient timeline loads * fix(app): retain assistant image previews * Stabilize history pagination lifecycle * Stabilize history settlement and image previews * Retry file images after reconnect * Keep active previews and pagination requests alive * Replace image hook tests with typed ports * Integrate timeline hydration with submission authority * Harden pre-hydration timeline reconciliation * Make rewind E2E use real scroll intent * Preserve live timeline state through hydration * Keep mounted image attachments retained * Protect preview persistence and lifecycle hydration * Preserve idless live assistant continuations * Preserve timeline rows across delayed hydration * test(app): cover real assistant image files * Preserve assistant tool ordering during hydration
49 lines
1.7 KiB
TypeScript
49 lines
1.7 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
type AssistantImageRenderedDimensionsReader,
|
|
resolveAssistantImageLoadDimensions,
|
|
} from "./load-dimensions";
|
|
|
|
class MemoryRenderedDimensionsReader implements AssistantImageRenderedDimensionsReader {
|
|
constructor(private readonly dimensions: { width: number; height: number } | null) {}
|
|
|
|
read(): { width: number; height: number } | null {
|
|
return this.dimensions;
|
|
}
|
|
}
|
|
|
|
describe("assistant image load dimensions", () => {
|
|
it("prefers native source dimensions", () => {
|
|
const dimensions = resolveAssistantImageLoadDimensions({
|
|
source: { width: 640, height: 320 },
|
|
target: { naturalWidth: 800, naturalHeight: 400 },
|
|
renderedImage: null,
|
|
renderedDimensions: new MemoryRenderedDimensionsReader({ width: 900, height: 600 }),
|
|
});
|
|
|
|
expect(dimensions).toEqual({ width: 640, height: 320 });
|
|
});
|
|
|
|
it("uses browser event dimensions when native dimensions are absent", () => {
|
|
const dimensions = resolveAssistantImageLoadDimensions({
|
|
source: { width: 0, height: 0 },
|
|
target: { naturalWidth: 800, naturalHeight: 400 },
|
|
renderedImage: null,
|
|
renderedDimensions: new MemoryRenderedDimensionsReader({ width: 900, height: 600 }),
|
|
});
|
|
|
|
expect(dimensions).toEqual({ width: 800, height: 400 });
|
|
});
|
|
|
|
it("falls back to the rendered image adapter", () => {
|
|
const renderedImage = { id: "rendered-image" };
|
|
const dimensions = resolveAssistantImageLoadDimensions({
|
|
target: null,
|
|
renderedImage,
|
|
renderedDimensions: new MemoryRenderedDimensionsReader({ width: 900, height: 600 }),
|
|
});
|
|
|
|
expect(dimensions).toEqual({ width: 900, height: 600 });
|
|
});
|
|
});
|