
    ih                       d dl mZ d dlZd dlZd dlZd dl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 dd	lmZ ddZddZddZddZ ed           G d d                      Z G d d          ZdS )    )annotationsN)	dataclass)UTCdatetime	timedelta)Any)urlparse   )SCHEMA_VERSION)SQLiteStorereturnstrc                 X    t          j        t                                                    S N)r   nowr   	isoformat     ?/Users/sebas/agents-database/src/shared_agent_memory/service.pyutcnowr      s    <&&(((r   prefixc                <    |  dt          j                    j         S )N_)uuiduuid4hex)r   s    r   make_idr      s    ))tz||')))r   valuec                t    d                     |                                                                           S )N )joinlowersplit)r   s    r   normalize_textr$      s(    88EKKMM''))***r   contentlabelc                    | d}|                                  D ]B}|                    |          r+|t          |          d                                          c S CdS )N: )
splitlines
startswithlenstrip)r%   r&   r   lines       r   _line_valuer/      sm    [[[F""$$ / /??6"" 	/F&,,.....	/2r   T)slotsc                  T    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ddZdS )SearchResultdict[str, Any]memoryfloatscorer   explanationfacet_scorelexical_scoresemantic_scorer   c                    | j         | j        | j        | j        | j        | j         d         | j         d         d| j         d         | j         d         | j        dS )N
confidence	freshness)facetlexicalsemanticr<   r=   scopeevidence_ref)r4   r6   score_breakdownmatched_scoperB   r7   )r4   r6   r8   r9   r:   r7   )selfs    r   as_dictzSearchResult.as_dict-   sg    kZ)- /"k,7![5    "[1 K7+
 
 	
r   Nr   r3   )__name__
__module____qualname____annotations__rF   r   r   r   r2   r2   $   so         LLL
 
 
 
 
 
r   r2   c                  d   e Zd ZddZddZdd	ZddZ	 dddZ	 	 	 	 dddZ	 ddd%Z	dd(Z
dd*Z	 ddd-Zdd/Zdd0Zdd2Zdd4Zd5dddddddddddddd6d7ddCZddDZdddIZdddLZdddNZd$dOdPddddddddddddQdd[Zdd\Zddddd6d]dd_Zddddddd`ddaZdddbddeZddfZdddgddiZddd6djddkZdld5ddddmddqZddrZdd6dsddtZ dduddvZ!ddwZ"ddxZ#ddyZ$dd|Z%ddZ&ddZ'ddZ(ddZ)ddZ*ddZ+dddddZ,ddZ-dddddddddZ.ddZ/ddddddZ0ddZ1dddd dZ2ddZ3ddZ4ddZ5ddZ6ddZ7ddZ8ddZ9ddZ:ddZ;ddZ<dddZ=ddZ>ddZ?d	dZ@d
ddZAddZBddZCddZDddÄZEddƄZFdd˄ZGdd̈́ZHddЄZIddӄZJdS (  MemoryServicedb_pathr   r   Nonec                    t          |          | _        | j                                         |                                  |                                  d S r   )r   store
initialize
migrate_v2_ensure_default_jobs)rE   rN   s     r   __init__zMemoryService.__init__?   sM     ))

!!#####r   memory_inputr3   c                   t                      }t          |                    d          pi           }|                    d          }|                    d          }|                    d          }|                    d          }|                    d          p|rt          |          j        nd }|                    d          p)|                    d          p|                    d          }	i d	|                    d	t          d
                    d|                    dt                    d|d         d|d|d         d|                    dd          d|                    d          d|                    d          d|                    d          d|	d|d|d|d|d|                    dd          d|d         d|d         |                    d          p|                     |d                   t          |                    dd                    t          |                    dd                    |                    d|          ||                    d|          |                    d          |                    d          | 	                    |                    d                    | j
                            |          d
}
| j
                                        5 }|                    d |
           |                     ||
           d d d            n# 1 swxY w Y   |                     |
d	                   S )!Nmetadatasubtyperun_idtask_idurldomainorigin_agentagent_ididmemschema_versiontyperA   statusactive
project_idrepo_idsource_kindmanualtitler%   summaryr<         ?r=   
created_atobserved_at
source_refrB   	embedding)
rk   r<   r=   rm   
updated_atrn   ro   rB   embedding_jsonmetadata_jsona1  
                INSERT OR REPLACE INTO memories (
                    id, schema_version, type, subtype, scope, status, project_id, repo_id, agent_id, origin_agent,
                    run_id, task_id, url, domain, source_kind, title, content, summary, confidence, freshness,
                    created_at, updated_at, observed_at, source_ref, evidence_ref, embedding_json, metadata_json
                ) VALUES (
                    :id, :schema_version, :type, :subtype, :scope, :status, :project_id, :repo_id, :agent_id, :origin_agent,
                    :run_id, :task_id, :url, :domain, :source_kind, :title, :content, :summary, :confidence, :freshness,
                    :created_at, :updated_at, :observed_at, :source_ref, :evidence_ref, :embedding_json, :metadata_json
                )
                )r   dictgetr	   netlocr   r   _make_summaryr5   _encode_embeddingrQ   dumps
connectionexecute_upsert_fts
get_memory)rE   rV   r   rX   rY   rZ   r[   r\   r]   r^   recordconns               r   create_memoryzMemoryService.create_memoryE   s   hh((44:;;""9--!!(++""9--u%%!!(++V0U0D0DQU#''77w8<<;W;Ww[g[k[klv[w[w
,""488
l../?PP
 L(
 w	

 \'*
 l&&x::
 ,**<88
 |''	22
 ((44
 L
 f
 w
 3
 f
 <++M8DD
  \'*!
" |I.#
$ $''	22ad6H6HV_I`6a6a 0 0s C CDD|//SAABB&**<=='++M3??&**<88(,,^<<"44\5E5Ek5R5RSS!Z--h777
 
 
: Z""$$ 	+LL
    T6***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+  vd|,,,s   =-L66L:=L:c                ,    |                      |          S r   )r   )rE   rV   s     r   ingestzMemoryService.ingest}   s    !!,///r   ro   rA   r%   rX   r   c                8    |                      dd||||          S )Nsession_closeruntrigger_typerh   ro   rA   r%   rX   _capture_source)rE   ro   rA   r%   rX   s        r   capture_sessionzMemoryService.capture_session   s1    ##(! $ 
 
 	
r   manual_importcapture_modec                D    d|i|}|                      dd||||          S )Nr   conversation_captureconversationr   r   )rE   ro   rA   r%   r   rX   s         r   capture_conversationz"MemoryService.capture_conversation   sB     #L=H=##/&! $ 
 
 	
r   N
   Fqueryscopeslist[str] | Nonefiltersdict[str, Any] | Nonelimitintinclude_inboxboolc                |    |pi }d t          |                                          D             }dg}g }|rK|                    dd                    d |D                        d           |                    |           |s*|                    d           |                    d           |                                         ||                      j                                        5 }	 fd	|	                    d
                    |          |          D             }
d d d            n# 1 swxY w Y   g }|r 	                    |          ng }|
D ]}t          d
                    |d         |d         |d         g                    } 
                    ||          }|r)                     ||                    d                    nd}                     ||          }|r|dk    r|dk    r|dk    r|dz  |dz  z   |dz  z   |d         dz  z   |d         dz  z   }d|dd|dd|dd|d         dd|d         d
}|                    t          ||||||                     t          |d d           d |         }d! |D             }t!          d"          } j                                        5 }	|	                    d#|| j                            |||d$           j                            |          t%                      f           d d d            n# 1 swxY w Y   ||d%S )&Nc                    g | ]}||S r   r   ).0terms     r   
<listcomp>z(MemoryService.search.<locals>.<listcomp>   s    NNNNtNNNr    SELECT * FROM memories WHERE 1=1zAND scope IN (,c              3     K   | ]}d V  dS ?Nr   r   r   s     r   	<genexpr>z'MemoryService.search.<locals>.<genexpr>   s"      0E0E0E0E0E0E0E0Er   )AND status = ?re   c                :    g | ]}                     |          S r   _row_to_memoryr   rowrE   s     r   r   z(MemoryService.search.<locals>.<listcomp>   s'    \\\D'',,\\\r   r    rj   rk   r%   rp           r   g?g333333?g333333?r<   gQ?r=   g{Gz?zfacets=z.2fz	 lexical=z
 semantic=z confidence=z freshness=c                r    | j         | j        | j        | j        d         | j        d         | j        d         fS )Nr<   r=   rq   )r8   r9   r:   r4   )items    r   <lambda>z&MemoryService.search.<locals>.<lambda>   s9     "#L)K(L) r   T)keyreversec                6    g | ]}|                                 S r   )rF   r   r   s     r   r   z(MemoryService.search.<locals>.<listcomp>   s     666d4<<>>666r   retzjINSERT INTO retrieval_logs (id, query_text, filters_json, results_json, created_at) VALUES (?, ?, ?, ?, ?))r   r   r   )retrieval_idresults)r$   r#   appendr!   extend_memory_filter_sqlrQ   rz   r{   _text_embedding_lexical_score_semantic_scoreru   _facet_scorer2   sortedr   ry   r   )rE   r   r   r   r   r   query_termssqlparamsr   rowsr   query_embeddingr   haystackr?   r@   r>   r6   r7   orderedpayloadr   s   `                      r   searchzMemoryService.search   s`    -RNNu(=(=(C(C(E(ENNN12 	"JJH0E0Ef0E0E0E(E(EHHHIIIMM&!!! 	$JJ'(((MM(###d--c7;;<<<Z""$$ 	]\\\\SXXc]]TZ8[8[\\\D	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] ')9DL$..u555" 	\ 	\C%chhGc)ncR[n/]&^&^__H))+x@@GVajt++OSWW[=Q=QRRRgjH%%c733E w!||A%1**DL7S=08d?BSEVY]E]]`cdo`psw`wwEW%T W WgT W WXT W W!,/VW W@CK@PVW W  NN<UKQYZZ[[[[  
 
 
 5& 76g666u~~Z""$$ 
	LL| J$$7]j%k%kllJ$$W--HH	 	 	
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 !-AAAs%   16D33D7:D7AL..L25L2project
str | Nonerepoagenttaskc                   |                      dddd          }||d}|                      d|rdnd d||d	          }|                      d||d
          }d |D             d d
         }|                      dd||d          }	|                      dd|||d          }
|r&|
s$|                     |i |ddid          d         }
d g ||||	D             }||||	|
||dS )Nre   globalprofile   )rd   rA   memory_typer   )rf   rg   r   decision)rd   rA   r   rf   rg   r      )rd   rf   rg   r   c                &    g | ]}|d          dv |S )rc   >   episoder   artifactr   r   r   s     r   r   z-MemoryService.context_for.<locals>.<listcomp>   s0      A  A  ATfQAADAAAr   r   r   )rd   r   rf   rg   r   r   )rd   r   rf   rg   r[   r   rc      )r   r   r   c                P    g | ]#}t          |t                    rd |v |d          $S )r`   )
isinstancert   r   s     r   r   z-MemoryService.context_for.<locals>.<listcomp>   sA     
 
 
$%%
 +/$,, J*6,,r   )profile_factsproject_memoriesactive_decisionsrecent_episodestask_relevant_artifacts	citationsr_   )list_memoriesr   )rE   r   r   r   r   r   project_filtersr   r   r   r   r   s               r   context_forzMemoryService.context_for   s    **((Xaij*kk)0TBB--&0))D" . 
 
  --	 . 
 
 A  A-=  A  A  A  BE  CE  BE  F,,! - 
 
 #'"4"4" #5 #
 #
  	}/ 	}&*kk$@g?@gTZ\f@g@gopk&q&qr{&|#
 
`-`*:`=M`P_`
 
 
	 + 0 0.'>"
 
 	
r   inbox_items	list[str]c                6   g }g }| j                                         5 }|D ][}|                    d|f                                          }|/|                     |          }|                    d||d         |d         |d         f                                          }|rt          d          }	|                    d|	||d         d	t                      | j                             d
di          f           |                    ddt                      |f           |                    ||d         d	d           !|                    ddt                      |f           |                    |           ]	 d d d            n# 1 swxY w Y   ||dS )N#SELECT * FROM memories WHERE id = ?a  
                    SELECT id FROM memories
                    WHERE id != ?
                      AND status = 'active'
                      AND type = ?
                      AND scope = ?
                      AND content = ?
                    LIMIT 1
                    rc   rA   r%   lnkz
                        INSERT INTO memory_links (id, from_memory_id, to_memory_id, relation, created_at, metadata_json)
                        VALUES (?, ?, ?, ?, ?, ?)
                        r`   
related_toreasonexact_duplicate;UPDATE memories SET status = ?, updated_at = ? WHERE id = ?archived)fromtorelationre   )promotedlinked)	rQ   rz   r{   fetchoner   r   r   ry   r   )
rE   r   r   r   r   	memory_idr   r4   	duplicatelink_ids
             r   consolidatezMemoryService.consolidate  s    ')Z""$$ &	+( %+ %+	ll#H9,WW``bb;,,S11 LL vw	ARS  (**   %ennGLL
 $%%dO("HH J,,h8I-JKK   LL!^akmsmumu  xA  aB  C  C  CMM9IdOYe"f"fgggZ]egmgogoqz\{|||	****K%+&	+ &	+ &	+ &	+ &	+ &	+ &	+ &	+ &	+ &	+ &	+ &	+ &	+ &	+ &	+N %777s   E FFFconfigc               <    ddddddd}t          |                    dd                    }t          |                    dd                    }t          |                    dd                    }t          |                    d	d
                    }t          |                    dd                    }t          |                    dd                    }t          |                    dd                    }	|                    d          pd}
|                    d          pg d}t	          j        t                    t          |          z
                                  } j	        
                                5 }|                    d||f                                          } fd|D             }t          |          |d<   |D ]}|                    d|d         |d         |d         f                                          } fd|D             }d }d}|D ]}                     t          |d                                                   t          |d                             }                     |                    d           pg |                    d                     }|dk    r|n
|d!z  |d"z  z   }||k    r|}|}|r|d         |d         k    rr                     ||d         |d         d#d$           |                    d%d&t'                      |d         f           |d&xx         d'z  cc<   |d(xx         d'z  cc<   |rx||k    rr                     ||d         |d         d#d)           |                    d%d&t'                      |d         f           |d&xx         d'z  cc<   |d(xx         d'z  cc<    |r||k    r|	r                     |||
|*          }|r~|                    d+|t'                       j	                            i |                    d,i           |d         |d         g|
|d-          |d         f           |d.xx         d'z  cc<                        ||d         |d         d#d/           |d(xx         d'z  cc<   |ru||k    ro                     ||          rY                     ||d         |d         d0                                ||d         |d         d1d2           |d3xx         d'z  cc<   |d4         d5k    rU|                    d6d          |k    r;|                    d%d7t'                      |d         f           |d8xx         d'z  cc<   	 d d d            n# 1 swxY w Y   |S )9Nr   )
candidatesr   r   r   	conflictsllm_summariescandidate_age_days   max_candidates   dedupe_high_threshold?dedupe_mid_threshold      ?promote_confidenceffffff?conflict_threshold皙?llm_enabledFllm_provideropencodellm_commandr  z-mzMiniMax M2.5 Freedaysa-  
                SELECT * FROM memories
                WHERE (
                    status = 'inbox'
                    OR (type = 'episode' AND status = 'active')
                )
                  AND created_at <= ?
                ORDER BY created_at ASC
                LIMIT ?
                c                :    g | ]}                     |          S r   r   r   s     r   r   z8MemoryService.consolidate_candidates.<locals>.<listcomp>^  s'    CCCs$--c22CCCr   r   a  
                    SELECT * FROM memories
                    WHERE status = 'active'
                      AND id != ?
                      AND type = ?
                      AND scope = ?
                    ORDER BY updated_at DESC
                    LIMIT 50
                    r`   rc   rA   c                :    g | ]}                     |          S r   r   r   s     r   r   z8MemoryService.consolidate_candidates.<locals>.<listcomp>n  s'    #P#P#PD$7$7$<$<#P#P#Pr   r   r%   rp   g333333?g?r   r   r   r   r
   r   high_similarity)providercommandzOUPDATE memories SET summary = ?, updated_at = ?, metadata_json = ? WHERE id = ?rX   )synthesis_sourcessynthesis_providersynthesis_commandr   mid_similaritypotential_contradictioncontradicts	heuristicr   rd   inboxr<   re   r   )r   ru   r5   r   r   r   r   r   r   rQ   rz   r{   fetchallr,   r   r$   r#   r   _link_memoriesr   _llm_summarize_pairry   _conflict_signal_record_conflict)rE   r   statsage_daysr   high_thresholdmid_thresholdpromote_thresholdr  r
  r  r  cutoffr   r   r   	candidaterelatedrelated_memories
best_match
best_scoreotherr?   r@   r6   synthesizeds   `                         r   consolidate_candidatesz$MemoryService.consolidate_candidates;  s   
 
 vzz"6::;;VZZ(8#>>??vzz*A3GGHHfjj)?FFGG!&**-A3"G"GHH"6::.BD#I#IJJ6::mU;;<<zz.11?Zjj//Z3Z3Z3Z,s##iX&>&>&>>IIKKZ""$$ i	+<<	 (  hjj  DCCCdCCCJ"%j//E,' W+ W+	,, t_i&779KL  (**  $Q#P#P#P#P#P#P !
 
- 	+ 	+E"11&y';<<BBDD&uY'788 G  $33IMM+4N4N4TRTV[V_V_`kVlVlmmH'/3GGWs]XX[^=[Ez))%*
%*
 )I"6*Y:O"O"O''ioz$?OQ]_pqqqLLU#VXXy?   *%%%*%%%(OOOq(OOO *">">''ioz$?OQ]_pqqqLLU#VXXy?   *%%%*%%%(OOOq(OOO )*"="=" 8&*&>&>%&%1$/	 '? ' ' ' 8 LL q$/$*HH$(J$4$4)*.7mmJ.K.K)*BKD/S]^bScAdBNAL	)* )* )*%& %& %.dO!"    "/222a7222''ioz$?OQ]_oppp(OOOq(OOO ,*0B"B"BtG\G\]fhrGsGs"B))$	$DAQSlmmm''ioz$?OQ^`klll+&&&!+&&&X&'11immLRU6V6VZk6k6kLLU!688Yt_=   *%%%*%%%oW+%i	+ i	+ i	+ i	+ i	+ i	+ i	+ i	+ i	+ i	+ i	+ i	+ i	+ i	+ i	+V s   O?VVVrj   rB   c                h    |                      dd|||                     |          ||ddid          S )Nr   r   kindprofile_fact)rc   rA   rj   r%   rk   ro   rB   rX   )r   rw   )rE   rj   r%   rB   ro   s        r   upsert_profile_factz!MemoryService.upsert_profile_fact  sQ     !!!!"--g66( ,#^4	 	
 
 	
r   
identifierc           	        | j                                         5 }|                    d|f                                          }|r\d|d         |d         | j                             |d                   | j                             |d                   dcd d d            S |                    d|f                                          }|rg|                     |          }|                    d	|d
         |d
         f                                          }d|d |D             dcd d d            S 	 d d d            n# 1 swxY w Y   t          d|           )Nz)SELECT * FROM retrieval_logs WHERE id = ?	retrievalr`   
query_textfilters_jsonresults_json)r2  r`   r8  r   r   r   z4SELECT * FROM sources WHERE source_ref = ? OR id = ?ro   r4   c                ,    g | ]}t          |          S r   rt   )r   sources     r   r   z)MemoryService.explain.<locals>.<listcomp>  s    DhDhDhV\T&\\DhDhDhr   )r2  r4   sourceszUnknown identifier: )rQ   rz   r{   r   loadsr   r  KeyError)rE   r5  r   r7  r4   ra   r>  s          r   explainzMemoryService.explain  s   Z""$$ 	j%PS]R_``iikkI '#D/"+L"9#z//	.0IJJ#z//	.0IJJ 	j 	j 	j 	j 	j 	j 	j 	j \\"G*WW``bbF j))&11,,']`cdp`qsv  xD  tE  `F  G  G  P  P  R  R (CDhDh`gDhDhDhii	j 	j 	j 	j 	j 	j 	j 	jj	j 	j 	j 	j 	j 	j 	j 	j 	j 	j 	j 	j 	j 	j 	j :j::;;;s   A;E"BEEEc                    g d}i }| j                                         5 }|D ];}|                    d|                                           }d |D             ||<   <	 d d d            n# 1 swxY w Y   |S )Nprojectsreposr>  ingestion_eventsmemoriesmemory_linksmemory_conflictsretrieval_logsmaintenance_jobsmaintenance_runsprofilestasks	task_runs	artifactszSELECT * FROM c                ,    g | ]}t          |          S r   r<  r   r   s     r   r   z(MemoryService.export.<locals>.<listcomp>  s    "="="=499"="="=r   rQ   rz   r{   r  )rE   tablesexportedr   tabler   s         r   exportzMemoryService.export  s    
 
 
  57Z""$$ 	> > >||$<U$<$<==FFHH"="="="="=>	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> s   ?A,,A03A0r   c           	     (  	 g d}| j                                         5 }|D ]}|                    |g           }|st          |d                                                   	d                    d 	D                       }d| dd                    	           d| d}|                    |	fd	|D                        |d
k    r|D ]}|                     ||           	 d d d            n# 1 swxY w Y   |                                  d S )NrC  r   r   c              3     K   | ]}d V  dS r   r   r   s     r   r   z,MemoryService.import_data.<locals>.<genexpr>  s"      &<&<qs&<&<&<&<&<&<r   zINSERT OR REPLACE INTO z (z
) VALUES (r   c                H    g | ]t          fd D                       S )c              3  B   K   | ]}                     |          V  d S r   ru   )r   colr   s     r   r   z7MemoryService.import_data.<locals>.<listcomp>.<genexpr>  s-      ,M,McSWWS\\,M,M,M,M,M,Mr   )tuple)r   r   columnss    @r   r   z-MemoryService.import_data.<locals>.<listcomp>  s8    &^&^&^RUu,M,M,M,MW,M,M,M'M'M&^&^&^r   rG  )	rQ   rz   ru   listkeysr!   executemanyr|   rS   )
rE   r   rT  r   rV  r   placeholderr   r   r_  s
            @r   import_datazMemoryService.import_data  s   
 
 
  Z""$$ 	4 
4 
4{{5"-- tAw||~~..!hh&<&<G&<&<&<<<ddd'9J9JddVaddd  &^&^&^&^Y]&^&^&^___J&&# 4 4((s3333
4	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	s   CC33C7:C7r   c                   | j                                         5 }|                    d|f                                          }|t	          |          |                     |          cd d d            S # 1 swxY w Y   d S )Nr   )rQ   rz   r{   r   r@  r   )rE   r   r   r   s       r   r}   zMemoryService.get_memory  s    Z""$$ 	,,,DylSS\\^^C{y)))&&s++		, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,   AA66A:=A:re   2   )rd   rA   r   rY   rf   rg   ro   rB   rZ   r[   r^   r\   r]   rX   r   rd   r   rY   rf   rg   rZ   r[   r^   r\   r]   list[dict[str, Any]]c               F    dg}g }|*|                     d           |                     |           |*|                     d           |                     |           |||||||	|
|||d}|                                         |d |                                D                                  |pi                                 D ]4\  }}|                     d           |                    d| |f           5|                     d           |                     |            j                                        5 }|                    d	                    |          |                                          } fd
|D             cd d d            S # 1 swxY w Y   d S )Nr   r   zAND scope = ?)rc   rY   rf   rg   ro   rB   rZ   r[   r^   r\   r]   c                    i | ]
\  }}|||S r   r   r   r   r   s      r   
<dictcomp>z/MemoryService.list_memories.<locals>.<dictcomp>D  s$    3v3v3v:3diduCdududur   z&AND json_extract(metadata_json, ?) = ?z$.z ORDER BY updated_at DESC LIMIT ?r    c                :    g | ]}                     |          S r   r   r   s     r   r   z/MemoryService.list_memories.<locals>.<listcomp>L  s'    ===D'',,===r   )	r   r   r   itemsrQ   rz   r{   r!   r  )rE   rd   rA   r   rY   rf   rg   ro   rB   rZ   r[   r^   r\   r]   rX   r   r   r   r   r   r   r   r   s   `                      r   r   zMemoryService.list_memories  s   & 22JJ'(((MM&!!!JJ'''MM%   $$((
 
 	d--c3v3vQXQ^Q^Q`Q`3v3v3vwwxxx#>r0022 	/ 	/JCJJ?@@@MM:::u-....

5666eZ""$$ 	><<v66??AAD=======	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s    A	FFFc                    | j                                         5 }|                    d                                          }d |D             cd d d            S # 1 swxY w Y   d S )NzRSELECT * FROM ingestion_events WHERE job_state = 'pending' ORDER BY created_at ASCc                ,    g | ]}t          |          S r   r<  rR  s     r   r   z5MemoryService.list_pending_events.<locals>.<listcomp>Q  s    ...#DII...r   rS  rE   r   r   s      r   list_pending_eventsz!MemoryService.list_pending_eventsN  s    Z""$$ 	/<< tuu~~  A  AD.....	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   3AA!Aevent_idstateoutcomeerror_messagec           
         | j                                         5 }|                    d|||t                      t                      |f           d d d            d S # 1 swxY w Y   d S )Nz
                UPDATE ingestion_events
                SET job_state = ?, processor_outcome = ?, error_message = ?, updated_at = ?, processed_at = ?
                WHERE id = ?
                )rQ   rz   r{   r   )rE   rs  rt  ru  rv  r   s         r   
mark_eventzMemoryService.mark_eventS  s    Z""$$ 	LL
 &((HM  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   5AA #A namedescriptionc           	         t                      }| j                                        5 }|                    d|||||f           d d d            d S # 1 swxY w Y   d S )NzfINSERT OR REPLACE INTO projects (id, name, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?)r   rQ   rz   r{   )rE   rf   ry  rz  r   r   s         r   create_projectzMemoryService.create_project^  s    hhZ""$$ 	LLxT;S9  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAApathc           
         t                      }| j                                        5 }|                    d||||||f           d d d            d S # 1 swxY w Y   d S )NzkINSERT OR REPLACE INTO repos (id, project_id, name, path, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)r|  )rE   rg   ry  rf   r~  r   r   s          r   create_repozMemoryService.create_repof  s    hhZ""$$ 	LL}*dD#s;  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAAopen   )r2  rd   priorityrf   rg   parent_task_idoriginowner_agentblocked_reasonrequires_human_inputdue_atrX   r[   rZ   intentr2  r  r  r  r  r  r  r  c                  t                      }i d|pt          d          dt          d|d|d|d|d|d	|d
|d|d|d|	d|
d|d|rdndd|d||| j                            |pi           d}| j                                        5 }|                    d|           d d d            n# 1 swxY w Y   |                     |d                   S )Nr`   r   rb   rZ   rj   r  r2  rd   r  rf   rg   r  r  r  r  r  r
   r   r  rm   )rq   rs   a  
                INSERT INTO tasks (
                    id, schema_version, run_id, title, intent, kind, status, priority, project_id, repo_id,
                    parent_task_id, origin, owner_agent, blocked_reason, requires_human_input, due_at,
                    created_at, updated_at, metadata_json
                ) VALUES (
                    :id, :schema_version, :run_id, :title, :intent, :kind, :status, :priority, :project_id, :repo_id,
                    :parent_task_id, :origin, :owner_agent, :blocked_reason, :requires_human_input, :due_at,
                    :created_at, :updated_at, :metadata_json
                )
                )r   r   r   rQ   ry   rz   r{   get_task)rE   rj   r  r2  rd   r  rf   rg   r  r  r  r  r  r  rX   r[   rZ   r   r~   r   s                       r   create_taskzMemoryService.create_taskn  s   ( hh
',WV__
n
 f
 U	

 f
 D
 f
 
 *
 w
 n
 f
 ;
 n
 #)=$DAA1
  f!
" ##
$ !Z--hn"=='
 
 
* Z""$$ 	LL
   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 }}VD\***s   B77B;>B;c                   | j                                         5 }|                    d|f                                          }|t	          |          |                     |          cd d d            S # 1 swxY w Y   d S )N SELECT * FROM tasks WHERE id = ?)rQ   rz   r{   r   r@  _row_to_task)rE   r[   r   r   s       r   r  zMemoryService.get_task  s    Z""$$ 	*,,AG:NNWWYYC{w'''$$S))		* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*rf  )rd   r  r  rZ   r   bool | Nonec                   dg}g }|*|                     d           |                     |           |*|                     d           |                     |           |.|                     d           |                     |rdnd           |*|                     d           |                     |           |                     d           |                     |            j                                        5 }|                    d	                    |          |                                          }	 fd
|	D             cd d d            S # 1 swxY w Y   d S )NzSELECT * FROM tasks WHERE 1=1r   zAND owner_agent = ?zAND requires_human_input = ?r
   r   zAND run_id = ?z-ORDER BY priority ASC, created_at ASC LIMIT ?r    c                :    g | ]}                     |          S r   r  r   s     r   r   z,MemoryService.list_tasks.<locals>.<listcomp>  s'    ;;;sD%%c**;;;r   r   rQ   rz   r{   r!   r  )
rE   rd   r  r  rZ   r   r   r   r   r   s
   `         r   
list_taskszMemoryService.list_tasks  s    //JJ'(((MM&!!!"JJ,---MM+&&&+JJ5666MM3:!!;;;JJ'(((MM&!!!

BCCCeZ""$$ 	<<<v66??AAD;;;;d;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<s   >A	EEE)rd   r  r  r  rX   rZ   c               <   |                      |          }|p|d         |d<   ||n|d         |d<   ||d<   ||n|                    d          |d<   |||d<   |||d<   | j                                        5 }	|	                    d|d         |d         |d         |d         rdnd	|                    d          t                      | j                            |d                   |f           d d d            n# 1 swxY w Y   |                      |          S )
Nrd   r  r  rZ   r  rX   z
                UPDATE tasks
                SET status = ?, owner_agent = ?, blocked_reason = ?, requires_human_input = ?, run_id = ?, updated_at = ?, metadata_json = ?
                WHERE id = ?
                r
   r   )r  ru   rQ   rz   r{   r   ry   )
rE   r[   rd   r  r  r  rX   rZ   r   r   s
             r   update_taskzMemoryService.update_task  s    }}W%%14>X-8-Dkk$}J]]!/#)#5488H;M;MX++?D'('DZ""$$ 	LL N')*45<AA1HHX&&HHJ$$T*%566	  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	$ }}W%%%s   :A8C>>DD)input_payloadrX   r_   r  c                  t                      }t          d          ||d| j                            |pi           d d |d ||| j                            |pi           d}| j                                        5 }|                    d|           d d d            n# 1 swxY w Y   |                     |d                   S )Nr   running)r`   r[   r_   rd   input_payload_jsonresult_summaryrv  
started_atcompleted_atrm   rq   rs   a  
                INSERT INTO task_runs (
                    id, task_id, agent_id, status, input_payload_json, result_summary, error_message,
                    started_at, completed_at, created_at, updated_at, metadata_json
                ) VALUES (
                    :id, :task_id, :agent_id, :status, :input_payload_json, :result_summary, :error_message,
                    :started_at, :completed_at, :created_at, :updated_at, :metadata_json
                )
                r`   )r   r   rQ   ry   rz   r{   get_task_run)rE   r[   r_   r  rX   r   r~   r   s           r   start_task_runzMemoryService.start_task_run  s    hh%.. "&*"2"2=3FB"G"G"! !Z--hn"==
 
 Z""$$ 	LL   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   ...s   8BB"Bc                   | j                                         5 }|                    d|f                                          }|t	          |          |                     |          cd d d            S # 1 swxY w Y   d S )Nz$SELECT * FROM task_runs WHERE id = ?)rQ   rz   r{   r   r@  _row_to_task_runrE   rZ   r   r   s       r   r  zMemoryService.get_task_run  s    Z""$$ 	.,,EyQQZZ\\C{v&&&((--		. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.rf  )r  rv  r  c          
         t                      }| j                                        5 }|                    d||||||f           d d d            n# 1 swxY w Y   |                     |          S )Nz
                UPDATE task_runs
                SET status = ?, result_summary = ?, error_message = ?, updated_at = ?, completed_at = ?
                WHERE id = ?
                )r   rQ   rz   r{   r  )rE   rZ   rd   r  rv  r   r   s          r   finish_task_runzMemoryService.finish_task_run"  s     hhZ""$$ 	LL
 S&I  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   (((s   AAA)r[   rd   r   c               
    dg}g }|*|                     d           |                     |           |*|                     d           |                     |           |                     d           |                     |            j                                        5 }|                    d                    |          |                                          } fd|D             cd d d            S # 1 swxY w Y   d S )Nz!SELECT * FROM task_runs WHERE 1=1AND task_id = ?r    ORDER BY created_at DESC LIMIT ?r    c                :    g | ]}                     |          S r   )r  r   s     r   r   z0MemoryService.list_task_runs.<locals>.<listcomp>C  '    ???3D))#..???r   r  )rE   r[   rd   r   r   r   r   r   s   `       r   list_task_runszMemoryService.list_task_runs6  sS   23JJ()))MM'"""JJ'(((MM&!!!

5666eZ""$$ 	@<<v66??AAD????$???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s   "A	C88C<?C<md)fmtrd   ro   rX   artifact_idartifact_typer  r  c       	        P   t                      }
|	pt          d          ||||||||
|
| j                            |pi           d}| j                                        5 }|                    d|           d d d            n# 1 swxY w Y   |                     |d                   S )Nart)r`   r[   r  rj   r%   formatrd   ro   rm   rq   rs   au  
                INSERT INTO artifacts (
                    id, task_id, artifact_type, title, content, format, status, source_ref, created_at, updated_at, metadata_json
                ) VALUES (
                    :id, :task_id, :artifact_type, :title, :content, :format, :status, :source_ref, :created_at, :updated_at, :metadata_json
                )
                r`   )r   r   rQ   ry   rz   r{   get_artifact)rE   r[   r  rj   r%   r  rd   ro   rX   r  r   r~   r   s                r   create_artifactzMemoryService.create_artifactE  s     hh/*$!Z--hn"==
 
 Z""$$ 
	LL 	 	 	
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	   ...s   BB	Bc                   | j                                         5 }|                    d|f                                          }|t	          |          |                     |          cd d d            S # 1 swxY w Y   d S )Nz$SELECT * FROM artifacts WHERE id = ?)rQ   rz   r{   r   r@  _row_to_artifact)rE   r  r   r   s       r   r  zMemoryService.get_artifactm  s    Z""$$ 	.,,E~VV__aaC{{+++((--		. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.rf  r[   r   c                   dg}g }|*|                     d           |                     |           |                     d           |                     |            j                                        5 }|                    d                    |          |                                          } fd|D             cd d d            S # 1 swxY w Y   d S )Nz!SELECT * FROM artifacts WHERE 1=1r  r  r    c                :    g | ]}                     |          S r   )r  r   s     r   r   z0MemoryService.list_artifacts.<locals>.<listcomp>~  r  r   r  )rE   r[   r   r   r   r   r   s   `      r   list_artifactszMemoryService.list_artifactst  s(   23JJ()))MM'"""

5666eZ""$$ 	@<<v66??AAD????$???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s   6A	CCC)r  c                   |                      |d          }d |D             d d         }|                      d|d          }|                     d          }|                     d          }||||dS )	Nrg  )r  r   c                &    g | ]}|d          dv |S )rd   >   r  draftin_progressr   )r   r   s     r   r   z4MemoryService.dashboard_snapshot.<locals>.<listcomp>  s'    lllhKk9k9k9k9k9kr      blocked)rd   r  r   )r   )active_tasksblocked_tasksrecent_runsrecent_artifacts)r  r  r  )rE   r  r  r  r  r  s         r   dashboard_snapshotz MemoryService.dashboard_snapshot  s    ;bIIlllllmpnpmpqykY[\\)))33..R.88(*& 0	
 
 	
r   c                \                          |          } j                                        5 }|                    d|f                                          }d d d            n# 1 swxY w Y   | fd|D                                  |d                               |d          dS )NzRSELECT * FROM tasks WHERE parent_task_id = ? ORDER BY priority ASC, created_at ASCc                :    g | ]}                     |          S r   r  r   s     r   r   z-MemoryService.task_bundle.<locals>.<listcomp>  s'    FFFC**3//FFFr   d   r  )r   childrenrunsrP  )r  rQ   rz   r{   r  r  r  )rE   r[   r   r   
child_rowss   `    r   task_bundlezMemoryService.task_bundle  s    }}W%%Z""$$ 	d
  hjj 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 FFFF:FFF''s'CC,,WC,HH	
 
 	
s   *A&&A*-A*c           	        | j                                         5 }|                     |d          }|                     |d          }|                    dt          f                                          d         }|                    dt          f                                          d         }|                    d                                          d         }|                    d                                          d         }|                     |d          }d d d            n# 1 swxY w Y   t          |||||||d	S )
N	approvalshandoffsa"  
                SELECT COUNT(*) AS count
                FROM memories
                WHERE schema_version != ?
                   OR json_extract(metadata_json, '$.legacy_kind') IS NOT NULL
                   OR json_extract(metadata_json, '$.legacy_system') IS NOT NULL
                counta  
                SELECT COUNT(*) AS count
                FROM tasks
                WHERE schema_version != ?
                   OR json_extract(metadata_json, '$.legacy_kind') IS NOT NULL
                   OR json_extract(metadata_json, '$.legacy_system') IS NOT NULL
                z&SELECT COUNT(*) AS count FROM memoriesz#SELECT COUNT(*) AS count FROM tasksrK  )rb   rG  rN  r  r  rK  legacy_memory_rowslegacy_task_rows)rQ   rz   _count_if_table_existsr{   r   r   )	rE   r   r  r  r  r  rG  rN  rK  s	            r   audit_v2zMemoryService.audit_v2  s   Z""$$ 	U33D+FFI224DDH!%  !	" 	" hjj	""  $||  !	  	  hjj	 " ||$LMMVVXXY`aHLL!FGGPPRRSZ[E#::4ASTT3	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U6 - "  0"4 0	
 	
 		
s   DD++D/2D/c                r
   |                                  }ddddd}| j                                        5 }|                    d                                          }|D ]}|                     t          |                    }|'|                    d|d         |d         |d         |d         |d	         |d
         |d         |d         |d         |d         t                      |d         f           |dxx         dz  cc<   |                    d                                          }|D ]v}|                     t          |                    }|'|                    d|d         |d	         |d         t                      |d         f           |dxx         dz  cc<   w| 	                    |d          r|                    d                                          D ]}t          |          }|                    d|d
         f          
                                }	|	D|                     |	          }
t          |
                    di                     }|d         |d         | j                            |d                   pi |d         |d         |d         |d         d |d!<   |                    d"| j                            |          t                      |d
         f           |                    d#t          d$          |d
         d%d&|d          t!          j        |d!         d'(          d)|d         d*k    rd+nd,d-t                      t                      | j                            i           f           |d.xx         dz  cc<   |                    d/           | 	                    |d0          r?|                    d1                                          D ]}t          |          }| j                            |d                   pi }|                    d#t          d$          |d
         d2d3|d4          d5|d6          t!          j        |d4         |d6         |d7         |d         ||d8         |d9         |d:         d;d'(          d)d,d-t                      t                      | j                            i           f           |d<xx         dz  cc<   |                    d=           d d d            n# 1 swxY w Y   |                                  }d>|||d?S )@Nr   )rG  rN  approval_artifactshandoff_artifactszSELECT * FROM memoriesa$  
                    UPDATE memories
                    SET schema_version = ?, type = ?, subtype = ?, origin_agent = ?, run_id = ?, task_id = ?,
                        url = ?, domain = ?, summary = ?, metadata_json = ?, updated_at = ?
                    WHERE id = ?
                    rb   rc   rY   r^   rZ   r[   r\   r]   rk   rs   r`   rG  r
   zSELECT * FROM tasksz
                    UPDATE tasks
                    SET schema_version = ?, run_id = ?, metadata_json = ?, updated_at = ?
                    WHERE id = ?
                    rN  r  zSELECT * FROM approvalsr  rX   r2  
risk_levelpayload_jsonrd   requested_atresolved_atresolution_note)r2  r  r   rd   r  r  r  approvalz
                        UPDATE tasks
                        SET metadata_json = ?, updated_at = ?
                        WHERE id = ?
                        a  
                        INSERT INTO artifacts (
                            id, task_id, artifact_type, title, content, format, status, source_ref, created_at, updated_at, metadata_json
                        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                        r  approval_resolutionz	Approval T)	sort_keysjsonpendingr   re   zmigration:v2r  zDROP TABLE approvalsr  zSELECT * FROM handoffsdelegation_notezHandoff 
from_agentz -> to_agentr   r  rv  r  )r  r  r   rd   r   r  rv  r  r  zDROP TABLE handoffsok)rd   beforeaftermigrated)r  rQ   rz   r{   r  _migrate_memory_rowrt   r   _migrate_task_row_table_existsr   r  ru   r?  ry   r   r  )rE   r  r  r   memory_rowsr   r~   	task_rowsr  task_rowr   rX   handoffr   r  s                  r   rS   zMemoryService.migrate_v2  s    !AQ]^__Z""$$ 	4,,'?@@IIKKK" * *11$s))<<> /0vy)~.x(y)ux(y)/t  , $$$)$$$$%:;;DDFFI  ' '//S		::>
 ,-vh/?AXZ`ZbZbdjkodpq   !!!Q&!!!!!!$44 .5<<(ABBKKMM ,8 ,8C#CyyH#||,NQYZcQdPfggpprrH' ,,X66D#DHHZ$<$<==H ( 0&.|&<#':#3#3H^4L#M#M#SQS"*8"4(0(@'/'>+34E+F, ,HZ( LL
 ))(33VXXx	?RS   LL $ENN$Y/1:(8:: Jx
';tLLL"*28*<	*I*IJJx*"HH"HH J,,R00  ( 1222a722223444!!$
33 %4<<(@AAJJLL #7 #7C"3iiG"j..w~/FGGM2GLL $ENN#I.-Ww|'<WW'*BUWW J29,2G07
0C.5h.?.5h.?/66=>N6O5<_5M4;N4K	!" 	!" +/   #$*"HH"HH J,,R00/  @ 0111Q611112333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4@ &5hWWWs   STTTr   rh   c                   t                      }t          d          ||                    d          p|||| j                            |          |d}t          d          ||d         |dd dd ||d d}	| j                                        5 }
|
                    d	|           |
                    d
|	           d d d            n# 1 swxY w Y   ||	dS )Nsrcrj   )r`   rh   rj   r%   ro   rs   rm   ingr`   r  r   )r`   r   	source_idrequested_scope	job_stateprocessor_outcomeretry_countrv  rm   rq   processed_atz
                INSERT INTO sources (id, source_kind, title, content, source_ref, metadata_json, created_at)
                VALUES (:id, :source_kind, :title, :content, :source_ref, :metadata_json, :created_at)
                a  
                INSERT INTO ingestion_events (
                    id, trigger_type, source_id, requested_scope, job_state, processor_outcome,
                    retry_count, error_message, created_at, updated_at, processed_at
                ) VALUES (
                    :id, :trigger_type, :source_id, :requested_scope, :job_state, :processor_outcome,
                    :retry_count, :error_message, :created_at, :updated_at, :processed_at
                )
                )r=  event)r   r   ru   rQ   ry   rz   r{   )rE   r   rh   ro   rA   r%   rX   r   r=  r  r   s              r   r   zMemoryService._capture_sourceG  sH    hh%..&\\'**8j$!Z--h77
 
 %..($"!%! 
 
 Z""$$ 	LL    LL   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	( !5111s   -CC
C
r   	list[Any]c                    g }h d}|                                 D ]:\  }}||vs||                    d| d           |                    |           ;|S )N>	   r\   rc   r]   rZ   rg   rY   r[   rf   r^   zAND z = ?)rn  r   )rE   r   r   r   allowedr   r   s          r   r   z MemoryService._memory_filter_sqlw  sw    ttt!--// 	! 	!JC'!!U]JJ'c'''(((MM%    r   r4   r5   c                    g d}fd|D             }|sdS t          fd|D                       }|t          |          z  S )N)	rf   rg   rc   rY   rZ   r[   r^   r\   r]   c                >    g | ]}                     |          |S r   r\  )r   r   r   s     r   r   z.MemoryService._facet_score.<locals>.<listcomp>  s*    JJJ3W[[-=-=-I3-I-I-Ir   r   c              3  Z   K   | ]%}                     |          |         k    !d V  &dS r
   Nr\  )r   r   r   r4   s     r   r   z-MemoryService._facet_score.<locals>.<genexpr>  s;      NNCfjjoo.M.Ma.M.M.M.MNNr   sumr,   )rE   r4   r   trackedappliedmatcheds    ``   r   r   zMemoryService._facet_score  sk    tttJJJJ'JJJ 	3NNNNN7NNNNNW%%r   r   c                   | j                             |                    d                    pi }|                    d          t          k    r,|                    d          s|                    d          sd S |                     |          }|                    d          p>|                    d          p)|                    d          p|                    d          }|                    d          p?|                    d          p*|                    d          p|                     ||          }|                    d	          p|                    d	          }|                    d
          p?|                    d
          p*|                    d          p|                     ||          }|                    d          p,|                    d          p|rt          |          j        nd }d |	                                D             }	|dk    r|	                    d          pBt          |d         d          p,|d                             d                                          |	d<   |	                    d          pt          |d         d          |	d<   |	                    d          pt          |d         d          |	d<   |	                    d          pt          |d         d          p|d         |	d<   t          |	d<   ||	d<   |d         }
|dk    rd}
n|dk    rd }
|d!         t          |
|||||||	                    d|d                   | j                             |	          d"S )#Nrs   rb   legacy_kindlegacy_systemr^   r_   rZ   legacy_run_idr[   r\   
source_urlr]   c                "    i | ]\  }}|d v	||S )>
   r\   r]   rZ   schemar[   r  r  record_kindr
  r	  r   rk  s      r   rl  z5MemoryService._migrate_memory_row.<locals>.<dictcomp>  sJ      M  M  M
U#  NL  CL  CLe  CL  CL  CLr   research_rungoalr%   Goalrj   zResearch run: rA   ScopeassumptionsAssumptionsrk   Summaryr  rY   rc   router_handoffr   research_sourcer   r`   )r`   rb   rc   rY   r^   rZ   r[   r\   r]   rk   rs   )rQ   r?  ru   r   _memory_subtype_infer_run_id
_infer_urlr	   rv   rn  r/   removeprefixr-   ry   )rE   r   rX   rY   r^   rZ   r[   r\   r]   cleanrecord_types              r   r  z!MemoryService._migrate_memory_row  s   :##CGGO$<$<==C77#$$66x||M?Z?Z6ckcocop  dA  dA64&&x00ww~..  G(,,~2N2N  GRZR^R^_nRoRo  Gsvszsz  |F  tG  tG""  Bhll8&<&<  B_@]@]  Baeasastw  zA  bB  bB'')$$?Y(?(?ggennrU 3 3rx||L7Q7QrUYUdUdehjqUrUr""ghll8&<&<gY\Af#AUAUbf M  Mhnn.>.>  M  M  Mn$$!IIf--  LS^V1T1T  LX[\cXdXqXq  sC  YD  YD  YJ  YJ  YL  YLE&M"YYw//W;s9~w3W3WE'N#(99]#;#;#i{3y>[h?i?iE- $yy33o{3y>S\7]7]oadenaoE)(h"i&k&&&#KK)))$Kd),(yyC	N;;!Z--e44
 
 	
r   c                   | j                             |                    d                    pi }|                    d          t          k    r,|                    d          s|                    d          sd S |                    d          p)|                    d          p|                    d          }d |                                D             }t          |d<   |d	         t          || j                             |          d
S )Nrs   rb   r  r	  rZ   r
  c                "    i | ]\  }}|d v	||S )>   r  r
  r	  r   rk  s      r   rl  z3MemoryService._migrate_task_row.<locals>.<dictcomp>  s)    
U#M~B~B~eB~B~B~r   r  r`   )r`   rb   rZ   rs   )rQ   r?  ru   r   rn  ry   )rE   r   rX   rZ   r  s        r   r  zMemoryService._migrate_task_row  s    :##CGGO$<$<==C77#$$66x||M?Z?Z6ckcocop  dA  dA64""]hll8&<&<]_@]@]hnn.>.>(hd),!Z--e44	
 
 	
r   c                J   dddd dd ddddd	d
dddg dd
ddddd dd ddddd	d
dddg dd
ddddd d d ddddd	d
dddg dd
dg}| j                                         5 }|                    dd                                          }|r%|                    ddt	                      df           |D ]}|                    d|d         f                                          }|r4t	                      }|                     ||d         |d         |d          |d!                   }|                    d"|d         |d#         |d         |d         |d          |d!         |d d d d$| j                             |d%                   ||f           	 d d d            d S # 1 swxY w Y   d S )&Njob_consolidation_daily_10consolidationdailyz10:00daily_10r   r  r  r  r  r	  Fr  r  )
moder   r   r  r  r  r  r
  r  r  )r`   job_typecadenceinterval_minuteswindow_start
window_endrX   job_consolidation_daily_15z15:00daily_15job_consolidation_weeklyweeklyi   Tz,SELECT id FROM maintenance_jobs WHERE id = ?)job_consolidation_dailyz
                    UPDATE maintenance_jobs
                    SET enabled = 0, last_summary = ?, updated_at = ?
                    WHERE id = ?
                    z+deprecated: split into 10:00 and 15:00 jobsr/  r`   r'  r(  r)  r*  ag  
                    INSERT INTO maintenance_jobs (
                        id, job_type, cadence, interval_minutes, window_start, window_end, next_due_at,
                        last_run_at, last_status, last_summary, enabled, metadata_json, created_at, updated_at
                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                    r&  r
   rX   )rQ   rz   r{   r   r   _compute_next_duery   )rE   defaultsr   legacyjobr   r   next_dues           r   rT   z"MemoryService._ensure_default_jobs  s    3+"$( '"&*+&)-0,0*-*.#($.#J#J#J  * 3+"$( '"&*+&)-0,0*-*.#($.#J#J#J  * 1+#$( $"$*+&)-0,0*-*.#'$.#J#J#J  S=
| Z""$$ (	\\"PRnooxxzzF 
 CFHHNgh      ll#QTWX\T]S_``iikk hh11#s9~sK]G^`cdr`sux  zF  vG  H  H D	JI./N+L) 
((Z99   (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	s   D,FFFc                      j                                         5 }|                    d                                          } fd|D             cd d d            S # 1 swxY w Y   d S )Nz7SELECT * FROM maintenance_jobs ORDER BY next_due_at ASCc                :    g | ]}                     |          S r   _row_to_maintenance_jobr   s     r   r   z7MemoryService.list_maintenance_jobs.<locals>.<listcomp>(  '    FFF#D0055FFFr   rS  rq  s   `  r   list_maintenance_jobsz#MemoryService.list_maintenance_jobs%  s    Z""$$ 	G<< YZZcceeDFFFFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   5AA!$A!)r   r   r   
int | Nonec               8    |pt                      }d}|g}||dz  }|                    |            j                                        5 }|                    ||                                          } fd|D             cd d d            S # 1 swxY w Y   d S )Nz^SELECT * FROM maintenance_jobs WHERE enabled = 1 AND next_due_at <= ? ORDER BY next_due_at ASCz LIMIT ?c                :    g | ]}                     |          S r   r7  r   s     r   r   z;MemoryService.list_due_maintenance_jobs.<locals>.<listcomp>3  r9  r   )r   r   rQ   rz   r{   r  )rE   r   r   r   r   r   r   s   `      r   list_due_maintenance_jobsz'MemoryService.list_due_maintenance_jobs*  s    oVXXn E:CMM%   Z""$$ 	G<<V,,5577DFFFFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   6BBBjob_idc                   | j                                         5 }|                    d|f                                          }|t	          |          |                     |          cd d d            S # 1 swxY w Y   d S )Nz+SELECT * FROM maintenance_jobs WHERE id = ?)rQ   rz   r{   r   r@  r8  )rE   r?  r   r   s       r   get_maintenance_jobz!MemoryService.get_maintenance_job5      Z""$$ 	5,,LviXXaaccC{v&&&//44		5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5rf  )next_due_atlast_run_atlast_statuslast_summaryenabledrX   rC  rD  rE  rF  rG  c               f   |                      |          }|||d<   |||d<   |||d<   |||d<   |||d<   |||d<   | j                                        5 }	|	                    d|d         |                    d          |                    d          |                    d          |                    d          rdnd	| j                            |                    d          pi           t                      |f           d d d            n# 1 swxY w Y   |                      |          S )
NrC  rD  rE  rF  rG  rX   z
                UPDATE maintenance_jobs
                SET next_due_at = ?, last_run_at = ?, last_status = ?, last_summary = ?, enabled = ?, metadata_json = ?, updated_at = ?
                WHERE id = ?
                r
   r   )rA  rQ   rz   r{   ru   ry   r   )
rE   r?  rC  rD  rE  rF  rG  rX   r3  r   s
             r   update_maintenance_jobz$MemoryService.update_maintenance_job<  s    &&v.."!,C"!,C"!,C#".C$C	N&C
OZ""$$ 	LL &GGM**GGM**GGN++++2AAJ$$SWWZ%8%8%>B??HH	  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	$ ''///s   B.DDDc                4   t          d          }t                      }| j                                        5 }|                    d||d|d d | j                            i           d f           d d d            n# 1 swxY w Y   |                     |          S )Nmrunz
                INSERT INTO maintenance_runs (id, job_id, status, started_at, completed_at, summary, stats_json, error_message)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?)
                r  )r   r   rQ   rz   r{   ry   get_maintenance_run)rE   r?  rZ   r   r   s        r   create_maintenance_runz$MemoryService.create_maintenance_runh  s    hhZ""$$ 	LL CtTZ=M=Mb=Q=QSWX  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ''///s   7A::A>A>)rk   r#  rv  rk   r#  c          
        t                      }| j                                        5 }|                    d|||| j                            |pi           ||f           d d d            n# 1 swxY w Y   |                     |          S )Nz
                UPDATE maintenance_runs
                SET status = ?, completed_at = ?, summary = ?, stats_json = ?, error_message = ?
                WHERE id = ?
                )r   rQ   rz   r{   ry   rL  )rE   rZ   rd   rk   r#  rv  r   r   s           r   finish_maintenance_runz$MemoryService.finish_maintenance_runu  s     hhZ""$$ 	LL
 gtz'7'7'D'DmU[\  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ''///s   7A++A/2A/c                   | j                                         5 }|                    d|f                                          }|t	          |          |                     |          cd d d            S # 1 swxY w Y   d S )Nz+SELECT * FROM maintenance_runs WHERE id = ?)rQ   rz   r{   r   r@  _row_to_maintenance_runr  s       r   rL  z!MemoryService.get_maintenance_run  rB  rf  r  )r?  r   c               J    d}g }||dz  }|                     |           |dz  }|                     |            j                                        5 }|                    ||                                          } fd|D             cd d d            S # 1 swxY w Y   d S )Nz(SELECT * FROM maintenance_runs WHERE 1=1z AND job_id = ?z! ORDER BY started_at DESC LIMIT ?c                :    g | ]}                     |          S r   )rQ  r   s     r   r   z7MemoryService.list_maintenance_runs.<locals>.<listcomp>  r9  r   )r   rQ   rz   r{   r  )rE   r?  r   r   r   r   r   s   `      r   list_maintenance_runsz#MemoryService.list_maintenance_runs  s   8$$CMM&!!!22eZ""$$ 	G<<V,,5577DFFFFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   6BBBc                    |                     d          p)|                     d          p|                     d          }ddddddddd	d
d
}|                     ||          S )Nr  r  rY   r  research_stepr  research_claimresearch_artifactleisure_itemr  )
r  rV  r=  r  claimrW  r   rX  rY  r  r\  )rE   rX   r  mappings       r   r  zMemoryService._memory_subtype  sy    ll=11kX\\-5P5PkT\T`T`ajTkTk*,'0%.+!4*.
 
 {{;444r   c                    |                     d          pd}|                    d          r|                    dd          d         S |dk    r|d         S d S )	Nro   r)   zpersonal-agent:run:r(   r
   r  r`   )ru   r+   rsplit)rE   r   rY   ro   s       r   r  zMemoryService._infer_run_id  sd    WW\**0b
  !677 	1$$S!,,R00n$$t9tr   c                    |dv rA|                     d          }t          |t                    r|                    d          r|S d S )N>   rW  r  rX  rB   )zhttp://zhttps://)ru   r   r   r+   )rE   r   rY   rB   s       r   r  zMemoryService._infer_url  sR    PPP77>22L,,, $1H1HI`1a1a $##tr   r   r~   c                    |                     d|d         f           |                     d|d         |d         |d         |d         f           d S )Nz,DELETE FROM memories_fts WHERE memory_id = ?r`   zQINSERT INTO memories_fts (memory_id, title, summary, content) VALUES (?, ?, ?, ?)rj   rk   r%   )r{   )rE   r   r~   s      r   r|   zMemoryService._upsert_fts  s^    CfTl_UUU_D\6'?F9,=vi?PQ	
 	
 	
 	
 	
r   c                    t          |          }| j                            |                    d                    pi |d<   |                     |                    d                    |d<   |S )Nrs   rX   rr   rp   )rt   rQ   r?  pop_decode_embedding)rE   r   r4   s      r   r   zMemoryService._row_to_memory  sb    c!Z--fjj.I.IJJPbz"44VZZ@P5Q5QRR{r   c                    t          |          }| j                            |                    d                    pi |d<   t	          |d                   |d<   |S )Nrs   rX   r  rt   rQ   r?  rb  r   )rE   r   r   s      r   r  zMemoryService._row_to_task  sV    Cyy:++DHH_,E,EFFL"Z'+D1G,H'I'I#$r   c                    t          |          }| j                            |                    d                    pi |d<   | j                            |                    d                    pi |d<   |S )Nr  r  rs   rX   rt   rQ   r?  rb  rE   r   r   s      r   r  zMemoryService._row_to_task_run  si    3ii#z//8L0M0MNNTRTO***377?+C+CDDJJ
r   c                    t          |          }| j                            |                    d                    pi |d<   |S )Nrs   rX   rg  )rE   r   r   s      r   r  zMemoryService._row_to_artifact  s>    99#z//_0M0MNNTRTr   c                    t          |          }| j                            |                    d                    pi |d<   t	          |d                   |d<   |S )Nrs   rX   rG  re  )rE   r   r3  s      r   r8  z%MemoryService._row_to_maintenance_job  sQ    3ii***377?+C+CDDJJc)n--I
r   c                    t          |          }| j                            |                    d                    pi |d<   |S )N
stats_jsonr#  rg  rh  s      r   rQ  z%MemoryService._row_to_maintenance_run  s<    3iiz''(=(=>>D"G
r      max_lenc                    d                     |                                          }t          |          |k    r|d |dz
           dz   n|S )Nr    r
   u   …)r!   r#   r,   )rE   r%   rn  compacts       r   rw   zMemoryService._make_summary  sH    ((7==??++14W1G1Gw}1}%--WTr   rp   list[float] | Nonec                2    |d S t          j        |          S r   )r  ry   rE   rp   s     r   rx   zMemoryService._encode_embedding  s    4z)$$$r   c                L    |sd S t          t          j        |                    S r   )r`  r  r?  rs  s     r   rc  zMemoryService._decode_embedding  s'     	4DJy))***r   r   r   c                f    |sdS t          fd|D                       }|t          |          z  S )Nr   c              3  $   K   | ]
}|v d V  dS r  r   )r   r   r   s     r   r   z/MemoryService._lexical_score.<locals>.<genexpr>  s-      DDD483C3Ca3C3C3C3CDDr   r  )rE   r   r   matchess     ` r   r   zMemoryService._lexical_score  sE     	3DDDDKDDDDD[))))r   r   text
dimensionslist[float]c                j   dg|z  }t          |                                          D ]J}t          |                    d                    D ]%\  }}|||z  xx         t	          |          z  cc<   &Kt          j        t          d |D                                 dk    r|S fd|D             S )Nr   zutf-8c              3      K   | ]	}||z  V  
d S r   r   )r   r   s     r   r   z0MemoryService._text_embedding.<locals>.<genexpr>  s&      ??uUU]??????r   r   c                    g | ]}|z  S r   r   )r   r   norms     r   r   z1MemoryService._text_embedding.<locals>.<listcomp>  s    111111r   )r$   r#   	enumerateencoder5   mathsqrtr  )rE   rx  ry  vectortokenidxcharr~  s          @r   r   zMemoryService._text_embedding  s    ##D))//11 	8 	8E&u||G'<'<== 8 8	TsZ'(((E$KK7((((8y???????@@199M1111&1111r   r   memory_embeddingc                    |r|dS t          d t          ||          D                       }t          dt          d|                    S )Nr   c              3  &   K   | ]\  }}||z  V  d S r   r   )r   abs      r   r   z0MemoryService._semantic_score.<locals>.<genexpr>  s*      QQ$!QAQQQQQQr   rl   )r  zipmaxmin)rE   r   r  	numerators       r   r   zMemoryService._semantic_score  sV     	"2":3QQ#o?O*P*PQQQQQ	3C++,,,r   rV  c                \    |                     d|f                                          }|d uS )Nz@SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?)r{   r   )rE   r   rV  r   s       r   r  zMemoryService._table_exists	  s0    ll]`e_ghhqqss$r   c                    |                      ||          sdS |                    d|                                           d         S )Nr   zSELECT COUNT(*) AS count FROM r  )r  r{   r   )rE   r   rV  s      r   r  z$MemoryService._count_if_table_exists  sL    !!$.. 	1||DUDDEENNPPQXYYr   r'  r(  r)  r*  c                   t          j        |          }|dk    r'|r%|t          |          z                                   S |dk    r|t          d          z   }n|t          d          z   }|r1|                     |          \  }}	|                    ||	dd          }|r9|                     |          \  }
}|                    |
|dd          }||k    r|}|                                S )	Ninterval)minutesr.  r   r  r
   r   )hourminutesecondmicrosecond)r   fromisoformatr   r   _parse_hhmmreplace)rE   r   r'  r(  r)  r*  basetargetr  r  end_hour
end_minuteends                r   r0  zMemoryService._compute_next_due  s    %c**j  %5 9-=>>>>IIKKKhI1----FFI1----F 	W++L99LD&^^fQTU^VVF 	#'#3#3J#?#? Hj..hz!YZ.[[C||!!!r   r   tuple[int, int]c                    |                     d          }t          |          dk    rdS t          |d                   t          |d                   fS )Nr(      )r   r   r   r
   )r#   r,   r   )rE   r   partss      r   r  zMemoryService._parse_hhmm+  sF    C  u::??6E!Hs58}}--r   from_idto_idr   r   c                    |                     dt          d          |||t                      | j                            d|i          f           d S )Nz
            INSERT INTO memory_links (id, from_memory_id, to_memory_id, relation, created_at, metadata_json)
            VALUES (?, ?, ?, ?, ?, ?)
            r   r   r{   r   r   rQ   ry   )rE   r   r  r  r   r   s         r   r  zMemoryService._link_memories1  sZ     U^^WeXvxxAQAQS[]cRdAeAef	
 	
 	
 	
 	
r   conflicting_idc                    |                     dt          d          |||t                      | j                            i           f           d S )Nz
            INSERT INTO memory_conflicts (id, memory_id, conflicting_memory_id, reason, created_at, metadata_json)
            VALUES (?, ?, ?, ?, ?, ?)
            mcfr  )rE   r   r   r  r   s        r   r"  zMemoryService._record_conflict:  sT     U^^Y$*JZJZ[]J^J^_	
 	
 	
 	
 	
r   leftrightc                   h d}|                     d          |vs|                     d          |vrdS h d}t          t          |d                                                             }t          t          |d                                                             }t	          ||z            }t	          ||z            }t          ||z            }	|	dk    o||k    S )N>   r   r   r   rc   F>   nonotsinnevernuncar%   r  )ru   setr$   r#   r   r,   )
rE   r  r  allowed_types	negationsleft_tokensright_tokensleft_neg	right_negoverlaps
             r   r!  zMemoryService._conflict_signalC  s    :::88F=00EIIf4E4E]4Z4Z5:::	.i99??AABB>%	*:;;AACCDD	K/00\122	kL011!|5I 55r   r  r  c                   |dk    rd S d|d          d|d          d}	 t          j        ||dddd	          }|j        d
k    rd S |j                                        }|pd S # t
          $ r Y d S w xY w)Nr  zzSummarize and merge the two memory notes into one concise statement. Preserve key facts and avoid speculation.

Memory A:
r%   z

Memory B:

T<   F)inputrx  capture_outputtimeoutcheckr   )
subprocessr   
returncodestdoutr-   	Exception)rE   r  r  r  r  promptresultoutputs           r   r   z!MemoryService._llm_summarize_pairO  s     z!!4Oy/O O:?	:JO O O 		^#  F  A%%t]((**F>T! 	 	 	44	s   %A# A# #
A10A1)rN   r   r   rO   )rV   r3   r   r3   )
ro   r   rA   r   r%   r   rX   r   r   r3   )r   )ro   r   rA   r   r%   r   r   r   rX   r   r   r3   )NNr   F)r   r   r   r   r   r   r   r   r   r   r   r3   )NNNN)
r   r   r   r   r   r   r   r   r   r3   )r   r   r   r3   )r   r3   r   r3   )NN)
rj   r   r%   r   rB   r   ro   r   r   r3   )r5  r   r   r3   rG   )r   r3   r   rO   )r   r   r   r3   ) rd   r   rA   r   r   r   rY   r   rf   r   rg   r   ro   r   rB   r   rZ   r   r[   r   r^   r   r\   r   r]   r   rX   r   r   r   r   rh  )r   rh  )
rs  r   rt  r   ru  r   rv  r   r   rO   r   )rf   r   ry  r   rz  r   r   rO   )
rg   r   ry  r   rf   r   r~  r   r   rO   )"rj   r   r  r   r2  r   rd   r   r  r   rf   r   rg   r   r  r   r  r   r  r   r  r   r  r   r  r   rX   r   r[   r   rZ   r   r   r3   )r[   r   r   r3   )rd   r   r  r   r  r  rZ   r   r   r   r   rh  )r[   r   rd   r   r  r   r  r   r  r  rX   r   rZ   r   r   r3   )
r[   r   r_   r   r  r   rX   r   r   r3   )rZ   r   r   r3   )
rZ   r   rd   r   r  r   rv  r   r   r3   )r[   r   rd   r   r   r   r   rh  )r[   r   r  r   rj   r   r%   r   r  r   rd   r   ro   r   rX   r   r  r   r   r3   )r  r   r   r3   )r[   r   r   r   r   rh  )r  r   r   r3   )r   r   rh   r   ro   r   rA   r   r%   r   rX   r3   r   r3   )r   r   r   r3   r   r  )r4   r3   r   r3   r   r5   )r   r3   r   r   )r   rO   )r   r   r   r;  r   rh  )r?  r   r   r3   )r?  r   rC  r   rD  r   rE  r   rF  r   rG  r  rX   r   r   r3   )rZ   r   rd   r   rk   r   r#  r   rv  r   r   r3   )r?  r   r   r   r   rh  )rX   r3   r   r   )r   r3   rY   r   r   r   )r   r   r~   r3   r   rO   )r   r   r   r3   )rm  )r%   r   rn  r   r   r   )rp   rq  r   r   )rp   r   r   rq  )r   r   r   r   r   r5   )r   )rx  r   ry  r   r   rz  )r   rz  r  rq  r   r5   )r   r   rV  r   r   r   )r   r   rV  r   r   r   )r   r   r'  r   r(  r;  r)  r   r*  r   r   r   )r   r   r   r  )r   r   r  r   r  r   r   r   r   r   r   rO   )
r   r   r   r   r  r   r   r   r   rO   )r  r3   r  r3   r   r   )
r  r3   r  r3   r  r   r  r   r   r   )KrH   rI   rJ   rU   r   r   r   r   r   r   r   r0  r4  rA  rW  rd  r}   r   rr  rx  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rS   r   r   r   r  r  rT   r:  r>  rA  rI  rM  rO  rL  rT  r  r  r  r|   r   r  r  r  r8  rQ  rw   rx   rc  r   r   r   r  r  r0  r  r  r"  r!  r   r   r   r   rM   rM   >   s       $ $ $ $6- 6- 6- 6-p0 0 0 0
 
 
 
 N]
 
 
 
 
  $()-#BB BB BB BB BBJ qu2
 2
 2
 2
 2
h*8 *8 *8 *8X   D cg
 
 
 
 
 < < < <$   0   >, , , , & "&"!%"!%#'!"#'!*.#0> 0> 0> 0> 0> 0>d/ / / /
	 	 	 	 	         !%"%)!"&%)%*!*."!%9+ 9+ 9+ 9+ 9+ 9+v* * * * ""&,0!< < < < < <B ""&%),0*.!&& && && && && &&Z 04*.$/ $/ $/ $/ $/ $/L. . . . &*$() ) ) ) ) )( 7;QUdf @ @ @ @ @ @, !%*."&&/ &/ &/ &/ &/ &/P. . . . 7; 
@ 
@ 
@ 
@ 
@ 
@ ?C 
 
 
 
 
 

 
 
 
$
 $
 $
 $
LDX DX DX DXL.2 .2 .2 .2`   & & & &#
 #
 #
 #
J
 
 
 
g g g gRG G G G
 >BW[ 	G 	G 	G 	G 	G 	G5 5 5 5 #'"&"&#'#*.*0 *0 *0 *0 *0 *0X0 0 0 0$ #'+$(0 0 0 0 0 0*5 5 5 5 =Ar 
G 
G 
G 
G 
G 
G5 5 5 5       
 
 
 
            
      
U U U U U% % % %
+ + + +
* * * *2 2 2 2 2- - - -   Z Z Z Z
" " " "2. . . .
 
 
 

 
 
 

6 
6 
6 
6     r   rM   )r   r   )r   r   r   r   )r   r   r   r   )r%   r   r&   r   r   r   )
__future__r   r  r  r  r   dataclassesr   r   r   r   typingr   urllib.parser	   r  r   rQ   r   r   r   r$   r/   r2   rM   r   r   r   <module>r     s   " " " " " "        ! ! ! ! ! ! - - - - - - - - - -       ! ! ! ! ! ! " " " " " "      ) ) ) )* * * *+ + + +    
 
 
 
 
 
 
 
2m m m m m m m m m mr   