File size: 1,534 Bytes
6c62075
21ad36a
 
6c62075
21ad36a
 
 
 
 
 
 
 
6c62075
21ad36a
 
 
 
 
 
 
6c62075
 
21ad36a
 
 
 
 
 
6c62075
 
21ad36a
 
 
 
 
6c62075
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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();
  });
});