File size: 3,065 Bytes
d0878a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { applyAdvisorStreamEvent, advisorDisplayOrder } from './advisorStreamOrder';

describe('advisor stream display order', () => {
  const opts = () => {
    let n = 0;
    return {
      generateId: () => `id-${++n}`,
      now: () => new Date('2026-01-01T00:00:00Z'),
    };
  };

  test('first token becomes the front card; later starts append', () => {
    const o = opts();
    let messages = [{ id: 'u1', type: 'user', content: 'hi' }];
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_start',
      data: { persona_id: 'threat_modeler', persona_name: 'Threat' },
    }, o);
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_start',
      data: { persona_id: 'jerry_huaute', persona_name: 'Jerry' },
    }, o);
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_start',
      data: { persona_id: 'incident_responder', persona_name: 'IR' },
    }, o);

    expect(advisorDisplayOrder(messages)).toEqual([
      'threat_modeler',
      'jerry_huaute',
      'incident_responder',
    ]);
  });

  test('does not reorder when a later-ranked advisor finishes first', () => {
    const o = opts();
    let messages = [];
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_start',
      data: { persona_id: 'compliance_officer', persona_name: 'Compliance' },
    }, o);
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_delta',
      data: { persona_id: 'compliance_officer', delta: 'A' },
    }, o);
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_start',
      data: { persona_id: 'jerry_huaute', persona_name: 'Jerry' },
    }, o);
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_done',
      data: { persona_id: 'jerry_huaute', persona_name: 'Jerry', content: 'Jerry final' },
    }, o);
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_done',
      data: {
        persona_id: 'compliance_officer',
        persona_name: 'Compliance',
        content: 'Compliance final',
      },
    }, o);

    expect(advisorDisplayOrder(messages)).toEqual([
      'compliance_officer',
      'jerry_huaute',
    ]);
    expect(messages[0].content).toBe('Compliance final');
    expect(messages[1].content).toBe('Jerry final');
  });

  test('deltas append live text on the existing card', () => {
    const o = opts();
    let messages = [];
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_start',
      data: { persona_id: 'jerry_huaute', persona_name: 'Jerry' },
    }, o);
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_delta',
      data: { persona_id: 'jerry_huaute', delta: 'Hel' },
    }, o);
    messages = applyAdvisorStreamEvent(messages, {
      type: 'advisor_delta',
      data: { persona_id: 'jerry_huaute', delta: 'lo' },
    }, o);
    expect(messages[0].content).toBe('Hello');
    expect(messages[0].streaming).toBe(true);
  });
});