Context
Child of #21 (multimodal support). This is the first slice: rendering only. Upload UI, WebSocket payload changes, and send-to-model wiring land in later issues.
The chat transcript should render a message's attachments array if present, showing images inline at a sensible max-width. For this issue, seed a test message with a fixture PNG to exercise the render path — no upload UI yet.
Acceptance criteria
Pointers
- Shared types (wherever
Message is defined)
packages/frontend/src/pages/ChatPage.tsx
packages/frontend/tests/chat.spec.ts
packages/frontend/tests/fixtures/ (new)
Out of scope (later issues)
- Paste/drop upload UI
- Sending images to the LLM
- Backend storage & DB schema
Difficulty
~2–3 hours.
Context
Child of #21 (multimodal support). This is the first slice: rendering only. Upload UI, WebSocket payload changes, and send-to-model wiring land in later issues.
The chat transcript should render a message's
attachmentsarray if present, showing images inline at a sensible max-width. For this issue, seed a test message with a fixture PNG to exercise the render path — no upload UI yet.Acceptance criteria
Messagetype extended with optionalattachments: Array<{ type: 'image', url: string, mimeType: string }>ChatPagerenders each image attachment under the message's text, max-width 400px, click to open full-size in a lightbox or new tabloading="lazy"packages/frontend/tests/fixtures/), verify it rendersPointers
Messageis defined)packages/frontend/src/pages/ChatPage.tsxpackages/frontend/tests/chat.spec.tspackages/frontend/tests/fixtures/(new)Out of scope (later issues)
Difficulty
~2–3 hours.