File size: 6,651 Bytes
d952de8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
"""
Session Helper Functions for Per-User Isolation
================================================

Helper functions that wrap the original app functions to provide
per-user session isolation using the UserSessionManager.

These wrappers intercept gr.Request to identify the user and 
manage their isolated session data.
"""

import gradio as gr
from typing import Any, Dict, List, Tuple
from user_session_manager import session_manager, get_username_from_request, SessionKeys
import logging

logger = logging.getLogger(__name__)


def get_user_simple_chat_history(request: gr.Request) -> List:
    """Get simple chat history for current user."""
    username = get_username_from_request(request)
    return session_manager.get_user_data(username, SessionKeys.SIMPLE_CHAT_HISTORY, default=[])


def set_user_simple_chat_history(request: gr.Request, history: List) -> None:
    """Set simple chat history for current user."""
    username = get_username_from_request(request)
    session_manager.set_user_data(username, SessionKeys.SIMPLE_CHAT_HISTORY, history)


def get_user_builder_chat_histories(request: gr.Request) -> Dict:
    """Get builder chat histories for current user."""
    username = get_username_from_request(request)
    return session_manager.get_user_data(username, SessionKeys.BUILDER_CHAT_HISTORIES, default={})


def set_user_builder_chat_histories(request: gr.Request, histories: Dict) -> None:
    """Set builder chat histories for current user."""
    username = get_username_from_request(request)
    session_manager.set_user_data(username, SessionKeys.BUILDER_CHAT_HISTORIES, histories)


def get_user_deployed_chat_histories(request: gr.Request) -> Dict:
    """Get deployed chat histories for current user."""
    username = get_username_from_request(request)
    return session_manager.get_user_data(username, SessionKeys.DEPLOYED_CHAT_HISTORIES, default={})


def set_user_deployed_chat_histories(request: gr.Request, histories: Dict) -> None:
    """Set deployed chat histories for current user."""
    username = get_username_from_request(request)
    session_manager.set_user_data(username, SessionKeys.DEPLOYED_CHAT_HISTORIES, histories)


def get_user_active_children(request: gr.Request) -> List:
    """Get active children for current user."""
    username = get_username_from_request(request)
    return session_manager.get_user_data(username, SessionKeys.ACTIVE_CHILDREN, default=[])


def set_user_active_children(request: gr.Request, children: List) -> None:
    """Set active children for current user."""
    username = get_username_from_request(request)
    session_manager.set_user_data(username, SessionKeys.ACTIVE_CHILDREN, children)


def get_user_patient_data(request: gr.Request) -> Dict:
    """Get patient data for current user."""
    username = get_username_from_request(request)
    return session_manager.get_user_data(username, SessionKeys.PATIENT_DATA, default={})


def set_user_patient_data(request: gr.Request, data: Dict) -> None:
    """Set patient data for current user."""
    username = get_username_from_request(request)
    session_manager.set_user_data(username, SessionKeys.PATIENT_DATA, data)


def get_user_prefill_flag(request: gr.Request) -> bool:
    """Get prefill flag for current user."""
    username = get_username_from_request(request)
    return session_manager.get_user_data(username, SessionKeys.PREFILL_FLAG, default=False)


def set_user_prefill_flag(request: gr.Request, flag: bool) -> None:
    """Set prefill flag for current user."""
    username = get_username_from_request(request)
    session_manager.set_user_data(username, SessionKeys.PREFILL_FLAG, flag)


def clear_user_session(request: gr.Request) -> None:
    """Clear all session data for current user."""
    username = get_username_from_request(request)
    session_manager.clear_user_data(username)
    logger.info(f"Cleared session for user: {username}")


def get_current_username(request: gr.Request) -> str:
    """Get the current authenticated username."""
    username = get_username_from_request(request)
    logger.debug(f"Current user: {username}")
    return username


# Wrapper functions that maintain compatibility with existing code
# while adding per-user session management

def wrap_simple_chat_response(original_func):
    """Wrap simple_chat_response to use per-user history."""
    def wrapper(user_message: str, request: gr.Request):
        # Get user-specific history
        history = get_user_simple_chat_history(request)
        
        # Call original function
        updated_history, empty_input = original_func(user_message, history)
        
        # Save updated history
        set_user_simple_chat_history(request, updated_history)
        
        return updated_history, empty_input
    
    return wrapper


def wrap_clear_simple_chat(original_func):
    """Wrap clear_simple_chat to use per-user history."""
    def wrapper(request: gr.Request):
        # Call original function with empty history
        empty_history, empty_input = original_func()
        
        # Save to user session
        set_user_simple_chat_history(request, empty_history)
        
        return empty_history, empty_input
    
    return wrapper


def wrap_chatpanel_handle(original_func):
    """Wrap chatpanel_handle to use per-user histories."""
    def wrapper(agent_name: str, user_text: str, request: gr.Request):
        # Get user-specific histories
        histories = get_user_builder_chat_histories(request)
        
        # Call original function
        updated_history, log, empty_input, updated_histories = original_func(
            agent_name, user_text, histories
        )
        
        # Save updated histories
        set_user_builder_chat_histories(request, updated_histories)
        
        return updated_history, log, empty_input, updated_histories
    
    return wrapper


def wrap_load_history(original_func):
    """Wrap load_history to use per-user histories."""
    def wrapper(agent_name: str, request: gr.Request):
        # Get user-specific histories
        histories = get_user_builder_chat_histories(request)
        
        # Call original function
        return original_func(agent_name, histories)
    
    return wrapper


def log_user_access(request: gr.Request, action: str):
    """Log user access for debugging/auditing."""
    username = get_username_from_request(request)
    logger.info(f"User '{username}' performed action: {action}")


if __name__ == "__main__":
    print("Session helpers module loaded successfully")
    print(f"Available session keys: {[k for k in dir(SessionKeys) if not k.startswith('_')]}")