/** * @license * SPDX-License-Identifier: Apache-2.0 */ // FIX: Added missing React imports. import React, { useEffect, useMemo } from 'react'; import { useSettings, useUI, useLogStore, useTools, personas } from '@/lib/state'; import c from 'classnames'; import { AVAILABLE_VOICES_FULL, AVAILABLE_VOICES_LIMITED, MODELS_WITH_LIMITED_VOICES, DEFAULT_VOICE, } from '@/lib/constants'; import { useLiveAPIContext } from '@/contexts/LiveAPIContext'; const AVAILABLE_MODELS = [ 'gemini-2.5-flash-native-audio-preview-09-2025', 'gemini-2.5-flash-native-audio-latest', 'gemini-live-2.5-flash-preview', 'gemini-2.0-flash-live-001' ]; export default function Sidebar() { const { isSidebarOpen, toggleSidebar, showSystemMessages, toggleShowSystemMessages, } = useUI(); const { systemPrompt, model, voice, setSystemPrompt, setModel, setVoice, isEasterEggMode, activePersona, setPersona, } = useSettings(); const { connected } = useLiveAPIContext(); const availableVoices = useMemo(() => { return MODELS_WITH_LIMITED_VOICES.includes(model) ? AVAILABLE_VOICES_LIMITED : AVAILABLE_VOICES_FULL; }, [model]); useEffect(() => { if (!availableVoices.some(v => v.name === voice)) { setVoice(DEFAULT_VOICE); } }, [availableVoices, voice, setVoice]); const handleExportLogs = () => { const { systemPrompt, model } = useSettings.getState(); const { tools } = useTools.getState(); const { turns } = useLogStore.getState(); const logData = { configuration: { model, systemPrompt, }, tools, conversation: turns.map(turn => ({ ...turn, // Convert Date object to ISO string for JSON serialization timestamp: turn.timestamp.toISOString(), })), }; const jsonString = JSON.stringify(logData, null, 2); const blob = new Blob([jsonString], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); a.href = url; a.download = `live-api-logs-${timestamp}.json`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; return ( <>