feat: show TTS delivery status in session live view
Made-with: Cursor
This commit is contained in:
parent
ba06b786cc
commit
b5e9599ef0
2 changed files with 40 additions and 1 deletions
|
|
@ -158,7 +158,7 @@ export interface AuthTestResults {
|
||||||
|
|
||||||
// SSE Event Types
|
// SSE Event Types
|
||||||
export interface TeamsbotSSEEvent {
|
export interface TeamsbotSSEEvent {
|
||||||
type: 'transcript' | 'botResponse' | 'analysis' | 'suggestedResponse' | 'statusChange' | 'error' | 'ping' | 'sessionState';
|
type: 'transcript' | 'botResponse' | 'analysis' | 'suggestedResponse' | 'statusChange' | 'error' | 'ping' | 'sessionState' | 'ttsDeliveryStatus';
|
||||||
data: any;
|
data: any;
|
||||||
timestamp?: string;
|
timestamp?: string;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,12 @@ export const TeamsbotSessionView: React.FC = () => {
|
||||||
const [screenshots, setScreenshots] = useState<ScreenshotInfo[]>([]);
|
const [screenshots, setScreenshots] = useState<ScreenshotInfo[]>([]);
|
||||||
const [screenshotsLoading, setScreenshotsLoading] = useState(false);
|
const [screenshotsLoading, setScreenshotsLoading] = useState(false);
|
||||||
const [screenshotsLoaded, setScreenshotsLoaded] = useState(false);
|
const [screenshotsLoaded, setScreenshotsLoaded] = useState(false);
|
||||||
|
const [ttsStatusEvents, setTtsStatusEvents] = useState<Array<{
|
||||||
|
status: string;
|
||||||
|
message?: string;
|
||||||
|
hasWebSocket?: boolean;
|
||||||
|
timestamp: string;
|
||||||
|
}>>([]);
|
||||||
|
|
||||||
const transcriptEndRef = useRef<HTMLDivElement>(null);
|
const transcriptEndRef = useRef<HTMLDivElement>(null);
|
||||||
const eventSourceRef = useRef<EventSource | null>(null);
|
const eventSourceRef = useRef<EventSource | null>(null);
|
||||||
|
|
@ -111,6 +117,20 @@ export const TeamsbotSessionView: React.FC = () => {
|
||||||
// Debug info - could show in UI
|
// Debug info - could show in UI
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'ttsDeliveryStatus': {
|
||||||
|
const payload = sseEvent.data || {};
|
||||||
|
setTtsStatusEvents((prev) => [
|
||||||
|
...prev.slice(-24),
|
||||||
|
{
|
||||||
|
status: payload.status || 'unknown',
|
||||||
|
message: payload.message,
|
||||||
|
hasWebSocket: payload.hasWebSocket,
|
||||||
|
timestamp: payload.timestamp || new Date().toISOString(),
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'suggestedResponse':
|
case 'suggestedResponse':
|
||||||
// Manual mode: show suggested response
|
// Manual mode: show suggested response
|
||||||
break;
|
break;
|
||||||
|
|
@ -303,6 +323,25 @@ export const TeamsbotSessionView: React.FC = () => {
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* TTS Delivery Debug */}
|
||||||
|
<div className={styles.summaryCard}>
|
||||||
|
<h4 className={styles.panelTitle}>TTS Delivery Status</h4>
|
||||||
|
{ttsStatusEvents.length === 0 ? (
|
||||||
|
<div className={styles.emptyState}>Noch keine TTS-Events.</div>
|
||||||
|
) : (
|
||||||
|
<div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>
|
||||||
|
{ttsStatusEvents.slice(-10).reverse().map((ev, idx) => (
|
||||||
|
<div key={`${ev.timestamp}-${idx}`} className={styles.responseMeta}>
|
||||||
|
<span>{_formatTime(ev.timestamp)}</span>
|
||||||
|
<span>{ev.status}</span>
|
||||||
|
<span>ws: {ev.hasWebSocket ? 'yes' : 'no'}</span>
|
||||||
|
<span>{ev.message || ''}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Debug Screenshots (SysAdmin only) */}
|
{/* Debug Screenshots (SysAdmin only) */}
|
||||||
{_isSysAdmin && (
|
{_isSysAdmin && (
|
||||||
<div className={styles.summaryCard}>
|
<div className={styles.summaryCard}>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue