
    i!O                       S SK Jr  S SKrS SKJs  Jr  S SKrS SK	r	S SK
r
S SKrS SKJr  S SKJr  S SKJrJr  S SKJr  S SKJrJr  S SKJr  S S	KJr  S#S
 jrSSS.S$S jjrS%S jrS&S jrS&S jr S&S jr!S&S jr"S&S jr#S&S jr$S&S jr%S&S jr&S&S jr'S&S jr(S&S jr)S&S jr*S&S jr+S&S jr,S&S jr-S&S jr.S&S jr/S&S  jr0S'S! jr1S&S" jr2g)(    )annotationsN)Path)	HTTPError)Requesturlopen)ThreadingHTTPServer)MemoryEngineMemoryService)build_handler)SCHEMA_VERSIONc                0    [        [        U S-  5      5      $ )Nmemory.sqlite3)r
   str)tmp_paths    5/mnt/rpi/agents-database/tests/test_memory_service.pymake_servicer      s    X(889::    GETmethodpayloadc               ^   Uc  S O$[         R                  " U5      R                  S5      n[        XUS9nUb  UR	                  SS5        [        U5       nUR                  [         R                  " UR                  5       R                  S5      5      4sS S S 5        $ ! , (       d  f       g = f)Nzutf-8)datar   zContent-Typezapplication/json)
jsondumpsencoder   
add_headerr   statusloadsreaddecode)urlr   r   bodyrequestresponses         r   _request_jsonr&      s    ?4

7(;(B(B7(KDcV4G>+=>		X

8==?+A+A'+J KK 
		s   ?B
B,c                    [        S[        U 5      5      n[        R                  " UR                  SS9nUR                  5         UR                  u  p4USU SU 34$ )N)z	127.0.0.1r   T)targetdaemonzhttp://:)r   r   	threadingThreadserve_foreverstartserver_address)serviceserverthreadhostports        r   
_start_apir5      sZ     !1=3IJFV%9%9$GF
LLN&&JDWTF!D6***r   c                   [        U 5      nUR                  SS5        UR                  SS/S9nUS   o3(       d:  SS[        R                  " U5      0-  n[        [        R                  " U5      5      eS nUS   S	   S
   S   nSoSU:H  of(       do  [        R                  " SU4SX545      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peUS   S	   S
   S   o3[        :H  of(       d  [        R                  " SU4SU[        45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS.-  n	SSU	0-  n
[        [        R                  " U
5      5      eS =p6g )NCommunicationz,Sebas prefers concise, direct communication.zconcise communicationglobalscopesresultsassert %(py1)spy1r   memorytypeprofile==z%(py1)s == %(py4)sr=   py4assert %(py6)spy6schema_versionz%(py1)s == %(py3)sr   r=   py3assert %(py5)spy5)r   upsert_profile_factsearch
@pytest_ar	_safereprAssertionError_format_explanation_call_reprcomparer   @py_builtinslocals_should_repr_global_name)r   r0   r;   @py_assert0@py_format2@py_assert3@py_assert2@py_format5@py_format7@py_format4@py_format6s              r   2test_manual_profile_fact_is_immediately_searchabler`   '   s1   8$G1_`nn4hZnHG99a *62?i?i?????2???2???i???????9a *+;<NNNNNN<NNN<NNNNNNNNNNNNNNNNNr   c                   [        U 5      n[        U5      nUR                  SSS5        UR                  5       nUS   S   nUR	                  U5      nUS   nSovU:H  o(       do  [
        R                  " SU4S	Xg45      [
        R                  " U5      [
        R                  " U5      S
.-  n	SSU	0-  n
[        [
        R                  " U
5      5      eS =n=pUR                  SS/S9nUS   n/ ovU:H  o(       do  [
        R                  " SU4S	Xg45      [
        R                  " U5      [
        R                  " U5      S
.-  n	SSU	0-  n
[        [
        R                  " U
5      5      eS =n=pUR                  U/5      nUS   od/ovU:H  o(       do  [
        R                  " SU4S	Xg45      [
        R                  " U5      [
        R                  " U5      S
.-  n	SSU	0-  n
[        [
        R                  " U
5      5      eS =n=pUR                  SS/S9nUS   S   S   S   ofU:H  o(       d  [
        R                  " SU4SXd45      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSSU0-  n[        [
        R                  " U5      5      eS =phg )Nzchat-1projectz/We agreed to keep one active machine at a time.r   	memory_idr   inboxrA   rC   rD   rF   rG   zactive machiner9   r;   promotedr>   idrI   rJ   rL   rM   )r   r	   capture_conversationprocess_pending
get_memoryrP   rT   rQ   rR   rS   rO   consolidaterU   rV   rW   )r   r0   engine	processedrc   r>   rX   rZ   r[   r\   r]   search_without_inboxre   search_with_activer^   r_   s                   r   9test_captured_conversation_stays_inbox_until_consolidatedro   2   s   8$G'"F  96gh&&(I![)I	*F(&w&w&&&&&&&&&&&w&&&&&&&">>*:I;>O	*0b0b00000*000*000b0000000""I;/HJ.;.;...........;....... (8)Mi(+H5d;HyHHHHH;HHH;HHHHHHyHHHHyHHHHHHHr   c                r   [        U 5      nUR                  SS5        UR                  SSSS9  UR                  SS5        UR	                  SSSSS	S
S.5        UR	                  SSSSSSS.5        UR	                  SSSSSSSSS.5        UR                  SSSS9nUS   o3(       d:  SS[        R                  " U5      0-  n[        [        R                  " U5      5      eS nUS   o3(       d:  SS[        R                  " U5      0-  n[        [        R                  " U5      5      eS nUS   o3(       d:  SS[        R                  " U5      0-  n[        [        R                  " U5      5      eS nUS   o3(       d:  SS[        R                  " U5      0-  n[        [        R                  " U5      5      eS ng )N
proj_alphaAlpha
repo_alpha
Repo Alpha
project_idPreferencesz'Sebas wants agents to preserve clarity.rb   zProject goalz$Alpha shares memory across projects.)r?   scoperv   repo_idtitlecontentdecisionzStorage enginezUse SQLite as canonical store.artifactresearch_artifact
task_alphaz	Task notezRelevant artifact.)r?   subtyperx   rv   ry   task_idrz   r{   )rb   repotaskprofile_factsr<   r=   project_memoriesactive_decisionstask_relevant_artifacts)
r   create_projectcreate_reporN   create_memorycontext_forrP   rQ   rR   rS   )r   r0   bundlerX   rY   s        r   >test_context_bundle_combines_global_project_and_task_artifactsr   G   s   8$G<1l|L/XY&##=	
	 &#%7	
	 *&## +		
   L| \F/"""""""""""""$%%%%%%%%%%%%%$%%%%%%%%%%%%%+,,,,,,,,,,,,,r   c           
     v   [        U 5      nUR                  SS5        UR                  SSSS9  UR                  SSSSSS	S
S9nUR	                  US   S	SS0S9  UR                  US   SSSS	S9  UR                  5       n[        [        U S-  5      5      nUR                  U5        UR                  US   5      nSofU;  ow(       d  [        R                  " SU4SXe45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n	[#        [        R$                  " U	5      5      eS =pgSofU;  ow(       d  [        R                  " SU4SXe45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n	[#        [        R$                  " U	5      5      eS =pgUS   S   nS
oU
:H  ow(       do  [        R                  " SU4S Xj45      [        R                  " U5      [        R                  " U
5      S!.-  nS"S#U0-  n[#        [        R$                  " U5      5      eS =n=pzUS$   of(       d:  S%S&[        R                  " U5      0-  n[#        [        R$                  " U5      5      eS nUS'   of(       d:  S%S&[        R                  " U5      0-  n[#        [        R$                  " U5      5      eS ng )(Nrq   rr   rs   rt   ru   r   zResume V2 taskzNeed durable task state.personal-agent	run_alpha)r   rz   intentrv   ry   owner_agentrun_idrf   moderunner)input_payloadbriefBriefz"Keep resumable state in shared DB.)r   artifact_typerz   r{   
source_refzsecond.sqlite3	approvals)not in)z%(py1)s not in %(py3)sr   rJ   rL   rM   handoffsr   r   rA   rC   rD   rF   rG   runsr<   r=   	artifacts)r   r   r   create_taskstart_task_runcreate_artifactexportr
   r   import_datatask_bundlerP   rT   rQ   rU   rV   rW   rR   rS   )r   r0   r   exportedsecondr   rX   r[   r^   r_   rZ   r\   r]   rY   s                 r   Ntest_export_import_preserves_operational_records_without_approvals_or_handoffsr   u   sG   8$G<1l|L)$  D 4:'7PXGYZT
4#   ~~H3x*::;<F
x T
+F$f$$$$$;$$$;$$$$$$f$$$$f$$$$$$$#V#####:###:######V####V#######&>(#2{2{22222#222#222{2222222&>>>+r   c                   [        U 5      nUR                  SSSSSSSSS	.5        UR                  S
SSSSSSSSS.	5        UR                  SSSSS9n[        U5      nSoCU:H  oU(       Gd  [        R
                  " SU4SX445      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pTUS   S   nSoU	:H  o3(       do  [        R
                  " SU4SX45      [        R                  " U5      [        R                  " U	5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=p9g ) Nrun_123episoderesearch_runr8   zResearch runzGoal: inspectrun-123r   )rf   r?   r   rx   rz   r{   r   origin_agentr}   research_sourceSourcesourcezhttps://example.com/speczexample.com)	r?   r   rx   rz   r{   r   r"   domainr   )r   r   r   r      rA   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenmatches)py0r=   rK   rG   zassert %(py8)spy8r   r"   rC   rD   rF   rG   )r   r   list_memoriesr   rP   rT   rU   rV   rW   rQ   rR   rS   )r   r0   r   r[   @py_assert5@py_assert4r]   @py_format9rX   rZ   r\   s              r   *test_list_memories_can_filter_by_v2_facetsr      st   8$G%#&,		
 (-#,
	
 ##,=iXe  uE#  FGw<11<33ww<11:e: :: :::::::::::: ::::::::r   c           	        [        U 5      nUR                  SSSSSS S.5        UR                  SS/S9nUS	   o3(       d:  S
S[        R                  " U5      0-  n[        [        R                  " U5      5      eS nUS	   S   S   S   nSoSU:H  of(       do  [        R                  " SU4SX545      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peg )Nr}   research_claimr8   Claimz'SQLite remains optional for embeddings.)r?   r   rx   rz   r{   	embeddingzoptional embeddingsr9   r;   r<   r=   r   r>   r   rA   rC   rD   rF   rG   )r   r   rO   rP   rQ   rR   rS   rT   )	r   r0   r;   rX   rY   rZ   r[   r\   r]   s	            r   $test_search_works_without_embeddingsr      s    8$G'@	
	 nn2H:nFG99a *95I9II9IIIIII5III5III9IIIIIIIIr   c                *	   [        U 5      n[        U5      u  p# [        U S35      u  pESodU:H  ow(       d  [        R                  " SU4SXF45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUS	   n
S
oUL of(       do  [        R                  " SU4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pk[        U S3SSSSSSSSS.S9u  pSonU:H  ow(       d  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUS   n
SoU:H  of(       do  [        R                  " SU4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pk[        U S35      u  nnSnUU:H  ow(       d  [        R                  " SU4SUU45      S [
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUS!   o(       d:  S"S#[        R                  " U
5      0-  n[        [        R                  " U5      5      eS n
US!   S$   S%   S   n
SoU:H  of(       do  [        R                  " SU4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pkUR                  5         UR                  5         g ! UR                  5         UR                  5         f = f)&Nz/api/status   rA   z%(py0)s == %(py3)sstatus_coder   rK   rL   rM   okTis)z%(py1)s is %(py4)srD   rF   rG   z/api/ingestPOST
mem_http_1r}   r   r8   zHTTP memoryz)Remote API keeps shared memory reachable.active)rf   r?   r   rx   rz   r{   r   r      created_coderf   rC   z$/api/search?q=reachable&scope=globalsearch_coder;   r<   r=   r   r>   r   r5   r&   rP   rT   rU   rV   rW   rQ   rR   rS   shutdownserver_close)r   r0   r1   base_urlr   status_payloadr[   @py_assert1r^   r_   rX   rZ   r\   r]   r   created_payloadr   search_payloadrY   s                      r   /test_http_api_supports_status_ingest_and_searchr      s   8$G!'*F&3xj4L&M#!!c!!!!!{!!!!!!{!!!!{!!!c!!!!!!!d#+t+t+++++#+++#+++t+++++++(5j$""+!&F")
%  #"s"""""|""""""|""""|"""s"""""""t$4444444$444$4444444444&3xj@d4e&f#^!!{c!!!!!{c!!!!!!{!!!!{!!!c!!!!!!!i(((((((((((((i(+H5d;K|K|KKKKK;KKK;KKK|KKKKKKK 	s   P5Q0 0"Rc           	        [        U 5      n[        U5      u  p# [        U S3SSSSSS.S9u  pES	odU:H  ow(       d  [        R                  " S
U4SXF45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUS   n
SoU:H  of(       do  [        R                  " S
U4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pk[        U S3SUS   SSS0S.S9u  pS	onU:H  ow(       d  [        R                  " S
U4SX45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUS   oS   oU:H  of(       do  [        R                  " S
U4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pk[        U SUS    3SSUS   S.S9u  nnSnUU:H  ow(       d  [        R                  " S
U4SUU45      S [
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUS!   n
SoU:H  of(       do  [        R                  " S
U4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pkUS"   oS   oU:H  of(       do  [        R                  " S
U4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pk[        U SUS    S#35      u  nnSnUU:H  ow(       d  [        R                  " S
U4SUU45      S$[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS$[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUS%   S   oS   oU:H  of(       do  [        R                  " S
U4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pkUS&   S'   S   oS   oU:H  of(       do  [        R                  " S
U4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pkUR                  5         UR                  5         g ! UR                  5         UR                  5         f = f)(Nz
/api/tasksr   task_http_1zRemote taskzKeep task state remote.r   )r   rz   r   r   r   r   rA   r   	task_coder   rL   rM   rf   rC   rD   rF   rG   z/api/task-runsr   remote)r   agent_idr   run_coder   z/api/tasks/PATCHin_progress)r   r   r   
patch_coder   r   z/bundlebundle_coder   r   r   r   )r   r0   r1   r   r   r   r[   r   r^   r_   rX   rZ   r\   r]   r   runr   patchedr   r   s                       r   -test_http_api_supports_tasks_runs_and_bundlesr      s_   8$G!'*F%'j
#(&3/		
	  CyyyCDz*]*]*****z***z***]*******%j' $T
8H\bdl[mn

 3xxx39~+d++++++~+++~+++++++++++jDJ<0,D	B

G
 ! zS     zS      z    z   S       x 1M1M11111 111 111M1111111x -I-I----- --- ---I-------+xjDJ<w,WXV!!{c!!!!!{c!!!!!!{!!!!{!!!c!!!!!!!f~d#1Dz1z11111#111#111z1111111f~a &3d)3)33333&333&333)3333333 	s   Y$Z "[c                   [        U 5      nUR                  SSSSSS.5        [        U5      u  p# [        U S35      u  pESodU:H  ow(       d  [        R
                  " S	U4S
XF45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUS   n
SoU:H  of(       do  [        R
                  " S	U4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=pkUR                  5         UR                  5         g ! UR                  5         UR                  5         f = f)Nmem_lookup_1r}   r8   Lookup memoryDirect id lookup should work.rf   r?   rx   rz   r{   z/api/memories/mem_lookup_1r   rA   r   r   r   rL   rM   rf   rC   rD   rF   rG   )r   r   r5   r&   rP   rT   rU   rV   rW   rQ   rR   rS   r   r   )r   r0   r1   r   r   r   r[   r   r^   r_   rX   rZ   r\   r]   s                 r   *test_http_api_supports_memory_lookup_by_idr     s/   8$G $6	
 "'*F,z9S-TU!!c!!!!!{!!!!!!{!!!!{!!!c!!!!!!!t}.......}...}.......... 	s   E	F "F=c                   [        U 5      n[        U5      u  p#  [        U S35        [        S5      e! [         a  nUR
                  nSoeU:H  ow(       d  [        R                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n	[        [        R                  " U	5      5      eS =n=pv S nAOS nAff = f UR                  5         UR                  5         g ! UR                  5         UR                  5         f = f)
Nz/api/searchz#Expected HTTP 400 for missing query  rA   z,%(py2)s
{%(py2)s = %(py0)s.code
} == %(py5)sexcr   py2rM   assert %(py7)spy7)r   r5   r&   rR   r   coderP   rT   rU   rV   rW   rQ   rS   r   r   
r   r0   r1   r   r   r   r   rZ   r_   @py_format8s
             r   *test_http_api_rejects_search_without_queryr   .  s    8$G!'*F		HXJk23 !!FGG  	#88"s"s?""""8""""""3""""3"""8"""s""""""""	#" 	 	s,   4 E 
DCDE DE "E&c                    [        U 5      nUR                  SSSSSS.5        [        U5      u  p#  [        U S35        [	        S5      e! [
         a  nUR                  nS	oeU:H  ow(       d  [        R                  " S
U4SXV45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[	        [        R                  " U	5      5      eS =n=pv S nAOS nAff = f UR                  5         UR                  5         g ! UR                  5         UR                  5         f = f)Nr   r}   r8   r   r   r   z/api/search?id=mem_lookup_1z"Expected HTTP 400 for search by idr   rA   r   r   r   r   r   )r   r   r5   r&   rR   r   r   rP   rT   rU   rV   rW   rQ   rS   r   r   r   s
             r   "test_http_api_rejects_search_by_idr   =  s   8$G $6	
 "'*F		GXJ&ABC !!EFF  	#88"s"s?""""8""""""3""""3"""8"""s""""""""	#" 	 	s0   A  E 
D6CD1,E 1D66E "E=c                   [        U 5      nUR                  5        Vs1 s H  o"S   iM	     nnSoDU;   oU(       d  [        R                  " SU4SXC45      [        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =pES	oDU;   oU(       d  [        R                  " SU4SXC45      [        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =pES
oDU;   oU(       d  [        R                  " SU4SXC45      [        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =pEg s  snf )Nrf   job_consolidation_daily_10inz%(py1)s in %(py3)sjobsrJ   rL   rM   job_consolidation_daily_15job_consolidation_weekly)
r   list_maintenance_jobsrP   rT   rQ   rU   rV   rW   rR   rS   )r   r0   jobr   rX   r[   r^   r_   s           r   &test_maintenance_jobs_exist_by_defaultr  U  sJ   8$G!(!>!>!@A!@#I!@DA'/4/////'///'//////4////4///////'/4/////'///'//////4////4///////%------%---%-----------------	 Bs   Ic                   [        U 5      n[        U5      nSnUR                  SUS9  UR                  SS9nU(       dp  SSS[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS0-  n[        [        R                  " U5      5      eUR                  S5      nUR                  SS9nUS   nS	oU	:H  o(       do  [        R                  " S
U
4SX45      [        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pU(       dp  SSS[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS0-  n[        [        R                  " U5      5      eg )N2026-03-20T10:00:00+00:00r   next_due_atjob_idassert %(py0)sr   r;   last_status	completedrA   rC   rD   rF   rG   r   )r   r	   update_maintenance_jobrun_due_maintenancerU   rV   rP   rW   rQ   rR   rS   get_maintenance_joblist_maintenance_runsrT   )r   r0   rk   nowr;   @py_format1r  r   rX   rZ   r[   r\   r]   s                r   !test_maintenance_tick_records_runr  _  s   8$G'"F
%C""#?S"Q((0L(MGNNNNNN7NNNN7NNNNNN

%
%&B
CC((0L(MD},,,,,,,,,,,,,,,,,,,,KKKKKK4KKKK4KKKKKK4r   c                   U S-  n[        [        U5      5      nSnUR                  SUS9  [        [        U5      5      nUR                  S5      nUR	                  SS9nUS   nSoU:H  o(       do  [
        R                  " SU	4S	Xx45      [
        R                  " U5      [
        R                  " U5      S
.-  n
SSU
0-  n[        [
        R                  " U5      5      eS =n=pU(       dp  SSS[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS0-  n[        [
        R                  " U5      5      eg )Nr   r  r   r  r	  r  r  rA   rC   rD   rF   rG   r  r   r   )r
   r   r  r  r  rP   rT   rQ   rR   rS   rU   rV   rW   )r   db_pathr0   r  	restartedr  r   rX   rZ   r[   r\   r]   r  s                r   )test_service_startup_runs_due_maintenancer  o  s    ))GCL)G
%C""#?S"Qc'l+I

'
'(D
EC**2N*OD},,,,,,,,,,,,,,,,,,,,KKKKKK4KKKK4KKKKKK4r   c                   [        U 5      nSnUR                  SUS9  UR                  SS5        UR                  S5      nUR	                  SS9nUS   nSoeU:H  ow(       do  [
        R                  " S	U4S
XV45      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n	[        [
        R                  " U	5      5      eS =n=pvU(       dp  SSS[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS0-  n
[        [
        R                  " U
5      5      eg )Nr  r   r  rq   rr   r	  r  r  rA   rC   rD   rF   rG   r  r   r   )r   r  r   r  r  rP   rT   rQ   rR   rS   rU   rV   rW   )r   r0   r  r  r   rX   rZ   r[   r\   r]   r  s              r   3test_write_operations_trigger_due_maintenance_checkr  }  s    8$G
%C""#?S"Q<1

%
%&B
CC((0L(MD},,,,,,,,,,,,,,,,,,,,KKKKKK4KKKK4KKKKKK4r   c                x   [        U 5      nUR                  SSS9  UR                  SSSSSS	S
SS.5      nUS   nSoCU:H  oU(       do  [        R                  " SU4SX445      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pTg )Nr   r  r  mem_auto_promoter   rb   rd   zAuto promote mez?A durable session note that should become active automatically.gffffff??)rf   r?   rx   r   rz   r{   
confidence	freshnessr   r   rA   rC   rD   rF   rG   )r   r  r   rP   rT   rQ   rR   rS   )r   r0   r>   rX   rZ   r[   r\   r]   s           r   8test_high_confidence_inbox_memory_auto_promotes_on_writer     s    8$G""#?Mh"i""$&X		
F ('x'x'''''''''''x'''''''r   c           
        [        U 5      nUR                  SSSSSSS.5        UR                  SSSS	S
SS.5        UR                  SSSSSSSS.S9  UR                  R	                  5        nUR                  S5      R                  5       S   nS S S 5        SnWU:H  oU(       d  [        R                  " SU4SX445      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =pTg ! , (       d  f       N= f)N
dec_activer|   rb   r   z
Decision Az Feature X is enabled for launch.)rf   r?   rx   r   rz   r{   	dec_inboxrd   z
Decision Bz$Feature X is not enabled for launch.r   
   g?gGz?g      ?F)candidate_age_daysmax_candidatesconflict_thresholddedupe_high_thresholddedupe_mid_thresholdpromote_confidencellm_enabled)configz.SELECT COUNT(*) AS count FROM memory_conflictscountr   rA   r   	conflictsr   rL   rM   )r   r   consolidate_candidatesstore
connectionexecutefetchonerP   rT   rU   rV   rW   rQ   rR   rS   )r   r0   connr.  r[   r   r^   r_   s           r   &test_conflicts_only_for_selected_typesr5    s%   8$G!9	
	 !=	
	 """# "%%)$("% 
 # 
 
	!	!	#tLL!QR[[]^ef	 
$ 9>999 
$	#s   -#E
Ec                x   U S-  n[        [        U5      5      nUR                  SSS9  [        [        5      R                  5       R                  S   S-  S-  n[        R                  R                  5       n[        U5      US'   S	US
'   SUS'   [        R                  " [        U5      SSS/SSSUS9n[        [        U5      5      nUR                  S5      nUR                  SS9nSoR                  oU
;   o(       d  [        R                   " SU4SX45      [        R"                  " U	5      S[$        R&                  " 5       ;   d  [        R(                  " U5      (       a  [        R"                  " U5      OS[        R"                  " U
5      S.-  nSSU0-  n[+        [        R,                  " U5      5      eS =n	=pUS   n	SoU:H  o(       do  [        R                   " SU4SX45      [        R"                  " U	5      [        R"                  " U5      S.-  nSSU0-  n[+        [        R,                  " U5      5      eS =n	=pU(       dp  S S!S"[$        R&                  " 5       ;   d  [        R(                  " U5      (       a  [        R"                  " U5      OS"0-  n[+        [        R,                  " U5      5      eg )#Nr   r   r  r  r   scriptszrun-maintenance-daemon.shDB_PATH1INTERVAL_SECONDS0JITTER_SECONDSz--oncez--job-idT)capture_outputtextcheckenvr	  z"status": "completed"r   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.stdout
}result)r=   rK   rM   r   r   r  r  rA   rC   rD   rF   rG   r  r   r   )r
   r   r  r   __file__resolveparentsosenvironcopy
subprocessr   r  r  stdoutrP   rT   rQ   rU   rV   rW   rR   rS   )r   r  r0   scriptr@  rA  r  r  r   rX   r   r[   r_   r   rZ   r\   r]   r  s                     r   ;test_run_maintenance_daemon_wrapper_runs_from_repo_checkoutrK    s   ))GCL)G""#?Mh"i(^##%--a09<?ZZF
**//
C\C	N!CC^^	Vh
,HIF c'l+I

'
'(D
EC**2N*OD"3mm3m33333"333"333333f3333f333m3333333},,,,,,,,,,,,,,,,,,,,KKKKKK4KKKK4KKKKKK4r   c                 \   [        [        5      R                  5       R                  S   S-  S-  S-  n U R	                  5       nU R
                  o"" 5       o3(       d  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =p#SoUU;   of(       d  [        R                  " S	U4S
XQ45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =pVg )Nr   systemduserz#agents-database-maintenance.servicezAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}service_file)r   r   rE   zDExecStart=/mnt/rpi/agents-database/scripts/run-maintenance-daemon.shr   r   r{   rJ   rL   rM   )r   rB  rC  rD  	read_textexistsrU   rV   rP   rW   rQ   rR   rS   rT   )	rO  r{   r   rZ   r\   rX   r[   r^   r_   s	            r   1test_versioned_maintenance_systemd_service_existsrR    s   >))+33A6BVKNssL$$&G          <    <             Q\U\\\\\\Q\\\Q\\\\\\U\\\\\U\\\\\\\\r   c                   [        U 5      nUR                  R                  5        nUR                  SSSSSSSSS	S
SSSSSSS UR                  R	                  SSSS.5      45        UR                  SSSSSSSSSUR                  R	                  SSS.5      4	5        UR                  S5        UR                  SSSSSSUR                  R	                  S S05      S SS SS45        S S S 5        UR                  5         UR                  R                  5        nUR                  S!5      R                  5       nUR                  S"5      R                  5       nUR                  S#5      R                  5       nS S S 5        S nWULow(       d  [        R                  " S$U4S%X645      S&[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS&[        R                  " U5      S'.-  nS(S)U0-  n	[        [        R                  " U	5      5      eS =pvS nWULow(       d  [        R                  " S$U4S%XF45      S*[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS*[        R                  " U5      S'.-  nS(S)U0-  n	[        [        R                  " U	5      5      eS =pvS nWUL ow(       d  [        R                  " S+U4S,XV45      S-[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS-[        R                  " U5      S'.-  nS(S)U0-  n	[        [        R                  " U	5      5      eS =pvg ! , (       d  f       GN= f! , (       d  f       GN>= f).NaL  
            INSERT INTO memories (
                id, type, scope, status, source_kind, title, content, summary, confidence, freshness,
                created_at, updated_at, observed_at, source_ref, evidence_ref, embedding_json, metadata_json
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            
legacy_runr   r8   r   r   zResearch run: Legacy cleanupzCGoal: Legacy cleanup
Scope: Repo
Assumptions: None
Summary: PendingPendingr  g?z2026-03-19T00:00:00+00:00zpersonal-agent:run:run-123r   r   r   )legacy_systemlegacy_kindlegacy_run_idz
            INSERT INTO tasks (
                id, title, intent, kind, status, priority, created_at, updated_at, metadata_json
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
            task_legacyzLegacy taskz
migrate mer   open   )rW  rX  a  
            CREATE TABLE approvals (
                id TEXT PRIMARY KEY,
                task_id TEXT NOT NULL,
                kind TEXT NOT NULL,
                status TEXT NOT NULL,
                risk_level TEXT NOT NULL,
                payload_json TEXT NOT NULL,
                resolution_note TEXT,
                requested_at TEXT NOT NULL,
                resolved_at TEXT,
                created_at TEXT NOT NULL,
                updated_at TEXT NOT NULL
            )
            z
            INSERT INTO approvals (
                id, task_id, kind, status, risk_level, payload_json, resolution_note, requested_at, resolved_at, created_at, updated_at
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            approval_legacymergependingmediumkindz.SELECT * FROM memories WHERE id = 'legacy_run'z,SELECT * FROM tasks WHERE id = 'task_legacy'zJSELECT name FROM sqlite_master WHERE type = 'table' AND name = 'approvals')is not)z%(py0)s is not %(py3)slegacy_memoryr   rL   rM   legacy_taskr   )z%(py0)s is %(py3)sapprovals_table)r   r0  r1  r2  r   
migrate_v2r3  rP   rT   rU   rV   rW   rQ   rR   rS   )
r   r0   r4  rb  rc  rd  r[   r   r^   r_   s
             r   <test_migrate_v2_rewrites_legacy_rows_and_drops_legacy_tablesrf    s   8$G		!	!	#t .X+++,,##6FWe  yB  %C  D#	
6 	 ++##FY$WX
	
$ 		
" 	 "##VW$56+++	
 
$h 		!	!	#t%UV__all#QR[[],,X

(* 	 
$ !%$=$$$$$=$$$$$$=$$$$=$$$$$$$$$$"";d""""";"""""";"""";"""d"""""""""?d"""""?""""""?""""?"""d""""""" 
$	#l 
$	#s   CNAN.
N+.
N=)r   r   returnr
   )r"   r   r   r   r   zdict | Nonerg  ztuple[int, dict])r0   r
   rg  ztuple[ThreadingHTTPServer, str])r   r   rg  None)rg  rh  )3
__future__r   builtinsrU   _pytest.assertion.rewrite	assertionrewriterP   r   rE  rH  r+   pathlibr   urllib.errorr   urllib.requestr   r   http.serverr   shared_agent_memoryr	   r
   shared_agent_memory.http_apir   shared_agent_memory.schemar   r   r&   r5   r`   ro   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r5  rK  rR  rf   r   r   <module>rv     s    "    	    " + + ; 6 5; .34 L+OI*+-\ F;DJ&B(V*0. (($N6]a#r   