import type { User, Session } from 'better-auth/types'; /** * Central application state composable * Manages navigation context and critical app-level state * This is the single source of truth for "what am I viewing" */ export const useAppState = () => { // Current navigation context const activeAgentId = useState('appState:activeAgentId', () => null); const activeTopicId = useState('appState:activeTopicId', () => null); // User data const user = useState('appState:user', () => null); const session = useState('appState:session', () => null); // Loading states const isInitializing = useState('appState:isInitializing', () => true); const generationInProgress = useState<{ generationId: string } | null>('appState:generationInProgress', () => null); /** * Set the active agent and clear the topic */ const setActiveAgent = (agentId: string | null | undefined) => { activeAgentId.value = agentId || null; // Clear topic when switching agents activeTopicId.value = null; }; /** * Set the active topic */ const setActiveTopic = (topicId: string | null | undefined) => { activeTopicId.value = topicId || null; }; /** * Set user session data */ const setUser = (userData: User | null) => { user.value = userData; }; /** * Set session */ const setSession = (sessionData: Session | null) => { session.value = sessionData; }; /** * Mark initialization complete */ const markInitialized = () => { isInitializing.value = false; }; /** * Start a generation */ const startGeneration = (generationId: string) => { generationInProgress.value = { generationId }; }; /** * End current generation */ const endGeneration = () => { generationInProgress.value = null; }; return { // State activeAgentId, activeTopicId, user, session, isInitializing, generationInProgress, // Actions setActiveAgent, setActiveTopic, setUser, setSession, markInitialized, startGeneration, endGeneration }; };