# CONVERSATION MANAGER - core/conversation_manager.py # ConversationState separate what the system knows/has information about class ConversationState: def __init__(self): self.stage = "jung" self.history = [] self.initial_query = None self.current_agent = "jung" self.agent_histories = {} self.conversation_started = False # Flag to track the start of the conversation self.mode = "general" # default self.role = "client" # client or analyst # Memory element self.user_profile = { "themes": [], "patterns": [], "preferences": [] } # ----------------------------- # ADD USER INPUT (SINGLE SOURCE) # ----------------------------- def add_user_input(self, text): # Prevent duplicate consecutive entries if self.history and self.history[-1]["role"] == "client" and self.history[-1]["content"] == text: return self.history.append({"role": "client", "content": text}) agent = self.current_agent if agent not in self.agent_histories: self.agent_histories[agent] = [] self.agent_histories[agent].append({ "role": "client", "text": text }) # ----------------------------- # ADD AGENT OUTPUT # ----------------------------- def add_system_output(self, text): if self.history and self.history[-1]["role"] == "agent" and self.history[-1]["content"] == text: return self.history.append({"role": "agent", "content": text}) agent = self.current_agent if agent not in self.agent_histories: self.agent_histories[agent] = [] self.agent_histories[agent].append({ "role": "agent", "text": text }) # --------------------------------------------------------------- # REHYDRAION - CONVERT DICT/JSON BACK TO ConversationState Object # --------------------------------------------------------------- def from_dict(data): state = ConversationState() # Restore history state.history = data.get("history", []) # Restore agent logs safely state.agent_logs = data.get("agents", {}) or {} # Restore initial query state.initial_query = next( (m["content"] for m in state.history if m.get("role") == "client"), "" ) # Restore flags state.conversation_started = True state.current_agent = "jung" return state # ------------- # USER PROFILE # ------------- def update_user_profile(state, user_input, jung_output): text = (user_input + " " + jung_output).lower() THEMES = { "family": ["family", "wife", "husband", "parents"], "work": ["job", "career", "office"], "identity": ["purpose", "meaning", "self"], "dreams": ["dream", "nightmare"] } for theme, keywords in THEMES.items(): if any(word in text for word in keywords): if theme not in state.user_profile["themes"]: state.user_profile["themes"].append(theme)