File size: 2,396 Bytes
2b18d49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/**
 * TranscriptView - manages conversation bubble rendering
 */
export class TranscriptView {
    constructor(container) {
        this.container = container;
        this.lastSpeaker = null;
        this.lastBubble = null;
    }

    /**
     * Add or append a message to the transcript.
     * Same speaker as last message → append text to existing bubble.
     * New speaker → create a new bubble.
     */
    addMessage(speaker, text) {
        if (!text || text.trim().length === 0) return;

        if (this.lastSpeaker === speaker && this.lastBubble) {
            const textEl = this.lastBubble.querySelector('.message-text');
            if (textEl) textEl.textContent += text;
        } else {
            const timestamp = new Date().toLocaleTimeString();
            const icons = { user: '👤', agent: '🤖', system: '⚠️' };
            const icon = icons[speaker] || '•';

            const messageDiv = document.createElement('div');
            messageDiv.className = `message ${speaker}-message`;

            if (speaker === 'system') {
                messageDiv.innerHTML = `
                    <div class="message-bubble">
                        <div class="message-text">${text}</div>
                        <div class="timestamp">${timestamp}</div>
                    </div>`;
            } else if (speaker === 'user') {
                messageDiv.innerHTML = `
                    <div class="message-bubble">
                        <div class="message-text">${text}</div>
                        <div class="timestamp">${timestamp}</div>
                    </div>
                    <div class="message-avatar">${icon}</div>`;
            } else {
                messageDiv.innerHTML = `
                    <div class="message-avatar">${icon}</div>
                    <div class="message-bubble">
                        <div class="message-text">${text}</div>
                        <div class="timestamp">${timestamp}</div>
                    </div>`;
            }

            this.container.appendChild(messageDiv);
            this.lastSpeaker = speaker;
            this.lastBubble = messageDiv.querySelector('.message-bubble');
        }

        this.container.scrollTop = this.container.scrollHeight;
    }

    clear() {
        this.container.innerHTML = '';
        this.lastSpeaker = null;
        this.lastBubble = null;
    }
}