(state, text)
| 63 | } |
| 64 | |
| 65 | function setStatus(state, text) { |
| 66 | statusLabel.textContent = text || state; |
| 67 | statusIcon.className = 'fa-solid fa-circle'; |
| 68 | connectionStatus.className = 'rounded-lg p-4 mb-4 flex items-center space-x-3'; |
| 69 | |
| 70 | switch (state) { |
| 71 | case 'disconnected': |
| 72 | statusIcon.classList.add('text-[var(--color-text-secondary)]'); |
| 73 | connectionStatus.classList.add('bg-[var(--color-bg-primary)]/50', 'border', 'border-[var(--color-border-subtle)]'); |
| 74 | statusLabel.classList.add('text-[var(--color-text-secondary)]'); |
| 75 | break; |
| 76 | case 'connecting': |
| 77 | statusIcon.className = 'fa-solid fa-spinner fa-spin text-[var(--color-primary)]'; |
| 78 | connectionStatus.classList.add('bg-[var(--color-primary-light)]', 'border', 'border-[var(--color-primary)]/30'); |
| 79 | statusLabel.className = 'font-medium text-[var(--color-primary)]'; |
| 80 | break; |
| 81 | case 'connected': |
| 82 | statusIcon.classList.add('text-[var(--color-success)]'); |
| 83 | connectionStatus.classList.add('bg-[var(--color-success)]/10', 'border', 'border-[var(--color-success)]/30'); |
| 84 | statusLabel.className = 'font-medium text-[var(--color-success)]'; |
| 85 | break; |
| 86 | case 'listening': |
| 87 | statusIcon.className = 'fa-solid fa-microphone text-[var(--color-success)]'; |
| 88 | connectionStatus.classList.add('bg-[var(--color-success)]/10', 'border', 'border-[var(--color-success)]/30'); |
| 89 | statusLabel.className = 'font-medium text-[var(--color-success)]'; |
| 90 | break; |
| 91 | case 'thinking': |
| 92 | statusIcon.className = 'fa-solid fa-brain fa-beat text-[var(--color-primary)]'; |
| 93 | connectionStatus.classList.add('bg-[var(--color-primary-light)]', 'border', 'border-[var(--color-primary)]/30'); |
| 94 | statusLabel.className = 'font-medium text-[var(--color-primary)]'; |
| 95 | break; |
| 96 | case 'speaking': |
| 97 | statusIcon.className = 'fa-solid fa-volume-high fa-beat-fade text-[var(--color-accent)]'; |
| 98 | connectionStatus.classList.add('bg-[var(--color-accent)]/10', 'border', 'border-[var(--color-accent)]/30'); |
| 99 | statusLabel.className = 'font-medium text-[var(--color-accent)]'; |
| 100 | break; |
| 101 | case 'error': |
| 102 | statusIcon.classList.add('text-[var(--color-error)]'); |
| 103 | connectionStatus.classList.add('bg-[var(--color-error-light)]', 'border', 'border-[var(--color-error)]/30'); |
| 104 | statusLabel.className = 'font-medium text-[var(--color-error)]'; |
| 105 | break; |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | // Currently streaming assistant message element (for incremental updates) |
| 110 | let streamingEntry = null; |
no test coverage detected