import React, { useState, useRef, useEffect } from 'react'; import { Send, User, Bot, Sparkles, Loader2, Volume2, VolumeX, ChevronRight } from 'lucide-react'; import { speakText, getFinancialAdviceStream } from '../services/geminiService'; import { apiClient } from '../services/api'; interface Message { id: string; role: 'user' | 'assistant'; content: string; timestamp: string; isStreaming?: boolean; } const Advisor: React.FC = () => { const [messages, setMessages] = useState([]); const [input, setInput] = useState(''); const [loading, setLoading] = useState(false); const [voiceEnabled, setVoiceEnabled] = useState(true); const scrollRef = useRef(null); useEffect(() => { const initMemory = async () => { try { const history = await apiClient.chat.getHistory(); if (history && history.length > 0) { setMessages(history.map((h: any) => ({ ...h, id: h.id.toString() }))); } else { setMessages([{ id: '1', role: 'assistant', content: "Neural Core online. Standing by for institutional instructions.", timestamp: new Date().toISOString() }]); } } catch (err) { setMessages([{ id: '1', role: 'assistant', content: "Neural Core online. Safe mode registry active.", timestamp: new Date().toISOString() }]); } }; initMemory(); }, []); useEffect(() => { if (scrollRef.current) { scrollRef.current.scrollTop = scrollRef.current.scrollHeight; } }, [messages]); const handleSend = async (forcedInput?: string) => { const query = (forcedInput || input).trim(); if (!query || loading) return; const userMsgId = Date.now().toString(); setMessages(prev => [...prev, { id: userMsgId, role: 'user', content: query, timestamp: new Date().toISOString() }]); setInput(''); setLoading(true); const assistantMsgId = (Date.now() + 1).toString(); setMessages(prev => [...prev, { id: assistantMsgId, role: 'assistant', content: '', timestamp: new Date().toISOString(), isStreaming: true }]); try { const context = { system: "LUMINA_ADVISORY_NODE", mode: "Institutional_Treasury" }; const response = await getFinancialAdviceStream(query, context); const finalContent = response?.[0]?.text || "Signal interrupted. No data received from Gemini Node."; setMessages(prev => prev.map(m => m.id === assistantMsgId ? { ...m, content: finalContent, isStreaming: false } : m )); await apiClient.chat.saveMessage('user', query); await apiClient.chat.saveMessage('assistant', finalContent); if (voiceEnabled) speakText(finalContent); } catch (error) { console.error("Advisor Link Failure:", error); setMessages(prev => prev.map(m => m.id === assistantMsgId ? { ...m, content: "Neural link lost. Ensure process.env.API_KEY is properly configured and model quota is available.", isStreaming: false } : m )); } finally { setLoading(false); } }; return (

Nexus_Core

Protocol: Advisory

Command Presets

{["Analyze Liquidity Drift", "Stress-test Commercial Portfolio", "Model Inflation Spike impact"].map((text, i) => ( ))}
Quantum_Advisory_Node
{messages.map((m) => (
{m.role === 'user' ? : }
{m.content || (m.isStreaming ? (
Computing Alpha...
) : "Handshaking...")}
))}
{ e.preventDefault(); handleSend(); }} className="relative group max-w-5xl mx-auto flex gap-4" > setInput(e.target.value)} placeholder="Input treasury instructions for the Quantum Core..." className="flex-1 bg-black border border-zinc-800 focus:border-blue-500 rounded-[2rem] py-7 px-10 text-white text-base outline-none transition-all placeholder:text-zinc-800 font-bold" />
); }; export default Advisor;