feat: add markdown composer backend foundation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
David Kaya
2026-03-25 19:19:58 +01:00
co-authored by Copilot
parent a8c6ba94f5
commit d07bf30e81
16 changed files with 539 additions and 121 deletions
+26
View File
@@ -0,0 +1,26 @@
import { describe, expect, test } from 'bun:test';
import {
hasMeaningfulChatMessageContent,
normalizeChatMessageLineEndings,
prepareChatMessageContent,
} from '@shared/utils/chatMessage';
describe('chat message helpers', () => {
test('normalizes Windows line endings without trimming meaningful markdown', () => {
expect(
prepareChatMessageContent('```ts\r\n const answer = 42;\r\n```\r\n'),
).toBe('```ts\n const answer = 42;\n```\n');
});
test('treats whitespace-only input as empty', () => {
expect(hasMeaningfulChatMessageContent(' \r\n\t ')).toBe(false);
expect(prepareChatMessageContent(' \r\n\t ')).toBeUndefined();
});
test('normalizes mixed newline sequences consistently', () => {
expect(normalizeChatMessageLineEndings('line 1\r\nline 2\rline 3')).toBe(
'line 1\nline 2\nline 3',
);
});
});
+21
View File
@@ -0,0 +1,21 @@
import { describe, expect, test } from 'bun:test';
import { buildMarkdownExcerpt, extractPlainTextFromMarkdown } from '@shared/utils/markdownText';
describe('markdown text helpers', () => {
test('extracts readable text from common markdown syntax', () => {
expect(
extractPlainTextFromMarkdown('# Title\n\n**Bold** [Docs](https://example.com) and `code`.'),
).toBe('Title Bold Docs and code.');
});
test('turns fenced code blocks into readable excerpts', () => {
expect(buildMarkdownExcerpt('```ts\nconst answer = 42;\n```', 48)).toBe('const answer = 42;');
});
test('truncates after stripping markdown syntax', () => {
expect(buildMarkdownExcerpt('**Alpha** beta gamma delta epsilon zeta eta theta', 18)).toBe(
'Alpha beta gamma d…',
);
});
});
+17
View File
@@ -121,6 +121,23 @@ describe('session title helpers', () => {
]),
).toBe('Release readiness review');
});
test('builds auto titles from markdown-heavy first messages', () => {
const pattern = createPattern();
const session = createSession();
expect(
resolveSessionTitle(session, pattern, [
{
id: 'msg-1',
role: 'user',
authorName: 'You',
content: '```ts\nconst answer = 42;\n```',
createdAt: '2026-03-23T00:00:00.000Z',
},
]),
).toBe('const answer = 42;');
});
});
describe('session tooling helpers', () => {