import { describe, expect, it } from 'vitest'; import type { ChatMessage } from './contracts'; import { planMessageRegeneration } from './conversations'; const messages: ChatMessage[] = [ { id: 'u1', role: 'user', content: 'First', timestamp: '10:00' }, { id: 'a1', role: 'assistant', content: 'First answer', timestamp: '10:01' }, { id: 'u2', role: 'user', content: 'Second', timestamp: '10:02' }, { id: 'a2', role: 'assistant', content: 'Second answer', timestamp: '10:03' }, { id: 'u3', role: 'user', content: 'Third', timestamp: '10:04' }, { id: 'a3', role: 'assistant', content: 'Third answer', timestamp: '10:05' }, ]; describe('planMessageRegeneration', () => { it('keeps the selected user message and truncates everything after it', () => { expect(planMessageRegeneration(messages, 'u2')).toEqual({ baseMessages: messages.slice(0, 2), userMessage: messages[2], discardedMessageIds: ['a2', 'u3', 'a3'], }); }); it('replaces the selected assistant answer from its preceding user turn', () => { expect(planMessageRegeneration(messages, 'a2')).toEqual({ baseMessages: messages.slice(0, 2), userMessage: messages[2], discardedMessageIds: ['a2', 'u3', 'a3'], }); }); it('does not regenerate unknown or system-only turns', () => { expect(planMessageRegeneration(messages, 'missing')).toBeNull(); expect(planMessageRegeneration([ { id: 'system', role: 'system', content: 'Rules', timestamp: '10:00' }, ], 'system')).toBeNull(); }); });