
    љi)1                         S SK JrJr  S SKJr  S SKJrJrJr  S SKrS SK	r	S SK
r
S SKJrJrJr  \	R                  " \5      r\ " S S5      5       r " S S	\5      r " S
 S\5      rg)    )ABCabstractmethod)	dataclass)datetimetimezone	timedeltaN)OptionalDictAnyc                       \ rS rSr% \\S'   Sr\\   \S'   Sr\\	   \S'   Sr
\\   \S'   Sr\\\\4      \S'   \	R                  R                  \R"                  S9r\	\S	'   Sr\\	   \S
'   Sr\\	   \S'   Srg)SessionState   
session_idNactive_transaction_idprevious_request_timestampprevious_request_textprevious_request_filestzinfotimestamp_inserted_at
updated_at
created_at )__name__
__module____qualname____firstlineno__str__annotations__r   r	   r   r   r   r   r
   r   minreplacer   utcr   r   r   __static_attributes__r       a/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/session_state_manager/base.pyr   r      s    O+/8C=/59 29+/8C=/7;HT#s(^4;&.ll&:&:(,,&:&O8O%)J")%)J")r$   r   c                       \ rS rSr\S\S\4S j5       r\S\S\S\SS4S j5       r	\S\S	\S
\
\   S\
\\\4      SS4
S j5       r\S\SS4S j5       r\SS\SS4S jj5       rSrg)SessionStateManager   r   returnc                    #    g 7fNr   selfr   s     r%   get_session_state%SessionStateManager.get_session_state           transaction_idr   Nc                    #    g 7fr+   r   )r-   r   r2   r   s       r%   update_transaction&SessionStateManager.update_transaction   r0   r1   	timestamptextfilesc                    #    g 7fr+   r   )r-   r   r6   r7   r8   s        r%   update_previous_request+SessionStateManager.update_previous_request!   s
      	r1   c                    #    g 7fr+   r   r,   s     r%   clear_session!SessionStateManager.clear_session+   r0   r1   timeout_secondsc                    #    g 7fr+   r   )r-   r?   s     r%   cleanup_old_sessions(SessionStateManager.cleanup_old_sessions/   r0   r1   r     )r   r   r   r   r   r   r   r.   r   r4   r	   r
   r   r:   r=   intrA   r#   r   r$   r%   r'   r'      s    # ,   3  dl qu     sm	
 S#X' 
  c d   #   r$   r'   c                       \ rS rSrSS\S\S\4S jjrS rS\S\4S	 jr	S\S
\S\
SS4S jrS\S\
S\\   S\\\\4      SS4
S jrS\SS4S jrSS\SS4S jjrSrg)SQLiteSessionStateManager4   db_pathsession_timeout	cache_ttlc                 V    Xl         X l        X0l        0 U l        U R	                  5         g r+   )rI   rJ   rK   cacheinit_db)r-   rI   rJ   rK   s       r%   __init__"SQLiteSessionStateManager.__init__5   s"    .".0
r$   c                    [         R                  " U R                  5      n U   UR                  S5        UR                  S5       Vs1 s H  o"S   iM	     nnSU;  a  UR                  S5        UR                  S5        S S S 5        UR                  5         g s  snf ! , (       d  f       N$= f! [         a  n[
        R                  SU 35        e S nAff = f! UR                  5         f = f)Na*  
                    CREATE TABLE IF NOT EXISTS session_states (
                        session_id TEXT PRIMARY KEY,
                        active_transaction_id TEXT,
                        previous_request_timestamp TIMESTAMP,
                        previous_request_text TEXT,
                        previous_request_files JSON,
                        timestamp_inserted_at TIMESTAMP NOT NULL,
                        updated_at TIMESTAMP NOT NULL,
                        created_at TIMESTAMP NOT NULL
                    )
                    z!PRAGMA table_info(session_states)   r   zuALTER TABLE session_states ADD COLUMN timestamp_inserted_at TIMESTAMP NOT NULL DEFAULT '0001-01-01 00:00:00+00:00:00'z
                    CREATE INDEX IF NOT EXISTS idx_session_states_updated_at
                    ON session_states (updated_at)
                    zError at init_db: )sqlite3connectrI   execute	Exceptionloggererrorclose)r-   connrowcolumnsexs        r%   rN   !SQLiteSessionStateManager.init_db<   s    t||,!	  .2\\:]-^_-^cq6-^_*'9LL  "Y  Z+ @ JJL `# 8  	LL-bT23	 JJLsX   B0 %B	B*BB0 B
B-)B0 ,C -B0 0
C:CCC C-r   r)   c                   #    U(       d  [        S5      eXR                  ;   ap  U R                  U   nUR                  (       aP  [        R                  " [
        R                  5      UR                  -
  R                  5       nX0R                  :  a  U$ [        R                  " U R                  5      n UR                  5       nUR                  SU45        UR                  5       nU(       a  [        US   US   US   (       a  [        R                   " US   5      OS US   US   (       a  ["        R$                  " US   5      OS [        R                   " US   5      [        R                   " US	   5      [        R                   " US
   5      S9nXpR                  U'   UUR'                  5         $ [        R                  " [
        R                  5      n[        UUUS9n	U   UR                  SUS S S S U	R(                  X45        S S S 5        XR                  U'   U	UR'                  5         $ ! , (       d  f       N.= f! [*         a  n
[,        R/                  SU
 35        e S n
A
ff = f! UR'                  5         f = f7f)Nz>Error at get_session_state: session_id cannot be None or emptya$  
                SELECT session_id, active_transaction_id, previous_request_timestamp,
                       previous_request_text, previous_request_files, timestamp_inserted_at, updated_at, created_at
                FROM session_states
                WHERE session_id = ?
                r   rR                     )r   r   r   r   r   r   r   r   )r   r   r   aE  
                    INSERT INTO session_states (session_id, active_transaction_id, previous_request_timestamp,
                                               previous_request_text, previous_request_files, timestamp_inserted_at, updated_at, created_at)
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?)
                    zError at get_session_state: )
ValueErrorrM   r   r   nowr   r"   total_secondsrK   rS   rT   rI   cursorrU   fetchoner   fromisoformatjsonloadsrY   r   rV   rW   rX   )r-   r   cached_state	cache_agerZ   ri   r[   statenow_utc	new_stater]   s              r%   r.   +SQLiteSessionStateManager.get_session_statea   s    ]^^ #::j1L&&%\\(,,7,:Q:QQ``b	~~-'' t||,7	[[]FNN  //#C$"1v*-a&QTUVQWx/E/Ec!f/M]a*-a&ADQ4::c!f+=T*2*@*@Q*H'55c!f='55c!f=	 */

:&: JJL5 ll8<<0G$%""I 
  tT49X9XZak  &/JJz" JJL%   	LL7t<=	 JJLs[   B2J5C-I "J31I $$H0I J0
H>:I 
I)I$$I))I, ,I>>Jr2   r   Nc           	        #    U(       d  [        S5      e[        R                  " U R                  5      n [        R
                  " [        R                  5      nU   UR                  SXX5U45        S S S 5        XR                  ;   a:  X R                  U   l
        X0R                  U   l        XPR                  U   l        O[        UUUUUS9U R                  U'    UR#                  5         g ! , (       d  f       N= f! [         a  n[        R!                  SU 35        e S nAff = f! UR#                  5         f = f7f)Nz?Error at update_transaction: session_id cannot be None or emptya  
                    INSERT INTO session_states (session_id, active_transaction_id, timestamp_inserted_at, updated_at, created_at)
                    VALUES (?, ?, ?, ?, ?)
                    ON CONFLICT(session_id) DO UPDATE SET
                        active_transaction_id = excluded.active_transaction_id,
                        timestamp_inserted_at = COALESCE(excluded.timestamp_inserted_at, session_states.timestamp_inserted_at),
                        updated_at = excluded.updated_at
                    )r   r   r   r   r   zError at update_transaction: )rf   rS   rT   rI   r   rg   r   r"   rU   rM   r   r   r   r   rV   rW   rX   rY   )r-   r   r2   r   rZ   rq   r]   s          r%   r4   ,SQLiteSessionStateManager.update_transaction   s    ^__t||,"	ll8<<0G  1FQXY
  ZZ'?M

:&<?T

:&<4;

:&1 *6)*8*?&&*

:& JJLA 8  	LL8=>	 JJLs_   3E &D  C/2AD  D+ D  D+ E /
C=9D   
D(
D##D((D+ +D==E r6   r7   r8   c                 @  #    U(       d  [        S5      e[        R                  " U R                  5      n [        R
                  " [        R                  5      nU(       a  [        R                  " USS9OS nU   UR                  SUS X#U[        R                  R                  [        R                  S9Xf45        S S S 5        XR                  ;   aM  X R                  U   l        X0R                  U   l        X@R                  U   l        X`R                  U   l        O[%        UUUUUUS9U R                  U'    UR-                  5         g ! , (       d  f       N= f! [&         a  n[(        R+                  SU 35        e S nAff = f! UR-                  5         f = f7f)NzDError at update_previous_request: session_id cannot be None or emptyT)ensure_asciia  
                    INSERT INTO session_states (
                        session_id, active_transaction_id, previous_request_timestamp, previous_request_text, 
                        previous_request_files, timestamp_inserted_at, updated_at, created_at
                    )
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?)
                    ON CONFLICT(session_id) DO UPDATE SET
                        previous_request_timestamp = excluded.previous_request_timestamp,
                        previous_request_text = excluded.previous_request_text,
                        previous_request_files = excluded.previous_request_files,
                        updated_at = excluded.updated_at
                    r   )r   r   r   r   r   r   z"Error at update_previous_request: )rf   rS   rT   rI   r   rg   r   r"   rl   dumpsrU   r    r!   rM   r   r   r   r   r   rV   rW   rX   rY   )	r-   r   r6   r7   r8   rZ   rq   
files_jsonr]   s	            r%   r:   1SQLiteSessionStateManager.update_previous_request   sR     cddt||,*	ll8<<0GAFE=DJ  y
HLLDXDX`h`l`lDXDmov  A $ ZZ'DM

:&A?C

:&<@E

:&=4;

:&1 *6)/8*.+0&&*

:& JJLM D  	LL=bTBC	 JJLsa   3FAE :AE<A#E F	  E ;F	 <F
EE 
F(FFF	 	FFc                   #    U(       d  [        S5      e[        R                  " U R                  5      n U   UR	                  SU45        S S S 5        XR
                  ;   a  U R
                  U	 UR                  5         g ! , (       d  f       N;= f! [         a  n[        R                  SU 35        e S nAff = f! UR                  5         f = f7f)Nz:Error at clear_session: session_id cannot be None or emptyz/DELETE FROM session_states WHERE session_id = ?zError at clear_session: )
rf   rS   rT   rI   rU   rM   rV   rW   rX   rY   )r-   r   rZ   r]   s       r%   r=   'SQLiteSessionStateManager.clear_session  s     YZZt||,	EM  ZZ'JJz* JJL   	LL3B489	 JJLsK   3CB B$B 0C
BB 
B:B55B::B= =CCr?   c                   #    [         R                  " U R                  5      n [        R                  " [
        R                  5      [        US9-
  nUR                  5       nUR                  SU45        UR                  5        Vs/ s H  oUS   PM	     nnU   UR                  SU45      nUR                  S:  a#  [        R                  SUR                   S35        S S S 5        U H!  nXpR                  ;   d  M  U R                  U	 M#      UR#                  5         g s  snf ! , (       d  f       NL= f! [         a  n[        R!                  SU 35        e S nAff = f! UR#                  5         f = f7f)N)secondsz:SELECT session_id FROM session_states WHERE updated_at < ?r   z/DELETE FROM session_states WHERE updated_at < ?zCleaned up z old sessionszError at cleanup_old_sessions: )rS   rT   rI   r   rg   r   r"   r   ri   rU   fetchallrowcountrW   inforM   rV   rX   rY   )	r-   r?   rZ   cutoff_timeri   r[   sessions_to_deleter   r]   s	            r%   rA   .SQLiteSessionStateManager.cleanup_old_sessions  s1    t||,	",,x||4y7YYK [[]FNNL 5;OO4E!F4ESa&4E!F E N ??Q&KK+foo->m LM  1
+

:. 1 JJL) "G   	LL:2$?@	 JJLsf   !E7A#D7 D!D7 AD& D7 >D7 E7!D7 &
D40D7 7
EEEE" "E44E7)rM   rK   rI   rJ   )zaiavatar.dbrD   <   rC   )r   r   r   r   r   floatrO   rN   r   r.   r   r4   r	   r
   r   r:   r=   rE   rA   r#   r   r$   r%   rG   rG   4   s     e _d #JE# E, EN'3 ' 'dl 'qu 'R55 5 sm	5
 S#X'5 
5nc d ,#   r$   rG   )abcr   r   dataclassesr   r   r   r   rl   loggingrS   typingr	   r
   r   	getLoggerr   rW   r   r'   rG   r   r$   r%   <module>r      sd    # ! 2 2    & &			8	$ * * *# 8I 3 Ir$   