SentinelAI / utils /session_manager.py
bhuvanpatil24's picture
Dockerized deployment
13ab844
"""
Session state management for Streamlit
Handles secure session initialization and cleanup
"""
import streamlit as st
from datetime import datetime
from typing import Optional, Dict, Any
class SessionManager:
"""Manage Streamlit session state"""
@staticmethod
def initialize():
"""Initialize session state with default values"""
# Authentication state
if "logged_in" not in st.session_state:
st.session_state.logged_in = False
if "user_info" not in st.session_state:
st.session_state.user_info = None
if "login_time" not in st.session_state:
st.session_state.login_time = None
# Chat state
if "messages" not in st.session_state:
st.session_state.messages = []
if "current_query" not in st.session_state:
st.session_state.current_query = ""
# UI state
if "show_sources" not in st.session_state:
st.session_state.show_sources = True
if "show_confidence" not in st.session_state:
st.session_state.show_confidence = True
if "sidebar_expanded" not in st.session_state:
st.session_state.sidebar_expanded = True
# Settings
if "top_k" not in st.session_state:
st.session_state.top_k = 3
if "max_tokens" not in st.session_state:
st.session_state.max_tokens = 256
# Admin state (if admin user)
if "admin_view" not in st.session_state:
st.session_state.admin_view = None # None means chat view
if "selected_user" not in st.session_state:
st.session_state.selected_user = None
@staticmethod
def login(user_info: Dict[str, Any]):
"""Set logged in state"""
st.session_state.logged_in = True
st.session_state.user_info = user_info
st.session_state.login_time = datetime.now()
st.session_state.messages = [] # Clear previous chat
st.session_state.admin_view = None # Reset to chat view
@staticmethod
def logout():
"""Clear session state on logout"""
# Keep API client instance
api_client = st.session_state.get("api_client")
# Clear all session state
for key in list(st.session_state.keys()):
if key != "api_client":
del st.session_state[key]
# Reinitialize
SessionManager.initialize()
# Restore API client
if api_client:
st.session_state.api_client = api_client
@staticmethod
def add_message(role: str, content: str, **kwargs):
"""Add message to chat history"""
message = {
"role": role,
"content": content,
"timestamp": datetime.now(),
**kwargs
}
st.session_state.messages.append(message)
@staticmethod
def clear_chat():
"""Clear chat history"""
st.session_state.messages = []
@staticmethod
def get_user_role() -> Optional[str]:
"""Get current user's role"""
if st.session_state.user_info:
return st.session_state.user_info.get("role")
return None
@staticmethod
def is_admin() -> bool:
"""Check if current user is admin"""
role = SessionManager.get_user_role()
if role:
return role.lower() == "admin"
return False
@staticmethod
def get_session_duration() -> Optional[int]:
"""Get session duration in seconds"""
if st.session_state.login_time:
delta = datetime.now() - st.session_state.login_time
return int(delta.total_seconds())
return None
@staticmethod
def update_settings(top_k: int = None, max_tokens: int = None):
"""Update search settings"""
if top_k is not None:
st.session_state.top_k = top_k
if max_tokens is not None:
st.session_state.max_tokens = max_tokens