Ë
    MÞëjË|  ã                  ó^  — d Z ddlm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
 ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lmZmZmZmZmZmZmZ dd
l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l(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2  ejf                  e4«      Z5 G d„ d«      Z6dgZ7y)uê   Unified memory service for the knowledge plane.

Tied together all knowledge plane components into a single callable API:

file registration â†’ chunking â†’ embedding â†’ vector store â†’ navigation â†’ semantic search â†’ retrieval
é    )ÚannotationsN)ÚPath)ÚAnyÚcast)ÚSQLiteDatabase)ÚDocumentFingerprintÚEmbeddingCacheÚSearchResultCache)ÚClassificationResultÚLLMClassifierÚdetect_sensitivity_from_bytes)ÚDocumentRegistrationÚDocumentStatusÚDocumentTrustÚKG1NodeÚKnowledgeDocumentÚKnowledgeSourceÚSensitivity)ÚDeduplicationEngineÚDeduplicationResult)ÚEmbeddingConfig)ÚEmbeddingService)ÚLocalDirectorySource)ÚMarkdownStore)ÚKnowledgeMetrics)ÚKnowledgeNavigator)ÚSQLiteKnowledgeRepository)ÚKnowledgeVectorStore)ÚAuditEventTypeÚAuditLogc            
      óT  — e Zd ZdZddddddddddœ		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d%d„Z	 	 	 	 	 	 	 	 d&d„Zddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 d'd„Zd	dddej                  e	j                  d
œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d(d„Zddddœ	 	 	 	 	 	 	 	 	 d)d„Ze	 d*	 	 	 	 	 	 	 d+d„«       Zddœ	 	 	 	 	 d,d„Zddddœ	 	 	 	 	 	 	 	 	 d)d„Zddddœ	 	 	 	 	 	 	 	 	 d-d„Zd.d„Zd/d„Zd0d„Zd1d„Zd1d„Z	 	 	 	 	 	 d2d„Zd3d„Zddœ	 	 	 	 	 d4d„Zd5d„Zdddd œ	 	 	 	 	 	 	 	 	 d6d!„Zddd"œ	 	 	 	 	 d7d#„Zd1d$„Zy)8ÚMemoryServiceuô  JednotnÃ½ vstupnÃ­ bod pro pamÄ›Å¥ovou vrstvu knowledge plane.

    Spolupracuje:
    - SQLiteKnowledgeRepository pro metadata dokumentÅ¯
    - LocalDirectorySource pro Ä�tenÃ­ lokÃ¡lnÃ­ch souborÅ¯
    - TextChunker pro dÄ›lenÃ­ textu na chunky
    - EmbeddingService pro generovÃ¡nÃ­ vektorÅ¯ pÅ™es Ollama
    - KnowledgeVectorStore (LanceDB) pro vektorovÃ© uloÅ¾iÅ¡tÄ› a sÃ©mantickÃ© vyhledÃ¡vÃ¡nÃ­
    - KnowledgeNavigator pro topic/tag navigaci
    - DeduplicationEngine pro detekci duplicit
    NT)	Ú	audit_logÚconfigÚ
repositoryÚvector_storeÚembedding_serviceÚ	navigatorÚdeduplication_engineÚmarkdown_rootÚauto_classifyc       
        óˆ  — || _         || _        |xs
 t        «       | _        |xs t	        ||¬«      | _        |xs t        | j                  ¬«      | _        |xs t        | j                  ¬«      | _	        |xs
 t        «       | _        |xs! t        | j                  | j                  ¬«      | _        t        dt        d«      j!                  «       t"        j$                  t&        j(                  ¬«      | _        |
| _        t/        | j                  ¬«      | _        t3        |	xs, t        | j                  j4                  «      j6                  dz  |
¬«      | _        t        | j                  j4                  «      j6                  d	z  }t;        t=        |«      ¬
«      | _        tA        dd¬«      | _!        tE        «       | _#        y )N)r#   )r$   )r'   r&   Úlocalú.©Ú	source_idÚrootÚtrustÚsensitivityÚknowledge_docs)r1   r+   Úembedding_cache)Údb_pathéd   g     Àr@)Úmax_sizeÚttl_seconds)$Údatabaser#   r   r$   r   r%   r   r&   r   r'   r   r(   r   r)   r   r   Úresolver   ÚREVIEWEDr   ÚPERSONALÚlocal_sourcer+   r   Ú
classifierr   Úlancedb_directoryÚparentÚmarkdown_storer	   Ústrr5   r
   Úsearch_cacher   Úmetrics)Úselfr:   r#   r$   r%   r&   r'   r(   r)   r*   r+   Ú	cache_dirs               úQ/home/oem/CyberBrain26-unified/src/cyberbrain26/knowledge_plane/memory_service.pyÚ__init__zMemoryService.__init__F   sq  € ð !ˆŒØ"ˆŒØÒ1¤Ó 1ˆŒØ$Ò`Ô(AÀ(ÐV_Ô(`ˆŒØ(ÒTÔ,@ÈÏÉÔ,TˆÔØ!2Ò!ZÔ6FÈdÏkÉkÔ6ZˆÔØ"Ò:Ô&8Ó&:ˆŒà ò Ü"Ø"&×"8Ñ"8Ø!×.Ñ.ôð 	Ô!ô 1ØÜ�c“×"Ñ"Ó$Ü×(Ñ(Ü#×,Ñ,ô	
ˆÔð +ˆÔÜ'¨t¯{©{Ô;ˆŒô ,ØÒ_¤$ t§{¡{×'DÑ'DÓ"E×"LÑ"LÐO_Ñ"_Ø'ô
ˆÔô ˜Ÿ™×6Ñ6Ó7×>Ñ>ÐARÑRˆ	Ü-´c¸)³nÔEˆÔô .°sÈÔNˆÔô (Ó)ˆ�ó    c                óÔ   — | j                   sy	 |j                  dd¬«      }| j                  j                  |«      S # t        $ r!}t
        j                  d||«       Y d}~yd}~ww xY w)u  Run LLM classification on document content.

        Returns ClassificationResult or None if classification is disabled
        or fails. Fail-closed: never returns a partial result â€” caller must
        handle the None case by storing document as unclassified.
        Núutf-8Úreplace©Úerrorsz Classification failed for %s: %s)r+   Údecoder?   Úclassify_documentÚ	ExceptionÚloggerÚwarning)rF   ÚcontentÚ
source_urir0   ÚtextÚexcs         rH   Ú_classify_documentz MemoryService._classify_document~   s`   € ð ×!Ò!Øð	Ø—>‘> '°)�>Ó<ˆDØ—?‘?×4Ñ4°TÓ:Ð:øÜò 	Ü�N‰NÐ=¸zÈ3ÔOÜûð	ús   �-= ½	A'ÁA"Á"A')r0   r1   r2   r3   Úapprovec               óð  — t        |«      j                  «       j                  d¬«      }|j                  «       }t	        |«      }	dddddœ}
|€	 t        |	«      }ng|
j                  |	d«      |
j                  |j                  d«      kD  r8t        j                  d	|j                  |j                  |	«       	 t        |	«      }| j                  |t        |«      |xs d
«      }|�I	 | j                  j!                  ||j#                  dd¬«      t        |«      |xs d
|j                  ¬«       |�¤t        |«      j                  «       j                  d¬«      }t'        |xs d|j                  › �||xs t(        j*                  |xs t
        j                  ¬«      }|j-                  | j.                  || j0                  | j2                  ¬«      \  }}n¤|j4                  j                  «       j                  d¬«      }t'        |xs d|j                  › �||xs t(        j*                  |xs t
        j                  ¬«      }|j-                  | j.                  || j0                  | j2                  ¬«      \  }}|�¾d|j6                  d<   |j8                  |j6                  d<   |j:                  |j6                  d<   |j<                  |j6                  d<   |j>                  |j6                  d<   |j@                  |j6                  d<   |jB                  |j6                  d<   |jD                  |j6                  d<   ddl#} |jF                  «       }ddl$m%}  |||¬«      }|r§| jL                  �›| jL                  jO                  tP        jR                  d|jT                  |jT                  |jV                  |jX                  |jZ                  j                  |j\                  j                  |j^                  j                  |dudœ¬«       | ja                  |«       ||fS # t        $ r t
        j                  }Y �Œtw xY w# t        $ r Y �Œ„w xY w# t$        $ r"}t        j                  d||«       Y d}~�ŒCd}~ww xY w) u°  Zaregistruje lokÃ¡lnÃ­ soubor do pamÄ›Å¥ovÃ©ho systÃ©mu.

        Postup:
        1. ÄŒte soubor z disku
        2. (NEW) Klasifikuje obsah pÅ™es LLM (pokud auto_classify=True)
        3. UklÃ¡dÃ¡ klasifikaci do Markdown store
        4. RozdÄ›lÃ­ na chunky
        5. Vygeneruje embeddingy
        6. UloÅ¾Ã­ do vektorovÃ©ho ÃºloÅ¾iÅ¡tÄ›
        7. Proindexuje do navigÃ¡toru (topics, tags)
        8. ZaznamenÃ¡ do auditu
        T)Ústrictr   é   é   é   )ÚpublicÚpersonalÚ	sensitiveÚ
restrictedNz>Auto-upgrading sensitivity for %s from %s to %s (PII detected)r-   rL   rM   rN   )ÚclassificationrU   rV   r0   Úfilenamez Markdown store failed for %s: %szlocal-r/   ©r&   r'   Úauto_classifiedÚclassification_topicÚclassification_subtopicÚclassification_tagsÚclassification_summaryÚclassification_confidenceÚclassification_intentÚclassification_entities©rM   )Ú
valid_fromÚmemory_file_registered)r0   rV   Útrust_levelr3   Ústatusrg   ©ÚactionÚresourceÚmemory_writeÚmetadata)1r   Ú
expanduserr;   Ú
read_bytesr   r   Ú
ValueErrorr=   ÚgetÚvaluerS   rT   ÚnamerY   rC   rB   Ústore_classifiedrP   rR   r   r   r<   Úregister_filer%   r&   r'   rA   rx   ÚtopicÚsubtopicÚtagsÚsummaryÚ
confidenceÚintentÚentitiesÚtimeÚdataclassesrM   r#   Úrecordr   ÚMEMORY_UPDATEDÚdocument_idr0   rV   r2   r3   rs   Ú_index_in_navigator)rF   Úpathr0   r1   r2   r3   rZ   Ú	file_pathrU   Údetected_sensitivityÚsensitivity_rankrd   rX   Ú	root_pathÚsourceÚdocumentÚcreatedrˆ   Úcurrent_timerM   s                       rH   r€   zMemoryService.register_file�   sD  € ô, ˜“J×)Ñ)Ó+×3Ñ3¸4Ð3Ó@ˆ	Ø×&Ñ&Ó(ˆô  =¸WÓEÐàØØØñ	
Ðð Ðð3Ü)Ð*>Ó?‘ð
  ×#Ñ#Ð$8¸!Ó<Ð?O×?SÑ?SÐT_×TeÑTeÐghÓ?iÒiÜ—‘ØTØ—N‘N K×$5Ñ$5Ð7KôðÜ"-Ð.BÓ"C�Kð
 ×0Ñ0°¼#¸i».È)ÒJ^ÐW^Ó_ˆØÐ%ð	SØ×#Ñ#×4Ñ4Ø#1Ø#ŸN™N¨7¸9˜NÓEÜ" 9›~Ø'Ò2¨7Ø&Ÿ^™^ð 5ô ð ÐÜ˜T›
×-Ñ-Ó/×7Ñ7¸tÐ7ÓDˆIÜ)Ø#Ò@¨°	·±Ð/?Ð'@ØØÒ5œ}×5Ñ5Ø'Ò?¬;×+?Ñ+?ô	ˆFð !'× 4Ñ 4Ø—‘ØØ!×.Ñ.Ø"&×"8Ñ"8ð	 !5ó !ÑˆH‘gð "×(Ñ(×3Ñ3Ó5×=Ñ=ÀTÐ=ÓJˆIÜ)Ø#Ò@¨°	·±Ð/?Ð'@ØØÒ5œ}×5Ñ5Ø'Ò?¬;×+?Ñ+?ô	ˆFð !'× 4Ñ 4Ø—‘ØØ!×.Ñ.Ø"&×"8Ñ"8ð	 !5ó !ÑˆH�gð Ð%Ø37ˆH×ÑÐ/Ñ0Ø8F×8LÑ8LˆH×ÑÐ4Ñ5Ø;I×;RÑ;RˆH×ÑÐ7Ñ8Ø7E×7JÑ7JˆH×ÑÐ3Ñ4Ø:H×:PÑ:PˆH×ÑÐ6Ñ7Ø=K×=VÑ=VˆH×ÑÐ9Ñ:Ø9G×9NÑ9NˆH×ÑÐ5Ñ6Ø;I×;RÑ;RˆH×ÑÐ7Ñ8ó 	Ø �t—y‘y“{ˆÝ'Ù˜8°Ô=ˆá�t—~‘~Ð1Ø�N‰N×!Ñ!Ü×-Ñ-Ø/Ø!×-Ñ-Ø%×1Ñ1à!)×!3Ñ!3Ø"*×"5Ñ"5Ø#+§>¡>×#7Ñ#7Ø#+×#7Ñ#7×#=Ñ#=Ø&Ÿo™o×3Ñ3Ø'5¸TÐ'Añð "ô ð  	× Ñ  Ô*à˜Ð Ð øôA ò 3Ü)×2Ñ2“ð3ûô "ò Úðûô ò SÜ—‘ÐAÀ9Èc×RÒRûðSús=   ÁP Â7P: Ã%AQ
 ÐP7Ð6P7Ð:	QÑQÑ
	Q5ÑQ0Ñ0Q5z
local-text)r0   r�   rƒ   r‡   r2   r3   c               ó  — t        ||||d¬«      }	t        |	|d|xs ddj                  |xs g «      dj                  |xs g «      dœ¬«      }
| j                  j	                  |
| j
                  | j                  ¬«      \  }}|rf| j                  �Z| j                  j                  t        j                  d	|j                  |j                  |j                  |||xs g |xs g d
œ¬«       | j                  ||||¬«       ||fS )u@   Zaregistruje Ä�istÃ½ text (v pamÄ›ti) do pamÄ›Å¥ovÃ©ho systÃ©mu.T)r0   rV   r2   r3   Úapprovedz
text/plainÚ ú,©r�   rƒ   r‡   )r“   rU   Ú
media_typerx   rf   Úmemory_text_registered)r0   rV   r�   rƒ   r‡   rt   )r   r   Újoinr%   Úregisterr&   r'   r#   rŠ   r   r‹   rŒ   r0   r�   )rF   rU   rV   r0   r�   rƒ   r‡   r2   r3   r“   Úregistrationr”   r•   s                rH   Úregister_textzMemoryService.register_text  s  € ô !ØØ!ØØ#Øô
ˆô ,ØØØ#Ø$š{¨°C·H±H¸TºZÀRÓ4HÐVY×V^ÑV^Ð_gÒ_mÐkmÓVnÑoô	
ˆð !ŸO™O×4Ñ4ØØ×*Ñ*Ø"×4Ñ4ð 5ó 
Ñˆ�'ñ �t—~‘~Ð1Ø�N‰N×!Ñ!Ü×-Ñ-Ø/Ø!×-Ñ-Ø%×1Ñ1à!)×!3Ñ!3Ø",Ø"Ø šJ BØ (¢¨Bñð "ô ð 	× Ñ  °¸TÈHÐ ÔUà˜Ð Ð rJ   é
   ©Úlimitr�   Útagc               ó  — ddl } |j                  «       }| j                  j                  ||||¬«      }|du}| j                  j                  |«       |�G| j                  j                   |j                  «       |z
  |r|d   j                  d«      nd¬«       |S t        j                  |«      j                  }	| j                  j                  |	| j                  j                  | j                  j                  «      }
|
€� |j                  «       }| j                  j                  |«      }
| j                  j!                   |j                  «       |z
  d¬«       | j                  j#                  |	| j                  j                  |
«       n| j                  j!                  dd	¬«        |j                  «       }| j$                  j'                  |
|¬
«      } |j                  «       |z
  }|s|r8| j)                  ||¬«      }|r#|D �cg c]  }|j                  d«      |v sŒ|‘Œ }}| j                  j#                  |||||¬«       |r|d   j                  d«      nd}| j                  j                  ||¬«       |S c c}w )uV  SÃ©mantickÃ© vyhledÃ¡vÃ¡nÃ­ v pamÄ›Å¥ovÃ©m systÃ©mu.
        
        Postup:
        1. Cache lookup pÅ™es SearchResultCache (TTL-based)
        2. VytvoÅ™Ã­ embedding pro dotaz (z content-addressable cache pokud moÅ¾nÃ©)
        3. HledÃ¡ v LanceDB vector store
        4. VolitelnÄ› filtruje podle topiku/Å¡tÃ­tku pÅ™es navigÃ¡tor
        r   N©r�   r¥   Úscore)Úlatency_secondsÚbest_distanceF)r©   Úcachedç        T©r¤   Úid)rˆ   Ú	monotonicrD   r|   rE   Úrecord_search_cache_hitÚrecord_vector_searchr   Úfrom_contentÚcontent_sha256r5   r$   ÚmodelÚ
vector_dimr'   Ú
embed_textÚrecord_embedding_latencyÚsetr&   ÚsearchÚ_get_candidate_ids)rF   Ú
query_textr¤   r�   r¥   rˆ   Ú
start_timer«   Ú	cache_hitÚ
query_hashÚquery_vectorÚembed_startÚsearch_startÚresultsÚsearch_latencyÚcandidate_idsÚrrª   s                     rH   Úsemantic_searchzMemoryService.semantic_searchN  s_  € ó  	à#�T—^‘^Ó%ˆ
ð ×"Ñ"×&Ñ& z°5ÀÈ3Ð&ÓOˆØ $Ð&ˆ	Ø�‰×,Ñ,¨YÔ7ØÐØ�L‰L×-Ñ-Ø . §¡Ó 0°:Ñ =Ù8>˜f Q™iŸm™m¨GÔ4ÀDð .ô ð ˆMô )×5Ñ5°jÓA×PÑPˆ
Ø×+Ñ+×/Ñ/°
¸D¿K¹K×<MÑ<MÈtÏ{É{×OeÑOeÓfˆØÐØ(˜$Ÿ.™.Ó*ˆKØ×1Ñ1×<Ñ<¸ZÓHˆLØ�L‰L×1Ñ1Ø . §¡Ó 0°;Ñ >Øð 2ô ð × Ñ ×$Ñ$ Z°·±×1BÑ1BÀLÕQà�L‰L×1Ñ1Ø #Øð 2ô ð
 &�t—~‘~Ó'ˆØ×#Ñ#×*Ñ*¨<¸uÐ*ÓEˆØ'˜Ÿ™Ó)¨LÑ8ˆñ ‘CØ ×3Ñ3¸%ÀSÐ3ÓIˆMÙà&öØ¨!¯%©%°«+¸Ò*F’Að�ð ð
 	×Ñ×Ñ˜j¨%°ÀÈ3ÐÔOñ 4;˜ ™
Ÿ™ wÔ/ÀˆØ�‰×)Ñ)Ø*Ø'ð 	*ô 	
ð
 ˆùòs   ÈJÈ%Jc                óÜ  ‡— i }t        | d¬«      D ]I  \  }}|j                  d«      xs$ |j                  d«      xs |j                  d«      }|sŒ@||vsŒE|||<   ŒK i }t        |d¬«      D ]I  \  }}|j                  d«      xs$ |j                  d«      xs |j                  d«      }|sŒ@||vsŒE|||<   ŒK t        |j                  «       «      t        |j                  «       «      z  }i Š|D ]Q  }|j                  |t	        d«      «      |j                  |t	        d«      «      z   }	|	t	        d«      k7  r||	z  nd‰|<   ŒS g }
t        |ˆfd„d	¬
«      D ]“  }d}d}| |z   D ]i  }|j                  d«      xs$ |j                  d«      xs |j                  d«      }||k(  sŒ@|j                  dd«      |kD  sŒV|}|j                  dd«      }Œk |€Œ{‰|   |d<   |
j                  |«       Œ• |
S )ay  Reciprocal Rank Fusion (RRF) of two result lists.

        Combines two ranked result lists by summing normalized reciprocal ranks.
        Higher final score = more relevant. Works even if the two lists have
        different sets of items (items only in one list get rank from that list only).

        Adapted from RAGraph research: https://arxiv.org/abs/2408.03245
        r]   )Ústartr®   rŒ   rŽ   Úinfr¬   c                ó(   •— ‰j                  | d«      S )Nr   ©r|   )ÚdidÚfused_scoress    €rH   ú<lambda>z)MemoryService._rrf_fuse.<locals>.<lambda>¼  s   ø€ °l×6FÑ6FÀsÈAÓ6N€ rJ   T©ÚkeyÚreverseNg      ð¿r¨   r   Ú	rrf_score)Ú	enumerater|   r¸   ÚkeysÚfloatÚsortedÚappend)Ú	results_aÚ	results_bÚkÚrank_aÚirÅ   Údoc_idÚrank_bÚall_idsÚrankÚfused_resultsÚbest_resultÚ
best_scoreÚridrÍ   s                 @rH   Ú	_rrf_fusezMemoryService._rrf_fuse–  sú  ø€ ð "$ˆÜ˜i¨qÔ1ò 	#‰DˆAˆqØ—U‘U˜4“[ÒI A§E¡E¨-Ó$8ÒI¸A¿E¹EÀ&»MˆFÚ˜&¨Ò.Ø!"��v’ð	#ð
 "$ˆÜ˜i¨qÔ1ò 	#‰DˆAˆqØ—U‘U˜4“[ÒI A§E¡E¨-Ó$8ÒI¸A¿E¹EÀ&»MˆFÚ˜&¨Ò.Ø!"��v’ð	#ô   §¡£Ó.´°V·[±[³]Ó1CÑCˆð *,ˆØò 	MˆFØ—:‘:˜f¤e¨E£lÓ3°f·j±jÀÌÈuËÓ6VÑVˆDØ/3´u¸U³|Ò/C 1 t¢8ÈˆL˜Ò ð	Mð
 /1ˆÜ˜WÓ*NÐX\Ô]ò 	2ˆFà15ˆKØˆJØ Ñ*ò 3�Ø—e‘e˜D“kÒJ Q§U¡U¨=Ó%9ÒJ¸Q¿U¹UÀ6»]�Ø˜&“= Q§U¡U¨7°AÓ%6¸Ó%CØ"#�KØ!"§¡ w°Ó!2‘Jð	3ð
 Ñ&Ø+7¸Ñ+?�˜KÑ(Ø×$Ñ$ [Õ1ð	2ð ÐrJ   r­   c          
     ó$  ‡— |j                  «       Š| j                  j                  «       5 }|j                  dd‰› d�d‰› d�f«      j	                  «       }ddd«       g }D �]   }|d   rt        j                  |d   «      ni }|j                  d«      xs dj                  «       }|j                  d«      xs g D �	cg c]  }	|	j                  «       ‘Œ }
}	|j                  d«      xs dj                  «       }d	}d
}‰|v rd}|dz  }t        ˆfd„|
D «       «      rd}|dz  }‰|v rd}|dz  }|sŒÑ|j                  |d   |d   |d   |j                  dd«      |dœ«       �Œ |j                  d„ d¬«       |d| S # 1 sw Y   �Œ+xY wc c}	w )u„  Keyword search over document metadata (topic, tags, summary).

        Searches across topic, tags, and summary fields in the SQLite
        knowledge_documents table metadata_json using LIKE patterns. This provides
        keyword-based retrieval complementary to semantic (vector) search.

        Research reference: RAGraph â€” hybrid BM25+semantic retrieval with RRF fusion.
        zå
                SELECT document_id, source_uri, media_type, metadata_json
                FROM knowledge_documents
                WHERE LOWER(source_uri) LIKE ?
                   OR LOWER(metadata_json) LIKE ?
                ú%NÚmetadata_jsonr�   r™   rƒ   r„   Fç      ð?Tr¢   c              3  ó&   •K  — | ]  }‰|v –— Œ
 y ­w)N© )Ú.0ÚtÚquery_lowers     €rH   ú	<genexpr>z/MemoryService.keyword_search.<locals>.<genexpr>ó  s   øè ø€ Ò2¨�; !Ô#Ñ2ùs   ƒé   r]   rŒ   rV   rœ   )r®   rV   rœ   rW   r¨   c                ó&   — | j                  dd«      S )Nr¨   r   rË   )rÅ   s    rH   rÎ   z.MemoryService.keyword_search.<locals>.<lambda>  s   €  1§5¡5¨°!Ó#4€ rJ   rÏ   )Úlowerr:   Ú
connectionÚexecuteÚfetchallÚjsonÚloadsr|   Úanyr×   Úsort)rF   Úqueryr¤   ró   ÚrowsrÂ   Úrowrx   r�   rí   rƒ   r„   Úmatchedr¨   rî   s                 @rH   Úkeyword_searchzMemoryService.keyword_searchË  s¼  ø€ ð —k‘k“mˆà�]‰]×%Ñ%Ó'ð 		¨:Ø×%Ñ%ðð �[�M Ð# q¨¨°QÐ%7Ð8ó÷ ‰h‹jð ÷		ð )+ˆØó 	ˆCØ;>¸Ò;O”t—z‘z # oÑ"6Ô7ÐUWˆHØ—\‘\ 'Ó*Ò0¨b×7Ñ7Ó9ˆEØ(0¯©°VÓ(<Ò(BÀÖD !�A—G‘G•IÐDˆDÐDØ—|‘| IÓ.Ò4°"×;Ñ;Ó=ˆGð ˆGØˆEØ˜eÑ#Ø�Ø˜‘�ÜÓ2¨TÔ2Ô2Ø�Ø˜‘
�Ø˜gÑ%Ø�Ø˜‘
�âØ—‘à! -Ñ0Ø&)¨,Ñ&7Ø&)¨,Ñ&7Ø (§¡¨Y¸Ó ;Ø!&ñöð)	ð> 	�‰Ñ4¸dˆÔCØ�v˜ˆÐ÷Y		ñ 		üò Es   ¬+F Ã FÆ F
c               ó�   — | j                  ||dz  ¬«      }| j                  ||dz  ||¬«      }| j                  ||d¬«      }|d| S )uœ  Hybrid search: keyword (metadata) + semantic (vector) + RRF fusion.

        Combines keyword search over document metadata (topic, tags, summary)
        with semantic (vector) search via Ollama embeddings, then fuses the two
        result lists using Reciprocal Rank Fusion (RRF) per RAGraph research.

        Postup:
        1. Keyword search over topic/tags/summary â†’ results_a
        2. Semantic search via Ollama embeddings â†’ results_b
        3. RRF fusion â†’ ranked fused results with rrf_score

        Research reference: RAGraph (arXiv:2408.03245) â€” hybrid BM25+vector retrieval
        with reciprocal rank fusion for improved precision.
        r^   r­   r£   é<   )rÚ   N)rþ   rÆ   rå   )rF   r»   r¤   r�   r¥   Úkeyword_resultsÚsemantic_resultsÚfuseds           rH   Úhybrid_searchzMemoryService.hybrid_search	  se   € ð. ×-Ñ-¨jÀÈÁ	Ð-ÓJˆð  ×/Ñ/Ø˜e a™i¨u¸#ð 0ó 
Ðð
 —‘˜Ð0@ÀB�ÓGˆØ�V�eˆ}ÐrJ   r^   )r¤   ÚdepthÚrelationship_typec               óÔ  ‡ ‡‡— |j                  «       }t        ‰ j                  j                  j                  j                  «       «      }g }|D ]&  }||j                  «       v sŒ|j                  |«       Œ( |sg S t        «       }	i Š|D ]˜  }
|
|	v rŒ|	j                  |
«       d‰|
<   ‰ j                  j                  |
||¬«      }|j                  «       D ]J  \  }}|D ]@  }||	vsŒ|	j                  |«       t        t        ‰j                  |d«      |«      «      ‰|<   ŒB ŒL Œš i }‰j                  «       D ]G  \  }}‰ j                  j                  |«      }|D ]"  Šdd|z   z  }|j                  ‰d«      |z   |‰<   Œ$ ŒI g }t        |j                  «       d„ d¬«      D ]½  \  Š}‰ j                  ‰«      }|€Œ|j                  ‰|j                   |j"                  |j$                  j                  d
d«      |t        ˆˆˆ fd„‰ j                  j                  j&                  D «       «      |	D �cg c]!  }‰‰ j                  j                  |«      v r|‘Œ# c}dœ«       Œ¿ |d	| S c c}w )ué  Graph-based retrieval via entity relationship traversal (MemGraphRAG).

        Performs breadth-first traversal over the entity relationship graph
        starting from the query entity, collecting all documents reachable
        within `depth` hops.  Returns documents sorted by graph proximity.

        Research reference: MemGraphRAG â€” memory-aware hierarchical retrieval
        through entity co-occurrence graphs.

        Postup:
        1. Najde entity v navigÃ¡toru podle entity_query
        2. Provede BFS do hloubky `depth` pÅ™es KnowledgeNavigator.get_related_entities
        3. SbÃ­rÃ¡ vÅ¡echny dokumenty spojenÃ© s nalezenÃ½mi entity
        4. Å˜adÃ­ dokumenty podle vzdÃ¡lenosti v grafu (blÃ­Å¾ = relevantnÄ›jÅ¡Ã­)
        r   )r  r  éç  ré   r¬   c                ó   — | d   S )Nr]   rë   )Úitems    rH   rÎ   z,MemoryService.graph_search.<locals>.<lambda>q  s
   € °d¸1±g€ rJ   TrÏ   Nr„   r™   c              3  ó¶   •K  — | ]P  }‰‰j                   j                  j                  j                  |t	        «       «      v r‰j                  |d «      –— ŒR y­w)r  N)r(   Ú_entity_graphÚentity_documentsr|   r¸   )rì   ÚerÝ   Úentity_distancesrF   s     €€€rH   rï   z-MemoryService.graph_search.<locals>.<genexpr>|  sP   øè ø€ ò .à !Ø%¨¯©×)EÑ)E×)VÑ)V×)ZÑ)ZÐ[\Ô^aÓ^cÓ)dÑdð -×0Ñ0°°C×8ñ.ùs   ƒAA)r®   rV   rœ   rW   r¨   Úgraph_distanceÚmatched_entities)rò   rÖ   r(   r  r‡   rÔ   r×   r¸   ÚaddÚget_related_entitiesÚitemsÚintÚminr|   Úget_entity_documentsÚget_documentrV   rœ   rx   r  )rF   Úentity_queryr¤   r  r  rî   Úall_entitiesÚstarting_entitiesÚentityÚvisited_entitiesÚstart_entityÚrelatedÚdistanceÚentity_listÚdocument_scoresÚdoc_idsÚcontributionrÂ   r¨   r”   r  rÝ   r  s   `                    @@rH   Úgraph_searchzMemoryService.graph_search+  s¨  ú€ ð0 #×(Ñ(Ó*ˆÜ˜dŸn™n×:Ñ:×CÑC×HÑHÓJÓKˆð (*ÐØ"ò 	1ˆFØ˜fŸl™l›nÒ,Ø!×(Ñ(¨Õ0ð	1ñ !ØˆIô &)£UÐØ+-Ðà-ò 	ˆLØÐ/Ñ/ØØ× Ñ  Ô.Ø-.Ð˜\Ñ*à—n‘n×9Ñ9Ø EÐ=Nð :ó ˆGð *1¯©«ò Ñ%�˜+Ø)ò �FØÐ%5Ò5Ø(×,Ñ,¨VÔ4Ü36´sØ,×0Ñ0°¸Ó=¸xó8ó 4Ð(¨Ò0ññð	ð$ -/ˆØ 0× 6Ñ 6Ó 8ò 	ZÑˆF�HØ—n‘n×9Ñ9¸&ÓAˆGØ!ò Z�ð  # c¨H¡nÑ5�Ø*9×*=Ñ*=¸fÀcÓ*JÈ\Ñ*Y� Ò'ñ	Zð	Zð )+ˆÜ#Ø×!Ñ!Ó#Ñ)=Àtô
ò 	‰MˆF�Eð ×(Ñ(¨Ó0ˆHØÑ#Ø—‘à$Ø&.×&9Ñ&9Ø&.×&9Ñ&9Ø (× 1Ñ 1× 5Ñ 5°iÀÓ DØ!&Ü*-õ .à%)§^¡^×%AÑ%A×%RÑ%Rô.ó +ð &6ö-à !Ø%¨¯©×)LÑ)LÈQÓ)OÑOò ò-ñõð	ð2 �v˜ˆÐùò-s   È/&I%c                ó8   — | j                   j                  |«      S )u   VrÃ¡tÃ­ dokument podle ID.)r%   r|   )rF   rŒ   s     rH   r  zMemoryService.get_document‹  s   € à�‰×"Ñ" ;Ó/Ð/rJ   c                ó8   — | j                   j                  |«      S )u%   VrÃ¡tÃ­ dokumentovÃ¡ ID podle topiku.)r(   Úget_documents_by_topic)rF   r�   s     rH   Úsearch_by_topiczMemoryService.search_by_topic�  s   € à�~‰~×4Ñ4°UÓ;Ð;rJ   c                ó8   — | j                   j                  |«      S )u'   VrÃ¡tÃ­ dokumentovÃ¡ ID podle Å¡tÃ­tku.)r(   Úget_documents_by_tag)rF   r¥   s     rH   Úsearch_by_tagzMemoryService.search_by_tag“  s   € à�~‰~×2Ñ2°3Ó7Ð7rJ   c                ó6   — | j                   j                  «       S )u    VrÃ¡tÃ­ vÅ¡echny znÃ¡mÃ© topiky.)r(   Ú
get_topics©rF   s    rH   r.  zMemoryService.get_topics—  s   € à�~‰~×(Ñ(Ó*Ð*rJ   c                ó6   — | j                   j                  «       S )u"   VrÃ¡tÃ­ vÅ¡echny znÃ¡mÃ© Å¡tÃ­tky.)r(   Úget_all_tagsr/  s    rH   Úget_tagszMemoryService.get_tags›  s   € à�~‰~×*Ñ*Ó,Ð,rJ   c                óú   — | j                  «       D �cg c]  }| j                  |«      ‘Œ }}|D �cg c]  }|€Œ|‘Œ	 }}t        t        t           |«      }| j
                  j                  |||«      S c c}w c c}w )u&   Zkontroluje, zda je obsah duplicitnÃ­.)Ú_all_document_idsr  r   Úlistr   r)   Úcheck_duplicate)rF   rU   rV   rÝ   Úexisting_documentsÚdÚcast_documentss          rH   r6  zMemoryService.check_duplicateŸ  s“   € ð ×0Ñ0Ó2ö
àð ×Ñ˜fÕ%ð
Ðð 
ð *<ÖM A¸q¹}šaÐMÐÐMÜ26ÜÔ"Ñ#Ð%7ó3
ˆð ×(Ñ(×8Ñ8Ø�Z ó
ð 	
ùò
ùò Ns   “A3±A8¹A8c                ó  — | j                   j                  «       }|| j                  j                  «       t	        | j
                  j                  «       «      t	        | j
                  j                  «       «      |j                  dd«      dœS )u?   RychlÃ¡ kontrola stavu vÅ¡ech komponent pamÄ›Å¥ovÃ©ho systÃ©mu.ÚhealthyF)Ú	embeddingÚvector_store_countÚnavigator_topicsÚnavigator_tagsr;  )	r'   Úhealth_checkr&   ÚcountÚlenr(   r.  r1  r|   )rF   Úembedding_healths     rH   r@  zMemoryService.health_check±  sp   € à×1Ñ1×>Ñ>Ó@Ðà)Ø"&×"3Ñ"3×"9Ñ"9Ó";Ü # D§N¡N×$=Ñ$=Ó$?Ó @Ü! $§.¡.×"=Ñ"=Ó"?Ó@Ø'×+Ñ+¨I°uÓ=ñ
ð 	
rJ   )Úauditc               ój  — |j                   st        d«      ‚| j                  j                  t	        |j
                  |j                  j                  |j                  j                  dd|j                  j                  |j                  j                  t        j                  |j                  |j                   |j                  |j                  dœ|j                   ¥t#        j"                  «       t#        j"                  «       ¬«      «       |r¥| j$                  �™| j$                  j'                  t(        j*                  d|j
                  |j
                  |j                  |j                  j                  t-        |j                   j/                  «       «      t1        |j                  «      dœ¬«       |S )	zßJurassic-pattern: register an Instance Resource Graph node.

        Stores the node in the knowledge graph layer (navigation + audit).
        The node must have business_semantics (IPOMSQ) and domain_constraints.
        z6KG1Node requires business_semantics (IPOMSQ framework)r™   zknowledge/graph)Úkg1_typeÚbusiness_semanticsÚdomain_constraintsÚevidence)rŒ   r0   rV   r³   rœ   r2   r3   rs   rx   Ú
created_atÚ
updated_atÚmemory_kg1_registered)rF  r0   Úbusiness_semantics_keysÚevidence_countrt   )rG  r{   r(   Úadd_documentr   r®   r“   r0   rV   r2   r3   r   ÚINDEXEDÚtyperH  rI  rx   rˆ   r#   rŠ   r   r‹   r5  rÔ   rB  )rF   ÚnoderD  s      rH   Úregister_kg1_nodezMemoryService.register_kg1_node¼  sH  € ð ×&Ò&ÜÐUÓVÐVð 	�‰×#Ñ#ÜØ ŸG™GØŸ+™+×/Ñ/ØŸ;™;×1Ñ1Ø!Ø,Ø—k‘k×'Ñ'Ø ŸK™K×3Ñ3Ü%×-Ñ-à $§	¡	Ø*.×*AÑ*AØ*.×*AÑ*AØ $§¡ñ	ð
 —m‘mðô  Ÿ9™9›;ÜŸ9™9›;ô#ô	
ñ, �T—^‘^Ð/Ø�N‰N×!Ñ!Ü×-Ñ-Ø.ØŸ™Ø!ŸW™Wà $§	¡	Ø!%§¡×!6Ñ!6Ü/3°D×4KÑ4K×4PÑ4PÓ4RÓ/SÜ&)¨$¯-©-Ó&8ñ	ð "ô ð ˆrJ   c                ól   — | j                   j                  «        | j                  j                  «        y)u   UzavÅ™e vÅ¡echna pÅ™ipojenÃ­.N)r&   Úcloser'   r/  s    rH   rU  zMemoryService.closeñ  s&   € à×Ñ×ÑÔ!Ø×Ñ×$Ñ$Õ&rJ   r›   c               ó  — |s|s|r_|j                   }|xs |j                  dd«      |d<   |r||d<   |r||d<   ddlm}  |||¬«      }| j                  j                  |«       y| j                  j                  |«       y)	u'   PÅ™idÃ¡ dokument do KnowledgeNavigator.r�   Úuncategorizedrƒ   r‡   r   ro   )rx   N)rx   r|   r‰   rM   r(   rO  )rF   r”   r�   rƒ   r‡   rx   rM   Úupdated_documents           rH   r�   z!MemoryService._index_in_navigatorú  s   € ñ ‘D™HØ×(Ñ(ˆHØ %Ò O¨¯©°g¸Ó)OˆH�WÑÙØ#'�˜Ñ ÙØ'/�˜Ñ$å+á& x¸(ÔCÐØ�N‰N×'Ñ'Ð(8Õ9à�N‰N×'Ñ'¨Õ1rJ   r§   c               óÊ   — t        «       }|r*|j                  | j                  j                  |«      «       |r*|j                  | j                  j	                  |«      «       |S )u8   ZÃ­skÃ¡ sadu dokumentovÃ½ch ID pro danÃ½ topik/Å¡tÃ­tek.)r¸   Úupdater(   r(  r+  )rF   r�   r¥   Úidss       rH   rº   z MemoryService._get_candidate_ids  sL   € ô ›ˆÙØ�J‰J�t—~‘~×<Ñ<¸UÓCÔDÙØ�J‰J�t—~‘~×:Ñ:¸3Ó?Ô@Øˆ
rJ   c                óÀ   — g }| j                   j                  «       D ],  }|j                  | j                   j                  |«      «       Œ. t	        t        |«      «      S )u/   VrÃ¡tÃ­ vÅ¡echny dokumentovÃ¡ ID z navigÃ¡toru.)r(   r.  Úextendr(  r5  r¸   )rF   rß   r�   s      rH   r4  zMemoryService._all_document_ids!  sQ   € àˆØ—^‘^×.Ñ.Ó0ò 	IˆEØ�N‰N˜4Ÿ>™>×@Ñ@ÀÓGÕHð	Iô ”C˜“LÓ!Ð!rJ   )r:   r   r#   zAuditLog | Noner$   zEmbeddingConfig | Noner%   z SQLiteKnowledgeRepository | Noner&   zKnowledgeVectorStore | Noner'   zEmbeddingService | Noner(   zKnowledgeNavigator | Noner)   zDeduplicationEngine | Noner*   ústr | Path | Noner+   ÚboolÚreturnÚNone)rU   ÚbytesrV   rC   r0   rC   r`  zClassificationResult | None)rŽ   z
str | Pathr0   ú
str | Noner1   r^  r2   zDocumentTrust | Noner3   zSensitivity | NonerZ   r_  r`  útuple[KnowledgeDocument, bool])rU   rb  rV   rC   r0   rC   r�   rc  rƒ   úlist[str] | Noner‡   re  r2   r   r3   r   r`  rd  )
r»   rC   r¤   r  r�   rc  r¥   rc  r`  úlist[dict[str, Any]])r   )rØ   rf  rÙ   rf  rÚ   r  r`  rf  )rú   rC   r¤   r  r`  rf  )
r  rC   r¤   r  r  r  r  rc  r`  rf  )rŒ   rC   r`  zKnowledgeDocument | None)r�   rC   r`  ú	list[str])r¥   rC   r`  rg  )r`  rg  )rU   rb  rV   rC   r`  r   )r`  zdict[str, Any])rR  r   rD  r_  r`  r   )r`  ra  )
r”   r   r�   rc  rƒ   re  r‡   re  r`  ra  )r�   rc  r¥   rc  r`  zset[str])Ú__name__Ú
__module__Ú__qualname__Ú__doc__rI   rY   r€   r   r<   r   r=   r¡   rÆ   Ústaticmethodrå   rþ   r  r%  r  r)  r,  r.  r2  r6  r@  rS  rU  r�   rº   r4  rë   rJ   rH   r"   r"   9   s­  „ ñ
ð  &*Ø)-Ø7;Ø48Ø59Ø/3Ø;?Ø+/Ø"ñ6*ð !ð6*ð #ð	6*ð
 'ð6*ð 5ð6*ð 2ð6*ð 3ð6*ð -ð6*ð 9ð6*ð )ð6*ð ð6*ð 
ó6*ðpØðØ*-ðØ:=ðà	$óð, !%Ø"&Ø&*Ø*.ØñF!àðF!ð ð	F!ð
  ðF!ð $ðF!ð (ðF!ð ðF!ð 
(óF!ðZ &Ø Ø!%Ø%)Ø,×5Ñ5Ø#.×#7Ñ#7ñ4!àð4!ð ð	4!ð
 ð4!ð ð4!ð ð4!ð #ð4!ð ð4!ð !ð4!ð 
(ó4!ðt Ø ØñFàðFð ð	Fð
 ðFð ðFð 
óFðP ð ð2Ø'ð2à'ð2ð ð2ð 
ò	2ó ð2ðp ñ	<àð<ð ð	<ð
 
ó<ðD Ø Øñ àð ð ð	 ð
 ð ð ð ð 
ó ðL ØØ(,ñ^àð^ð ð	^ð
 ð^ð &ð^ð 
ó^ó@0ó<ó8ó+ó-ð
àð
ð ð
ð 
ó	
ó$	
ð ñ	3àð3ð ð	3ð
 
ó3ój'ð !Ø!%Ø%)ñ2à#ð2ð ð	2ð
 ð2ð #ð2ð 
ó2ð8 !Øñ	ð ðð ð	ð
 
óô"rJ   r"   )8rk  Ú
__future__r   rö   Úloggingrˆ   Úpathlibr   Útypingr   r   Ú$cyberbrain26.data_plane.sqlite_storer   Ú$cyberbrain26.knowledge_plane.cachingr   r	   r
   Ú'cyberbrain26.knowledge_plane.classifierr   r   r   Ú&cyberbrain26.knowledge_plane.contractsr   r   r   r   r   r   r   Ú*cyberbrain26.knowledge_plane.deduplicationr   r   Ú-cyberbrain26.knowledge_plane.embedding_configr   Ú.cyberbrain26.knowledge_plane.embedding_servicer   Ú)cyberbrain26.knowledge_plane.local_sourcer   Ú+cyberbrain26.knowledge_plane.markdown_storer   Ú'cyberbrain26.knowledge_plane.monitoringr   Ú'cyberbrain26.knowledge_plane.navigationr   Ú'cyberbrain26.knowledge_plane.repositoryr   Ú)cyberbrain26.knowledge_plane.vector_storer   Ú!cyberbrain26.security_plane.auditr   r    Ú	getLoggerrh  rS   r"   Ú__all__rë   rJ   rH   ú<module>r�     sš   ðñõ #ã Û Û Ý ß å ?÷ñ ÷
ñ ÷
÷ ñ ÷õ JÝ KÝ JÝ EÝ Dõõ Nõ÷ Gà	ˆ×	Ñ	˜8Ó	$€÷n"ñ n"ðb Ð
�rJ   