Skip to content

Commit ad11132

Browse files
authored
Merge branch 'main' into codex/support-gpt-5-6
2 parents 00d5c88 + 50d3abc commit ad11132

2 files changed

Lines changed: 41 additions & 1 deletion

File tree

components/chat/chat-session.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ const MessageBubble = memo(function MessageBubble({
116116
: 'bg-indigo-50 dark:bg-indigo-900/20 text-indigo-900 dark:text-indigo-200 border border-indigo-100/50 dark:border-indigo-800/50 rounded-tl-sm',
117117
)}
118118
>
119-
<span className="break-words">
119+
<span className="whitespace-pre-wrap break-words">
120120
{parts.map((part: MessagePart, i: number) => {
121121
if (part.type === 'text' || part.type === 'step-start') {
122122
const text = part.type === 'text' ? part.text : '';
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { createElement } from 'react';
2+
import { renderToStaticMarkup } from 'react-dom/server';
3+
import { describe, expect, it, vi } from 'vitest';
4+
import { ChatSessionComponent } from '@/components/chat/chat-session';
5+
import type { ChatSession } from '@/lib/types/chat';
6+
7+
vi.mock('@/lib/hooks/use-i18n', () => ({
8+
useI18n: () => ({ t: (key: string) => key }),
9+
}));
10+
11+
describe('ChatSessionComponent markup contract', () => {
12+
it('preserves newlines in the shared message text wrapper', () => {
13+
const session: ChatSession = {
14+
id: 'session-1',
15+
type: 'qa',
16+
title: 'Q&A',
17+
status: 'active',
18+
messages: [
19+
{
20+
id: 'message-1',
21+
role: 'user',
22+
parts: [{ type: 'text', text: 'first line\nsecond line' }],
23+
metadata: { originalRole: 'user', senderName: 'You' },
24+
},
25+
],
26+
config: { agentIds: ['default-1'] },
27+
toolCalls: [],
28+
pendingToolCalls: [],
29+
createdAt: 1,
30+
updatedAt: 1,
31+
};
32+
33+
const html = renderToStaticMarkup(
34+
createElement(ChatSessionComponent, { session, isActive: false }),
35+
);
36+
37+
expect(html).toContain('class="whitespace-pre-wrap break-words"');
38+
expect(html).toContain('first line\nsecond line');
39+
});
40+
});

0 commit comments

Comments
 (0)