Spaces:
Running
Running
| import React, { useState, useEffect, useRef } from 'react'; | |
| import { Zap, Brain, Settings, Moon, ChevronRight, Send, Bot, Server, Sparkles, Circle, User, AlertCircle } from 'lucide-react'; | |
| import { createClient } from '@supabase/supabase-js'; | |
| import ChatInterface from './components/ChatInterface'; | |
| import VisualizationPanel from './components/VisualizationPanel'; | |
| import Sidebar from './components/Sidebar'; | |
| import Header from './components/Header'; | |
| import CognitionCocooner from './services/CognitionCocooner'; | |
| import AICore from './services/AICore'; | |
| import { CodetteResponse } from './components/CodetteComponents'; | |
| interface Message { | |
| role: string; | |
| content: string; | |
| timestamp: Date; | |
| metadata?: CodetteResponse; | |
| } | |
| // Initialize Supabase client | |
| const supabaseUrl = import.meta.env.VITE_SUPABASE_URL; | |
| const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY; | |
| if (!supabaseUrl || !supabaseKey) { | |
| throw new Error('Missing Supabase environment variables'); | |
| } | |
| const supabase = createClient(supabaseUrl, supabaseKey); | |
| const App: React.FC = () => { | |
| const [sidebarOpen, setSidebarOpen] = useState(true); | |
| const [darkMode, setDarkMode] = useState(false); | |
| const [messages, setMessages] = useState<Message[]>([]); | |
| const [aiState, setAiState] = useState({ | |
| quantumState: [0.3, 0.7, 0.5], | |
| chaosState: [0.2, 0.8, 0.4, 0.6], | |
| activePerspectives: ['newton', 'davinci', 'neural_network', 'philosophical'], | |
| ethicalScore: 0.93, | |
| processingPower: 0.72 | |
| }); | |
| const [cocoons, setCocoons] = useState<Array<{id: string, type: string, wrapped: any}>>([]); | |
| const [isProcessing, setIsProcessing] = useState(false); | |
| const [isAdmin, setIsAdmin] = useState(false); | |
| const [error, setError] = useState<string | null>(null); | |
| const [currentUserId, setCurrentUserId] = useState<string | null>(null); | |
| const aiCore = useRef<AICore | null>(null); | |
| const cocooner = useRef(new CognitionCocooner()); | |
| useEffect(() => { | |
| try { | |
| aiCore.current = new AICore(); | |
| setError(null); | |
| } catch (err: any) { | |
| console.error('Error initializing AI Core:', err); | |
| setError(err.message); | |
| } | |
| }, []); | |
| useEffect(() => { | |
| // Check if user is already authenticated | |
| const checkAuth = async () => { | |
| try { | |
| const { data: { session }, error } = await supabase.auth.getSession(); | |
| if (error) { | |
| console.error('Auth check error:', error.message); | |
| return; | |
| } | |
| if (session?.user) { | |
| setCurrentUserId(session.user.id); | |
| const { data: { role } } = await supabase.rpc('get_user_role'); | |
| setIsAdmin(role === 'admin'); | |
| } | |
| } catch (error: any) { | |
| console.error('Auth check error:', error.message); | |
| } | |
| }; | |
| checkAuth(); | |
| }, []); | |
| useEffect(() => { | |
| if (!error) { | |
| setMessages([ | |
| { | |
| role: 'assistant', | |
| content: 'Hello! I am Codette, an advanced AI assistant with recursive reasoning, self-learning capabilities, and multi-agent intelligence. How can I assist you today?', | |
| timestamp: new Date(), | |
| metadata: { | |
| text: 'Hello! I am Codette, an advanced AI assistant with recursive reasoning, self-learning capabilities, and multi-agent intelligence. How can I assist you today?', | |
| instabilityFlag: false, | |
| perspectivesUsed: ['greeting', 'introduction'], | |
| cocoonLog: ['Initializing Codette AI...', 'Quantum state stabilized'], | |
| forceRefresh: () => handleForceRefresh('Hello! I am Codette, an advanced AI assistant with recursive reasoning, self-learning capabilities, and multi-agent intelligence. How can I assist you today?') | |
| } | |
| } | |
| ]); | |
| } | |
| }, [error]); | |
| const handleForceRefresh = async (content: string) => { | |
| if (!aiCore.current) return; | |
| setIsProcessing(true); | |
| try { | |
| const response = await aiCore.current.processInput(content, true, currentUserId || undefined); | |
| const assistantMessage: Message = { | |
| role: 'assistant', | |
| content: response, | |
| timestamp: new Date(), | |
| metadata: { | |
| text: response, | |
| instabilityFlag: Math.random() > 0.8, | |
| perspectivesUsed: aiState.activePerspectives.slice(0, 3), | |
| cocoonLog: [`Regenerating response for: ${content}`, `Generated new response at ${new Date().toISOString()}`], | |
| forceRefresh: () => handleForceRefresh(content) | |
| } | |
| }; | |
| setMessages(prev => [...prev.slice(0, -1), assistantMessage]); | |
| } catch (error) { | |
| console.error('Error regenerating response:', error); | |
| } finally { | |
| setIsProcessing(false); | |
| } | |
| }; | |
| const toggleSidebar = () => { | |
| setSidebarOpen(!sidebarOpen); | |
| }; | |
| const toggleDarkMode = () => { | |
| setDarkMode(!darkMode); | |
| document.documentElement.classList.toggle('dark'); | |
| }; | |
| const sendMessage = async (content: string) => { | |
| if (!aiCore.current) { | |
| setError('AI Core is not initialized. Please check your configuration.'); | |
| return; | |
| } | |
| const userMessage: Message = { | |
| role: 'user', | |
| content, | |
| timestamp: new Date() | |
| }; | |
| setMessages(prev => [...prev, userMessage]); | |
| setIsProcessing(true); | |
| try { | |
| await new Promise(resolve => setTimeout(resolve, 1500)); | |
| const thought = { query: content, timestamp: new Date() }; | |
| const cocoonId = cocooner.current.wrap(thought); | |
| setCocoons(prev => [...prev, { | |
| id: cocoonId, | |
| type: 'prompt', | |
| wrapped: thought | |
| }]); | |
| const response = await aiCore.current.processInput(content, false, currentUserId || undefined); | |
| setAiState(prev => ({ | |
| ...prev, | |
| quantumState: [Math.random(), Math.random(), Math.random()].map(v => v.toFixed(2)).map(Number), | |
| chaosState: [Math.random(), Math.random(), Math.random(), Math.random()].map(v => v.toFixed(2)).map(Number), | |
| ethicalScore: Number((prev.ethicalScore + Math.random() * 0.1 - 0.05).toFixed(2)), | |
| processingPower: Number((prev.processingPower + Math.random() * 0.1 - 0.05).toFixed(2)) | |
| })); | |
| const assistantMessage: Message = { | |
| role: 'assistant', | |
| content: response, | |
| timestamp: new Date(), | |
| metadata: { | |
| text: response, | |
| instabilityFlag: Math.random() > 0.8, | |
| perspectivesUsed: aiState.activePerspectives.slice(0, 3), | |
| cocoonLog: [`Processing query: ${content}`, `Generated response at ${new Date().toISOString()}`], | |
| forceRefresh: () => handleForceRefresh(content) | |
| } | |
| }; | |
| setMessages(prev => [...prev, assistantMessage]); | |
| } catch (error: any) { | |
| console.error('Error processing message:', error); | |
| setMessages(prev => [...prev, { | |
| role: 'system', | |
| content: 'An error occurred while processing your request. Please check your configuration and try again.', | |
| timestamp: new Date() | |
| }]); | |
| } finally { | |
| setIsProcessing(false); | |
| } | |
| }; | |
| if (error) { | |
| return ( | |
| <div className={`min-h-screen flex items-center justify-center p-4 ${darkMode ? 'dark bg-gray-900 text-white' : 'bg-gray-50 text-gray-900'}`}> | |
| <div className={`max-w-md w-full p-6 rounded-lg shadow-lg ${darkMode ? 'bg-gray-800' : 'bg-white'}`}> | |
| <div className="flex items-center justify-center mb-4"> | |
| <AlertCircle className="text-red-500" size={48} /> | |
| </div> | |
| <h1 className="text-xl font-bold text-center mb-4">Configuration Error</h1> | |
| <p className="text-center mb-6">{error}</p> | |
| <div className={`p-4 rounded-md ${darkMode ? 'bg-gray-700' : 'bg-gray-100'}`}> | |
| <p className="text-sm"> | |
| Please ensure you have: | |
| <ol className="list-decimal ml-5 mt-2 space-y-1"> | |
| <li>Created a .env file</li> | |
| <li>Added your OpenAI API key to the .env file</li> | |
| <li>Added your Supabase configuration</li> | |
| </ol> | |
| </p> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |
| return ( | |
| <div className={`flex flex-col h-screen transition-colors duration-300 ${darkMode ? 'dark bg-gray-900 text-white' : 'bg-gray-50 text-gray-900'}`}> | |
| <Header | |
| toggleSidebar={toggleSidebar} | |
| toggleDarkMode={toggleDarkMode} | |
| darkMode={darkMode} | |
| aiState={aiState} | |
| /> | |
| <div className="flex flex-1 overflow-hidden"> | |
| <Sidebar | |
| isOpen={sidebarOpen} | |
| cocoons={cocoons} | |
| aiState={aiState} | |
| darkMode={darkMode} | |
| supabase={supabase} | |
| isAdmin={isAdmin} | |
| setIsAdmin={setIsAdmin} | |
| /> | |
| <main className="flex-1 flex flex-col md:flex-row overflow-hidden"> | |
| <ChatInterface | |
| messages={messages} | |
| sendMessage={sendMessage} | |
| isProcessing={isProcessing} | |
| darkMode={darkMode} | |
| /> | |
| <VisualizationPanel | |
| aiState={aiState} | |
| darkMode={darkMode} | |
| /> | |
| </main> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default App; |