
    i              	         d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZmZ ddlmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZ  ej        e          Zd
Z e            Zdddi g ddZdddddddddddgddZ dddddddidgddZ!dddddddg dd d!d"d#dd$d%gddZ"d&d'dd(dd)did(gddZ#d*d+ddd,ddd-ddg d.d/d!d0d1dd2d3gddZ$d4d5ddd6ddd7dd8g ddZ%d9d:dd;dd<did;gddZ&d=d>dd;dd?did;gddZ'd@dAdd;ddBdid;gddZ( G dC dD          Z) G dE dF          Z*dSdTdNZ+ G dO dPe          Z,dUdRZ-dS )VuR  RetainDB memory plugin — MemoryProvider interface.

Cross-session memory via RetainDB cloud API.

Features:
- Correct API routes for all operations
- Durable SQLite write-behind queue (crash-safe, async ingest)
- Semantic search + user profile retrieval
- Context query with deduplication overlay
- Dialectic synthesis (LLM-powered user understanding, prefetched each turn)
- Agent self-model (persona + instructions from SOUL.md, prefetched each turn)
- Shared file store tools (upload, list, read, ingest, delete)
- Explicit memory tools (profile, search, context, remember, forget)

Config (env vars or hermes config.yaml under retaindb:):
  RETAINDB_API_KEY     — API key (required)
  RETAINDB_BASE_URL    — API endpoint (default: https://api.retaindb.com)
  RETAINDB_PROJECT     — Project identifier (optional — defaults to "default")
    )annotationsN)datetimetimezone)Path)AnyDictList)quote)MemoryProvider)
tool_errorzhttps://api.retaindb.comretaindb_profileub   Get the user's stable profile — preferences, facts, and patterns recalled from long-term memory.object)type
propertiesrequired)namedescription
parametersretaindb_searchzUSemantic search across stored memories. Returns ranked results with relevance scores.stringzWhat to search for.)r   r   integerz"Max results (default: 8, max: 20).)querytop_kr   retaindb_contextuc   Synthesized context block — what matters most for the current task, pulled from long-term memory.zCurrent task or question.retaindb_rememberzFPersist an explicit fact, preference, or decision to long-term memory.zThe fact to remember.)factual
preferencegoalinstructioneventopinionzCategory (default: factual).)r   enumr   numberzImportance 0-1 (default: 0.7).)contentmemory_type
importancer$   retaindb_forgetzDelete a specific memory by ID.	memory_idzMemory ID to delete.retaindb_upload_filez_Upload a file to the shared RetainDB file store. Returns an rdb:// URI any agent can reference.zLocal file path to upload.z&Destination path, e.g. /reports/q1.pdf)USERPROJECTORGz Access scope (default: PROJECT).booleanz>Also extract memories from file after upload (default: false).)
local_pathremote_pathscopeingestr.   retaindb_list_filesz$List files in the shared file store.z(Path prefix to filter by, e.g. /reports/zMax results (default: 50).prefixlimitretaindb_read_filez6Read the text content of a stored file by its file ID.file_idz%File ID returned from upload or list.retaindb_ingest_filezUChunk, embed, and extract memories from a stored file. Makes its contents searchable.zFile ID to ingest.retaindb_delete_filezDelete a stored file.zFile ID to delete.c                      e Zd ZdCdZdDd	Zd
d
dddEdZdFdGdZdHdIdZdJdZdKdLd"Z	dMd$Z
dNdOd(ZdPdQd+ZdRd-ZdSdTd0ZdUd9ZdVdWd=ZdXd?ZdYd@ZdZd[dAZdXdBZd
S )\_Clientapi_keystrbase_urlprojectc                X    || _         t          j        dd|          | _        || _        d S )N/+$ )r<   resubr>   r?   )selfr<   r>   r?   s       E/home/piyush/.hermes/hermes-agent/plugins/memory/retaindb/__init__.py__init__z_Client.__init__   s)    vr844    pathreturndictc                    | j                             dd                                          }d| ddd}|                    d          r||d<   |S )NBearer rB   zapplication/jsonhermes-plugin)AuthorizationzContent-Typex-sdk-runtime)
/v1/memoryz/v1/contextz	X-API-Key)r<   replacestrip
startswith)rE   rI   tokenhs       rF   _headersz_Client._headers   sg    $$Y3399;;.u...,
 

 ??899 	#"AkNrH   N       @)params	json_bodytimeoutmethodr[   floatr   c          
         dd l }| j         | }|                    |                                |||                                dvr|nd |                     |          |          }	 |                                }	n# t          $ r
 |j        }	Y nw xY w|j        srd}
t          |	t                    r9t          |	                    d          p|	                    d          pd          }
t          d| d| d	|j         d
|
p|	           |	S )Nr   >   GETDELETE)rY   jsonheadersr[   rB   messageerrorz	RetainDB  z	 failed (z): )requestsr>   requestupperrW   ra   	Exceptiontextok
isinstancerK   r=   getRuntimeErrorstatus_code)rE   r\   rI   rY   rZ   r[   rf   urlresppayloadmsgs              rF   rg   z_Client.request   s=   &&&LLNNC$llnn4EEE4MM$''   
 
	 iikkGG 	  	  	 iGGG	 w 	jC'4(( P'++i00NGKK4H4HNBOOh6hhDhh4CShhX[Xf_fhhiiis   )A> >BB  user_id
session_idr   
max_tokensintc                J    |                      dd| j        |||d|d          S )NPOSTz/v1/context/queryT)r?   r   ru   rv   include_memoriesrw   rZ   rg   r?   )rE   ru   rv   r   rw   s        rF   query_contextz_Client.query_context   s?    ||F$7|$ $$D
 D
|   	rH      r   c                J    |                      dd| j        ||||dd          S )Nrz   z/v1/memory/searchT)r?   r   ru   rv   r   include_pendingr|   r}   )rE   ru   rv   r   r   s        rF   searchz_Client.search   s?    ||F$7|$#D
 D
|   	rH   c           	         	 |                      ddt          |d           | j        dd          S # t          $ r$ |                      dd| j        |d	d
          cY S w xY w)Nr_   /v1/memory/profile/rB   safetrue)r?   r   rY   /v1/memories200)r?   ru   r5   )rg   r
   r?   ri   )rE   ru   s     rF   get_profilez_Client.get_profile   s    	}<<'VU7QS=T=T=T'V'Vkokw  MS  `T  `T<  U  U  U 	} 	} 	}<<~$,cjuz>{>{<|||||	}s   14 +A"!A"r   ffffff?r$   r%   r&   c                    	 |                      dd| j        |||||ddd          S # t          $ r( |                      dd| j        |||||dd          cY S w xY w)	Nrz   rQ   sync)r?   r$   r%   ru   rv   r&   
write_mode      @rZ   r[   r   )r?   r$   r%   ru   rv   r&   )rg   r?   ri   )rE   ru   rv   r$   r%   r&   s         rF   
add_memoryz_Client.add_memory   s    		<<<GK"*JflA A        	 	 	<<<GK"*JC C        	s   %( /AAr(   c           	         	 |                      ddt          |d           d          S # t          $ r- |                      ddt          |d           d          cY S w xY w)Nr`   z/v1/memory/rB   r   r   r[   z/v1/memories/)rg   r
   ri   )rE   r(   s     rF   delete_memoryz_Client.delete_memory  s    	d<<*Sib8Q8Q8Q*S*S]`<aaa 	d 	d 	d<<*U%	PR:S:S:S*U*U_b<ccccc	ds   ), 4A#"A#      .@messageslistc           
     J    |                      dd| j        |||dd|          S )Nrz   z/v1/memory/ingest/sessionr   )r?   rv   ru   r   r   r   r}   )rE   ru   rv   r   r[   s        rF   ingest_sessionz_Client.ingest_session  sA    ||F$?|:' L
 L
     	rH   lowreasoning_levelc                l    |                      ddt          |d           d| j        ||dd          S )	Nrz   r   rB   r   z/ask)r?   r   r   rX   r   rg   r
   r?   )rE   ru   r   r   s       rF   ask_userz_Client.ask_user  sR    ||F$W%b:Q:Q:Q$W$W$W|ed
 d
    	rH   agent_idc                h    |                      ddt          |d           dd| j        id          S )	Nr_   /v1/memory/agent/rB   r   z/modelr?   g      @)rY   r[   r   )rE   r   s     rF   get_agent_modelz_Client.get_agent_model  sM    ||E#WuXB7O7O7O#W#W#Wajlplx`y  DG|  H  H  	HrH   soul_mdsourcec                l    |                      ddt          |d           d| j        ||dd          S )	Nrz   r   rB   r   z/seed)r?   r$   r   g      4@r   r   )rE   r   r$   r   s       rF   seed_agent_identityz_Client.seed_agent_identity  sR    ||F$WhR8P8P8P$W$W$W|6d
 d
    	rH   databytesfilenamer/   	mime_typer0   
project_id
str | Nonec                   dd l }dd l}| j         d}	| j                            dd                                          }
d|
 dd}||                                d}|r||d<   |                    |	d	||                    |          |fi||d
          }|	                                 |
                                S )Nr   	/v1/filesrM   rB   rN   rO   rP   )rI   r0   r   file   )filesr   rb   r[   )iorf   r>   r<   rR   rS   rh   postBytesIOraise_for_statusra   )rE   r   r   r/   r   r0   r   r   rf   rp   rU   rb   fieldsrq   s                 rF   upload_filez_Client.upload_file  s    			)))$$Y3399;;$5e$5$5XX%>> 	.#-F< }}S(BJJt<L<Li1X(Y`fpw  BD}  E  Eyy{{rH   2   r4   r5   c                H    d|i}|r||d<   |                      dd|          S )Nr5   r4   r_   r   r   )rg   )rE   r4   r5   rY   s       rF   
list_filesz_Client.list_files)  s6    ' 	&%F8||E;v|>>>rH   r7   c                R    |                      ddt          |d                     S )Nr_   
/v1/files/rB   r   rg   r
   rE   r7   s     rF   get_filez_Client.get_file/  s,    ||E#IgB0G0G0G#I#IJJJrH   c                   dd l }| j                            dd                                          }| j         dt          |d           d}|                    |d| ddd	d
          }|                                 |j        S )Nr   rM   rB   r   r   z/contentrN   r   r   T)rb   r[   allow_redirects)	rf   r<   rR   rS   r>   r
   rm   r   r$   )rE   r7   rf   rU   rp   rq   s         rF   read_file_contentz_Client.read_file_content2  s    $$Y3399;;KK%b*A*A*AKKK||C;LU;L;L_n)o)oy{  NR|  S  S|rH   c                z    i }|r||d<   |r||d<   |                      ddt          |d           d|d	          S )
Nru   r   rz   r   rB   r   z/ingestg      N@r   r   )rE   r7   ru   r   bodys        rF   ingest_filez_Client.ingest_file:  s_     	&%DO 	('D||F$QwR1H1H1H$Q$Q$Q]ako|ppprH   c                V    |                      ddt          |d           d          S )Nr`   r   rB   r   r   r   r   r   s     rF   delete_filez_Client.delete_fileB  s1    ||H&L5r3J3J3J&L&LVY|ZZZrH   )r<   r=   r>   r=   r?   r=   )rI   r=   rJ   rK   )r\   r=   rI   r=   r[   r]   rJ   r   )rt   )
ru   r=   rv   r=   r   r=   rw   rx   rJ   rK   )r   )
ru   r=   rv   r=   r   r=   r   rx   rJ   rK   )ru   r=   rJ   rK   )r   r   )ru   r=   rv   r=   r$   r=   r%   r=   r&   r]   rJ   rK   )r(   r=   rJ   rK   )r   )
ru   r=   rv   r=   r   r   r[   r]   rJ   rK   )r   )ru   r=   r   r=   r   r=   rJ   rK   )r   r=   rJ   rK   )r   )r   r=   r$   r=   r   r=   rJ   rK   )r   r   r   r=   r/   r=   r   r=   r0   r=   r   r   rJ   rK   )Nr   )r4   r   r5   rx   rJ   rK   )r7   r=   rJ   rK   )r7   r=   rJ   r   )NN)r7   r=   ru   r   r   r   rJ   rK   )__name__
__module____qualname__rG   rW   rg   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r    rH   rF   r;   r;      s          
	 	 	 	 9=_b      .        } } } }
 
 
 
 
d d d d        
H H H H       ? ? ? ? ?K K K K   q q q q q[ [ [ [ [ [rH   r;   c                  R    e Zd ZdZddZdd	ZddZddZddZddZ	ddZ
ddZdS )_WriteQueueuU   SQLite-backed async write queue. Survives crashes — pending rows replay on startup.clientr;   db_pathr   c           	        || _         || _        t          j                    | _        t          j        | j        dd          | _        | j        j	        
                    dd           t          j                    | _        |                                  | j                                         |                                 D ]7\  }}}}| j                            |||t#          j        |          f           8d S )Nzretaindb-writerTtargetr   daemon)parentsexist_ok)_client_db_pathqueueQueue_q	threadingThread_loop_threadparentmkdirlocal_local_init_dbstart_pending_rowsputra   loads)rE   r   r   row_idru   rv   	msgs_jsons          rF   rG   z_WriteQueue.__init__M  s    ${}} 'tz@QZ^___""4$"???o''6:6H6H6J6J 	N 	N2FGZGKK*dj6K6KLMMMM	N 	NrH   rJ   sqlite3.Connectionc                    t          | j        dd          }|Et          j        t	          | j                  d          }t          j        |_        || j        _        |S )z2Return a cached connection for the current thread.connNr   r   )	getattrr   sqlite3connectr=   r   Rowrow_factoryr   rE   r   s     rF   	_get_connz_WriteQueue._get_conn[  sQ    t{FD11<?3t}#5#5rBBBD&{D#DKrH   Nonec                    |                                  }|                    d           |                                 d S )NzCREATE TABLE IF NOT EXISTS pending (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user_id TEXT, session_id TEXT, messages_json TEXT,
            created_at TEXT, last_error TEXT
        ))r   executecommitr   s     rF   r   z_WriteQueue._init_dbd  s?    ~~  	 	 	
 	rH   r   c                x    |                                  }|                    d                                          S )NzTSELECT id, user_id, session_id, messages_json FROM pending ORDER BY id ASC LIMIT 200)r   r   fetchallr   s     rF   r   z_WriteQueue._pending_rowsm  s0    ~~||rss||~~~rH   ru   r=   rv   r   c           	     \   t          j        t          j                                                  }|                                 }|                    d||t          j        |d          |f          }|j	        }|
                                 | j                            ||||f           d S )NzUINSERT INTO pending (user_id, session_id, messages_json, created_at) VALUES (?,?,?,?)F)ensure_ascii)r   nowr   utc	isoformatr   r   ra   dumps	lastrowidr   r   r   )rE   ru   rv   r   r   r   curr   s           rF   enqueuez_WriteQueue.enqueueq  s    l8<((2244~~llcj$*XE"J"J"JCP
 
 VWj(;<<<<<rH   r   rx   c                   	 | j                             |||           |                                 }|                    d|f           |                                 d S # t
          $ r}t                              d|           |                                 }|                    dt          |          |f           |                                 t          j
        d           Y d }~d S d }~ww xY w)Nz DELETE FROM pending WHERE id = ?z'RetainDB ingest failed (will retry): %sz.UPDATE pending SET last_error = ? WHERE id = ?   )r   r   r   r   r   ri   loggerwarningr=   timesleep)rE   r   ru   rv   r   r   excs          rF   
_flush_rowz_WriteQueue._flush_row|  s    
	L''XFFF>>##DLL;fYGGGKKMMMMM 	 	 	NNDcJJJ>>##DLLICPSHHV\K]^^^KKMMMJqMMMMMMMMM	s   AA 
C0)A<C++C0c                    	 	 | j                             d          }|t          u rd S  | j        |  nB# t          j        $ r Y Dt          $ r%}t                              d|           Y d }~nd }~ww xY wu)NT   r   zRetainDB writer error: %s)	r   rm   _ASYNC_SHUTDOWNr  r   Emptyri   r  rd   )rE   itemr  s      rF   r   z_WriteQueue._loop  s    		??w{{1{--?**E&&&;    ? ? ?8#>>>>>>>>?		?s   $4 
4 A3	A3A..A3c                z    | j                             t                     | j                            d           d S )N
   r   )r   r   r  r   joinrE   s    rF   shutdownz_WriteQueue.shutdown  s5    O$$$"%%%%%rH   N)r   r;   r   r   )rJ   r   rJ   r   )rJ   r   )ru   r=   rv   r=   r   r   rJ   r   )
r   rx   ru   r=   rv   r=   r   r   rJ   r   )r   r   r   __doc__rG   r   r   r   r  r  r   r  r   rH   rF   r   r   J  s        __N N N N         	= 	= 	= 	=   
? 
? 
? 
?& & & & & &rH   r   profilerK   query_resultlocal_entrieslist[str] | NonerJ   r=   c                *   dddfdfd|pg D             }g }t          | pi                     d          pg           d d         D ]_} |pi                     d	          pd
          } |          }|r.||vr*|                    |           |                    |           `g }t          |pi                     d          pg           d d         D ]_}	 |	pi                     d	          pd
          } |          }|r.||vr*|                    |           |                    |           `|s|sd
S ddg}
|
d |D             pdgz  }
|
                    d           |
d |D             pdgz  }
d                    |
          S )Nsr=   rJ   c                    t          j        ddt          | pd                                                    d d         S )Nz\s+re   rB   i@  )rC   rD   r=   rS   )r  s    rF   _compactz _build_overlay.<locals>._compact  s5    vfc3qwB<<006688#>>rH   c                f    t          j        dd |                                                     S )Nz
[^a-z0-9 ]rB   )rC   rD   lower)r  r   s    rF   _normz_build_overlay.<locals>._norm  s+    vmR!):):)<)<===rH   c                <    g | ]} |           |          S r   r   ).0er#  s     rF   
<listcomp>z"_build_overlay.<locals>.<listcomp>  s.    KKKA%%((KuuQxxKKKrH   memoriesr  r$   rB   resultsz[RetainDB Context]zProfile:c                    g | ]}d | S - r   r%  is     rF   r'  z"_build_overlay.<locals>.<listcomp>  s    ...1h1hh...rH   z- NonezRelevant memories:c                    g | ]}d | S r+  r   r-  s     rF   r'  z"_build_overlay.<locals>.<listcomp>  s    ,,,1h1hh,,,rH   
)r  r=   rJ   r=   )r   rm   appendr  )r  r  r  seenprofile_itemsmcnquery_itemsrlinesr   r#  s              @@rF   _build_overlayr:    s   ? ? ? ?> > > > > > LKKK-*=2KKKD!M7=b%%j117R88!< $ $Hag2]]9--344E!HH 	$$KKNNN  ###K<%2**955;<<RaR@ " "Hag2]]9--344E!HH 	"$KKNNNq!!!  r!:.E	.....<8*<E	LL%&&&	,,,,,:
:E99UrH   c                      e Zd ZdZd Zed(d            Zd)dZd*d	Zd+dZ	d,dZ
d(dZddd-dZd.dZd.dZd/dZed0d            Zddd1dZddd2dZd*dZd3d Zd4d"Zd5d%Zd/d&Zd'S )6RetainDBMemoryProvideru\   RetainDB cloud memory — durable queue, semantic search, dialectic synthesis, shared files.c                    d | _         d | _        d| _        d| _        d| _        t          j                    | _        d| _        d| _	        i | _
        g | _        d S )NdefaultrB   hermes)r   _queue_user_id_session_id	_agent_idr   Lock_lock_context_result_dialectic_result_agent_model_prefetch_threadsr  s    rF   rG   zRetainDBMemoryProvider.__init__  s_    '+*.!!^%%
  "!#"$ :<rH   rJ   r=   c                    dS )Nretaindbr   r  s    rF   r   zRetainDBMemoryProvider.name  s    zrH   boolc                Z    t          t          j                            d                    S )NRETAINDB_API_KEY)rL  osenvironrm   r  s    rF   is_availablez#RetainDBMemoryProvider.is_available  s    BJNN#566777rH   List[Dict[str, Any]]c                4    dddddddddt           d	d
ddd	gS )Nr<   zRetainDB API keyTrN  zhttps://retaindb.com)keyr   secretr   env_varrp   r>   zAPI endpoint)rT  r   r>  r?   uC   Project identifier (optional — uses 'default' project if not set)rB   )_DEFAULT_BASE_URLr  s    rF   get_config_schemaz(RetainDBMemoryProvider.get_config_schema  sX    .@D^b  pB  Ka  b  b~J[\\.s  AC  D  D
 	
rH   rv   r   c                   t           j                            dd          }t          j        ddt           j                            dt
                              }t           j                            d          }|r|}nSt          |                    dd                    }|rt           j                            |          nd}|r	|dvrd| nd	}t          |||          | _
        || _        |                    d
d	          pd	| _        |                    dd          pd| _        ddlm}	  |	            }
|
dz  }t!          | j
        |          | _        |
dz  }|                                r]|                    dd                                          }|r4t+          j        | j        |fdd                                           d S d S d S )NrN  rB   rA   RETAINDB_BASE_URLRETAINDB_PROJECThermes_home>   .hermesrB   zhermes-r>  ru   r   r?  r   )get_hermes_homezretaindb_queue.dbzSOUL.mdutf-8rR   )encodingerrorszretaindb-soul-seedTr   argsr   r   )rO  rP  rm   rC   rD   rW  r=   rI   basenamer;   r   rB  rA  rC  hermes_constantsr^  r   r@  exists	read_textrS   r   r   
_seed_soulr   )rE   rv   kwargsr<   r>   explicitr?   r\  profile_namer^  hermes_home_pathr   	soul_pathsoul_contents                 rF   
initializez!RetainDBMemoryProvider.initialize  s   *..!3R886&"bjnn5HJ[&\&\]] :>>"455 	xGGfjj;;<<K<GO27++K888RL3?wLXgDgDg....nwGw'::%

9i88EIJ99EX444444*?,,"%88!$,88 %y0	 	$..	.RRXXZZL  ?&-	  
 %'''''	 	 rH   r$   c                    	 | j                             | j        |d           d S # t          $ r&}t                              d|           Y d }~d S d }~ww xY w)Nr   )r   zRetainDB soul seed failed: %s)r   r   rC  ri   r  debug)rE   r$   r  s      rF   rh  z!RetainDBMemoryProvider._seed_soul  sr    	?L,,T^WY,WWWWW 	? 	? 	?LL8#>>>>>>>>>	?s   "& 
AAAc                8    | j         r| j         j        nd}d| dS )NrK  z## RetainDB Memory
Active. Project: z.
Use retaindb_search to find memories, retaindb_remember to store facts, retaindb_profile for a user overview, retaindb_context for current-task context.)r   r?   )rE   r?   s     rF   system_prompt_blockz*RetainDBMemoryProvider.system_prompt_block  s8    *.,F$,&&J_ '_ _ _	
rH   rB   )rv   r   c               F   | j         sdS | j        D ]}|                    d           t          j        | j        |fdd          t          j        | j        |fdd          t          j        | j        dd	          g}|| _        |D ]}|                                 dS )
z@Fire context + dialectic + agent model prefetches in background.Ng       @r   zretaindb-ctxTrb  zretaindb-dialecticzretaindb-agent-modelr   )	r   rI  r  r   r   _prefetch_context_prefetch_dialectic_prefetch_agent_modelr   )rE   r   rv   tthreadss        rF   queue_prefetchz%RetainDBMemoryProvider.queue_prefetch  s    | 	F ' 	  	 AFF3FD$:%P^gklllD$<E8RfostttD$>E[dhiii

 ") 	 	AGGIIII	 	rH   c                f   	 | j                             | j        | j        |          }| j                             | j                  }t          ||          }| j        5  || _        d d d            d S # 1 swxY w Y   d S # t          $ r&}t          
                    d|           Y d }~d S d }~ww xY w)Nz$RetainDB context prefetch failed: %s)r   r~   rA  rB  r   r:  rE  rF  ri   r  rq  )rE   r   r  r  overlayr  s         rF   ru  z(RetainDBMemoryProvider._prefetch_context/  s   	F<55dmTEUW\]]Ll..t}==G$Wl;;G / /'.$/ / / / / / / / / / / / / / / / / / 	F 	F 	FLL?EEEEEEEEE	Fs<   AB  A3&B  3A77B  :A7;B   
B0
B++B0c                v   	 | j                             | j        ||                     |                    }t	          |                    d          pd          }|r)| j        5  || _        d d d            d S # 1 swxY w Y   d S d S # t          $ r&}t          
                    d|           Y d }~d S d }~ww xY w)N)r   answerrB   z&RetainDB dialectic prefetch failed: %s)r   r   rA  _reasoning_levelr=   rm   rE  rG  ri   r  rq  )rE   r   resultr~  r  s        rF   rv  z*RetainDBMemoryProvider._prefetch_dialectic9  s&   	H\**4=%QUQfQfglQmQm*nnFH--344F 4Z 4 4-3D*4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 44 4  	H 	H 	HLLA3GGGGGGGGG	Hs<   A"B $A9,B 9A==B  A=B 
B8B33B8c                2   	 | j                             | j                  }|                    dd          dk    r)| j        5  || _        d d d            d S # 1 swxY w Y   d S d S # t          $ r&}t                              d|           Y d }~d S d }~ww xY w)Nmemory_countr   z(RetainDB agent model prefetch failed: %s)	r   r   rC  rm   rE  rH  ri   r  rq  )rE   modelr  s      rF   rw  z,RetainDBMemoryProvider._prefetch_agent_modelC  s    	JL00@@Eyy++a//Z . .(-D%. . . . . . . . . . . . . . . . . . 0/  	J 	J 	JLLCSIIIIIIIII	Js<   A A& A
A& AA& AA& &
B0BBc                D    t          |           }|dk     rdS |dk     rdS dS )Nx   r   i  mediumhigh)len)r   r6  s     rF   r  z'RetainDBMemoryProvider._reasoning_levelL  s.    JJs775s778vrH   c               &   | j         5  | j        }| j        }| j        }d| _        d| _        i | _        ddd           n# 1 swxY w Y   g }|r|                    |           |r|                    d|            |r|                    dd          dk    rg }|                    d          r|                    d|d                     |                    d          r;|                    d	d
                    d |d         D                       z              |                    d          r|                    d|d                     |r+|                    dd
                    |          z              d                    |          S )z>Consume prefetched results and return them as a context block.rB   Nz[RetainDB User Synthesis]
r  r   personaz	Persona: persistent_instructionszInstructions:
r0  c              3      K   | ]	}d | V  
dS )r,  Nr   r-  s     rF   	<genexpr>z2RetainDBMemoryProvider.prefetch.<locals>.<genexpr>i  s(      @z@zaa@z@z@z@z@z@zrH   working_stylezWorking style: z[RetainDB Agent Self-Model]
z

)rE  rF  rG  rH  r1  rm   r  )rE   r   rv   context	dialecticagent_modelpartsmodel_liness           rF   prefetchzRetainDBMemoryProvider.prefetchU  s   Z 	# 	#*G.I+K#%D %'D" "D	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#  	"LL!!! 	DLLByBBCCC 		W;??>1==AA%'Ky)) I""#G{9/E#G#GHHH899 |""#4tyy@z@zS^_xSy@z@z@z7z7z#z{{{// U""#S[5Q#S#STTT W<tyy?U?UUVVV{{5!!!s   +?AAuser_contentassistant_contentc          	         | j         r|sdS t          j        t          j                                                  }| j                             | j        |p| j        d||dd||dg           dS )z1Queue turn for async ingest. Returns immediately.Nuser)roler$   	timestamp	assistant)	r@  r   r   r   r   r   r  rA  rB  )rE   r  r  rv   r   s        rF   	sync_turnz RetainDBMemoryProvider.sync_turns  s    { 	, 	Fl8<((2244M*$*LsKK$1BQTUU	
 	
 	
 	
 	
rH   c           
     ~    t           t          t          t          t          t
          t          t          t          t          g
S N)
PROFILE_SCHEMASEARCH_SCHEMACONTEXT_SCHEMAREMEMBER_SCHEMAFORGET_SCHEMAFILE_UPLOAD_SCHEMAFILE_LIST_SCHEMAFILE_READ_SCHEMAFILE_INGEST_SCHEMAFILE_DELETE_SCHEMAr  s    rF   get_tool_schemasz'RetainDBMemoryProvider.get_tool_schemas  s'    M>] 02B 2	
 	
rH   	tool_namerc  rK   c                    | j         st          d          S 	 t          j        |                     ||                    S # t
          $ r&}t          t          |                    cY d }~S d }~ww xY w)NzRetainDB not initialized)r   r   ra   r  	_dispatchri   r=   )rE   r  rc  ri  r  s        rF   handle_tool_callz'RetainDBMemoryProvider.handle_tool_call  s    | 	:8999	(:dnnY==>>> 	( 	( 	(c#hh''''''''	(s   'A   
A0
A+%A0+A0r   c                R
   | j         }|dk    r|                    | j                  S |dk    rn|                    dd          }|sddiS |                    | j        | j        |t          t          |                    dd                    d	          
          S |dk    rl|                    dd          }|sddiS |                    | j        | j        |          }|                    | j                  }t          ||          }||dS |dk    ru|                    dd          }|sddiS |
                    | j        | j        ||                    dd          t          |                    dd                              S |dk    r1|                    dd          }	|	sddiS |                    |	          S |dk    rE|                    dd          }
|
sddiS t          |
          }|                                sdd|
 iS |                                }dd l}|                    |j                  d         pd}|                    d          p	d|j         }|                    ||j        |||                    d d!          d           }|                    d"          r\|                    d#i                               d$          r3|                    |d#         d$         | j        | j        %          }||d"<   |S |d&k    rK|                    |                    d'          t          |                    d(d)                    *          S |d+k    rB|                    d,d          }|sdd-iS |                    |          }|                    d#          pi                     d.          pd                                }|                    |          }|                    d/          sIt7          fd0d1D                       s.|                    d2                              d3          d d4d5S |                    d6d78          }|                    d2                              d3          |d d9         t;          |          d9k    d:S |d;k    r>|                    d,d          }|sdd-iS |                    || j        | j        %          S |d<k    r1|                    d,d          }|sdd-iS |                    |          S dd=| iS )>Nr   r   r   rB   rd   zquery is requiredr   r      )r   r   )r  rawr   r$   zcontent is requiredr%   r   r&   r   )r%   r&   r'   r(   zmemory_id is requiredr)   r.   zlocal_path is requiredzFile not found: r   zapplication/octet-streamr/   /r0   r+   r1   r   id)ru   r   r2   r4   r5   r   r3   r6   r7   zfile_id is requiredr   ztext/c              3  j   K   | ]-}                     d d                              |          V  .dS )r   rB   N)rm   endswith)r%  r&  	file_infos     rF   r  z3RetainDBMemoryProvider._dispatch.<locals>.<genexpr>  sY        4g  4g^_IMM&"4M4M4V4VWX4Y4Y  4g  4g  4g  4g  4g  4grH   )z.txtz.mdz.jsonz.csvz.yamlz.ymlz.xmlz.htmlrdb_urir   uE   Binary file — use retaindb_ingest_file to extract text into memory.)r7   r  r   r$   noter_  rR   )ra  i }  )r7   r  r   r$   	truncatedr8   r9   zUnknown tool: )r   r   rA  rm   r   rB  minrx   r~   r:  r   r]   r   r   rf  
read_bytes	mimetypes
guess_typer   r   r   rC  r   r   r"  r   rT   anydecoder  r   )rE   r  rc  r5  r   r  r  r|  r$   r(   r.   path_objr   r  mimer/   r  r1   r7   metar  rj   r  s                         @rF   r  z RetainDBMemoryProvider._dispatch  s   L***==///)))HHWb))E 6!45588DM4+;U#cRVRZRZ[bdeRfRfNgNgikJlJl8mmm***HHWb))E 6!455??4=$:JERRLmmDM22G$Wl;;G&|<<<+++hhy"--G 8!677<<t/ HH]I>> ,!<!<==      )))b11I :!899??9--- ...,33J ;!9::J''H??$$ B!@J!@!@AA&&((D''66q9W=WD((=11H5H5H5HK]]4T488T[]fKgKgimnnFxx!! *fjj&<&<&@&@&F&F *vf~d';T]]a]kll#)x M---<<txx'9'9TXXgWYEZEZA[A[<\\\,,,hhy"--G 8!677::g&&D((.BIMM+..4";;==D%%g..COOG,, R  4g  4g  4g  4g  df  4g  4g  4g  1g  1g R#*y}}Y7O7OYbYfYfgmYnYn{  JQ  R  R  R::gi:88D&9==3K3KU^UbUbciUjUjw{  }C  ~C  }C  xD  SV  W[  S\  S\  _d  Sd  e  e  e...hhy"--G 8!677==$-$.=YYY...hhy"--G 8!677==)))5)5566rH   actionr   c                    |dk    s	|r| j         sdS 	 |dk    rdnd}| j                             | j        | j        ||           dS # t          $ r&}t
                              d|           Y d}~dS d}~ww xY w)z*Mirror built-in memory writes to RetainDB.addNr  r   r   )r%   z!RetainDB memory mirror failed: %s)r   r   rA  rB  ri   r  rq  )rE   r  r   r$   r%   r  s         rF   on_memory_writez&RetainDBMemoryProvider.on_memory_write  s    U??'??F	C*0F*:*:,,	KL##DM43CWZe#fffff 	C 	C 	CLL<cBBBBBBBBB	Cs   2A 
A7A22A7c                    | j         D ]}|                    d           | j        r| j                                         d S d S )Ng      @r   )rI  r  r@  r  )rE   rx  s     rF   r  zRetainDBMemoryProvider.shutdown  sY    ' 	  	 AFF3F; 	#K  """""	# 	#rH   N)rJ   r=   )rJ   rL  )rJ   rR  )rv   r=   rJ   r   )r$   r=   rJ   r   )r   r=   rv   r=   rJ   r   )r   r=   rJ   r   r  )r   r=   rJ   r=   )r   r=   rv   r=   rJ   r=   )r  r=   r  r=   rv   r=   rJ   r   )r  r=   rc  rK   rJ   r=   )r  r=   rc  rK   rJ   r   )r  r=   r   r=   r$   r=   rJ   r   )r   r   r   r  rG   propertyr   rQ  rX  ro  rh  rs  rz  ru  rv  rw  staticmethodr  r  r  r  r  r  r  r  r   rH   rF   r<  r<    s       ff< < <$    X8 8 8 8
 
 
 
" " " "H? ? ? ?
 
 
 
 ?A      "F F F FH H H HJ J J J    \ 9; " " " " " "< Y[ 
 
 
 
 
 
 
 
 
 
( ( ( (T7 T7 T7 T7pC C C C# # # # # #rH   r<  r   c                H    |                      t                                 dS )z.Register RetainDB as a memory provider plugin.N)register_memory_providerr<  )ctxs    rF   registerr    s#      !7!9!9:::::rH   r  )r  rK   r  rK   r  r  rJ   r=   r  ).r  
__future__r   ra   loggingrO  r   rC   r   r   r	  r   r   pathlibr   typingr   r   r	   urllib.parser
   agent.memory_providerr   tools.registryr   	getLoggerr   r  rW  r   r  r  r  r  r  r  r  r  r  r  r  r;   r   r:  r<  r  r   rH   rF   <module>r     s   ( # " " " " "   				  				       ' ' ' ' ' ' ' '       " " " " " " " " " "       0 0 0 0 0 0 % % % % % %		8	$	$. &(( w#22FF  j&7LMM'8\]]
 
 I   xh7RSS
 I 
 
  [ (9PQQ \\\= 
 $,<\]]
 
 K  & 4(;QRR
 !M 
 
 #t#+<XYY$,=eff&0J0J0J[}~~(9yzz	
 
 "N	 	    "9'8bcc'8TUU
 
     !K9`aa
 K 
 
  #j9MNN
 K 
 
  #*9MNN
 K 
 
 "P[ P[ P[ P[ P[ P[ P[ P[nM& M& M& M& M& M& M& M&h    Lu# u# u# u# u#^ u# u# u#p	; ; ; ; ; ;rH   