55import os
66import shutil
77import tempfile
8- from dataclasses import asdict
98from typing import Any , Optional , cast
109
1110from ..types .exceptions import SessionException
@@ -57,22 +56,18 @@ def _get_agent_path(self, session_id: str, agent_id: str) -> str:
5756 session_path = self ._get_session_path (session_id )
5857 return os .path .join (session_path , "agents" , f"{ AGENT_PREFIX } { agent_id } " )
5958
60- def _get_message_path (self , session_id : str , agent_id : str , message_id : str , timestamp : str ) -> str :
59+ def _get_message_path (self , session_id : str , agent_id : str , message_id : int ) -> str :
6160 """Get message file path.
6261
6362 Args:
6463 session_id: ID of the session
6564 agent_id: ID of the agent
66- message_id: ID of the message
67- timestamp: ISO format timestamp to include in filename for sorting
65+ message_id: Index of the message
6866 Returns:
6967 The filename for the message
7068 """
7169 agent_path = self ._get_agent_path (session_id , agent_id )
72- # Use timestamp for sortable filenames
73- # Replace colons and periods in ISO format with underscores for filesystem compatibility
74- filename_timestamp = timestamp .replace (":" , "_" ).replace ("." , "_" )
75- return os .path .join (agent_path , "messages" , f"{ MESSAGE_PREFIX } { filename_timestamp } _{ message_id } .json" )
70+ return os .path .join (agent_path , "messages" , f"{ MESSAGE_PREFIX } { message_id } .json" )
7671
7772 def _read_file (self , path : str ) -> dict [str , Any ]:
7873 """Read JSON file."""
@@ -100,7 +95,7 @@ def create_session(self, session: Session) -> Session:
10095
10196 # Write session file
10297 session_file = os .path .join (session_dir , "session.json" )
103- session_dict = asdict ( session )
98+ session_dict = session . to_dict ( )
10499 self ._write_file (session_file , session_dict )
105100
106101 return session
@@ -123,7 +118,7 @@ def create_agent(self, session_id: str, session_agent: SessionAgent) -> None:
123118 os .makedirs (os .path .join (agent_dir , "messages" ), exist_ok = True )
124119
125120 agent_file = os .path .join (agent_dir , "agent.json" )
126- session_data = asdict ( session_agent )
121+ session_data = session_agent . to_dict ( )
127122 self ._write_file (agent_file , session_data )
128123
129124 def delete_session (self , session_id : str ) -> None :
@@ -152,34 +147,25 @@ def update_agent(self, session_id: str, session_agent: SessionAgent) -> None:
152147
153148 session_agent .created_at = previous_agent .created_at
154149 agent_file = os .path .join (self ._get_agent_path (session_id , agent_id ), "agent.json" )
155- self ._write_file (agent_file , asdict ( session_agent ))
150+ self ._write_file (agent_file , session_agent . to_dict ( ))
156151
157152 def create_message (self , session_id : str , agent_id : str , session_message : SessionMessage ) -> None :
158153 """Create a new message for the agent."""
159154 message_file = self ._get_message_path (
160155 session_id ,
161156 agent_id ,
162157 session_message .message_id ,
163- session_message .created_at ,
164158 )
165- session_dict = asdict ( session_message )
159+ session_dict = session_message . to_dict ( )
166160 self ._write_file (message_file , session_dict )
167161
168- def read_message (self , session_id : str , agent_id : str , message_id : str ) -> Optional [SessionMessage ]:
162+ def read_message (self , session_id : str , agent_id : str , message_id : int ) -> Optional [SessionMessage ]:
169163 """Read message data."""
170- # Get the messages directory
171- messages_dir = os .path .join (self ._get_agent_path (session_id , agent_id ), "messages" )
172- if not os .path .exists (messages_dir ):
164+ message_path = self ._get_message_path (session_id , agent_id , message_id )
165+ if not os .path .exists (message_path ):
173166 return None
174-
175- # List files in messages directory, and check if the filename ends with the message id
176- for filename in os .listdir (messages_dir ):
177- if filename .endswith (f"{ message_id } .json" ):
178- file_path = os .path .join (messages_dir , filename )
179- message_data = self ._read_file (file_path )
180- return SessionMessage .from_dict (message_data )
181-
182- return None
167+ message_data = self ._read_file (message_path )
168+ return SessionMessage .from_dict (message_data )
183169
184170 def update_message (self , session_id : str , agent_id : str , session_message : SessionMessage ) -> None :
185171 """Update message data."""
@@ -190,8 +176,8 @@ def update_message(self, session_id: str, agent_id: str, session_message: Sessio
190176
191177 # Preserve the original created_at timestamp
192178 session_message .created_at = previous_message .created_at
193- message_file = self ._get_message_path (session_id , agent_id , message_id , session_message . created_at )
194- self ._write_file (message_file , asdict ( session_message ))
179+ message_file = self ._get_message_path (session_id , agent_id , message_id )
180+ self ._write_file (message_file , session_message . to_dict ( ))
195181
196182 def list_messages (
197183 self , session_id : str , agent_id : str , limit : Optional [int ] = None , offset : int = 0
@@ -201,14 +187,16 @@ def list_messages(
201187 if not os .path .exists (messages_dir ):
202188 raise SessionException (f"Messages directory missing from agent: { agent_id } in session { session_id } " )
203189
204- # Read all message files
205- message_files : list [str ] = []
190+ # Read all message files, and record the index
191+ message_index_files : list [tuple [ int , str ] ] = []
206192 for filename in os .listdir (messages_dir ):
207193 if filename .startswith (MESSAGE_PREFIX ) and filename .endswith (".json" ):
208- message_files .append (filename )
194+ # Extract index from message_<index>.json format
195+ index = int (filename [len (MESSAGE_PREFIX ) : - 5 ]) # Remove prefix and .json suffix
196+ message_index_files .append ((index , filename ))
209197
210- # Sort filenames - the timestamp in the file's name will sort chronologically
211- message_files . sort ()
198+ # Sort by index and extract just the filenames
199+ message_files = [ f for _ , f in sorted ( message_index_files )]
212200
213201 # Apply pagination to filenames
214202 if limit is not None :
0 commit comments