Ë
    MÞëj€.  ã                  ó  — d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	  ed¬«       G d„ d	«      «       Z
 ed¬«       G d
„ d«      «       Z ed¬«       G d„ d«      «       Z ed¬«       G d„ d«      «       Z G d„ d«      Zg d¢Zy)z©Navigation and organization layer for the knowledge plane.

Provides topic clustering, tag extraction, and a navigation index
for easy orientation in the knowledgebase.
é    )Úannotations)Údefaultdict)Ú	dataclassÚfield)ÚKnowledgeDocumentT)Úfrozenc                  ól   — e Zd ZU dZded<   ded<    ee¬«      Zded<   dZd	ed
<    ee¬«      Z	ded<   y)ÚTopicClusterzA cluster of related documents.ÚstrÚ
cluster_idÚlabel©Údefault_factoryú	list[str]Údocument_idsNzlist[float] | NoneÚcentroid_vectorÚtags)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Úlistr   r   r   © ó    úM/home/oem/CyberBrain26-unified/src/cyberbrain26/knowledge_plane/navigation.pyr
   r
      s8   … á)àƒOØƒJÙ#°DÔ9€L�)Ó9Ø*.€OÐ'Ó.Ù¨DÔ1€Dˆ)Ô1r   r
   c                  ó:   — e Zd ZU dZded<   ded<   ded<   ded	<   y
)ÚNavigationEntryz4A navigation entry linking a topic to its documents.r   Útopicr   r   ÚintÚchunk_countÚfloatÚlast_updatedN©r   r   r   r   r   r   r   r   r   r      s   … á>àƒJØÓØÓØÔr   r   c                  ó:   — e Zd ZU dZded<   ded<   ded<   ded<   y)Ú
EntityEdgez»An edge in the entity relationship graph.

    Represents a relationship between two entities in documents.
    Format: (source_entity, target_entity, relationship_type, document_id)
    r   Úsource_entityÚtarget_entityÚrelationship_typeÚdocument_idNr$   r   r   r   r&   r&   $   s!   … ñð ÓØÓØÓØÔr   r&   c                  óf   — e Zd ZU dZ ee¬«      Zded<    ee¬«      Zded<    ee¬«      Z	ded<   y)	ÚKnowledgeGraphzóA knowledge graph built from document entity relationships.

    Entities: entity name -> set of related entity names
    Edges: (source_entity, target_entity) -> list of EntityEdge
    Entity documents: entity name -> set of document IDs
    r   zdict[str, set[str]]Úentitieszdict[str, list[EntityEdge]]ÚedgesÚentity_documentsN)
r   r   r   r   r   Údictr-   r   r.   r/   r   r   r   r,   r,   2   s:   … ññ %*¸$Ô$?€HÐ!Ó?Ù).¸tÔ)D€EÐ&ÓDÙ,1À$Ô,GÐÐ)ÔGr   r,   c                  óö   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zdd
„Z	 d	 	 	 	 	 dd„Z	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 	 	 d d„Zd!d„Zd!d„Z	 d	 	 	 	 	 d"d„Z	 	 d#	 	 	 	 	 	 	 d$d„Zy)%ÚKnowledgeNavigatorzÇOrganizes and navigates the knowledgebase.

    Provides:
    - Topic clustering based on document metadata
    - Tag-based navigation
    - Full-text search index
    - Temporal versioning view
    c                ó€   — t        t        «      | _        t        t        «      | _        i | _        t        «       | _        y ©N)r   r   Ú_topicsÚ_tagsÚ	_clustersr,   Ú_entity_graph©Úselfs    r   Ú__init__zKnowledgeNavigator.__init__J   s,   € Ü-8¼Ó->ˆŒÜ+6´tÓ+<ˆŒ
Ø24ˆŒä-;Ó-=ˆÕr   c                ó†  — |j                   j                  d|j                   j                  dd«      «      }| j                  |   j                  |j                  «       |j                   j                  d|j                   j                  dg «      «      }t        |t        «      r,|j                  d«      D �cg c]  }|j                  «       ‘Œ }}|D ]*  }| j                  |   j                  |j                  «       Œ, |j                   j                  d|j                   j                  dg «      «      }t        |t        «      r,|j                  d«      D �cg c]  }|j                  «       ‘Œ }}t        |t        «      r¶|D ]c  }|| j                  vrg | j                  |<   |j                  | j                  |   vsŒ<| j                  |   j                  |j                  «       Œe t        |«      d	kD  r?t        |«      D ]0  \  }	}
||	d	z   d
 D ]   }| j                  |
|d|j                  «       Œ" Œ2 y
y
y
c c}w c c}w )z Index a document for navigation.r   Úclassification_topicÚuncategorizedr   Úclassification_tagsú,Úclassification_entitiesr-   é   NÚco_reference)ÚmetadataÚgetr5   Úappendr*   Ú
isinstancer   ÚsplitÚstripr6   r   ÚlenÚ	enumerateÚadd_entity_edge)r:   Údocumentr   r   ÚtÚtagr-   ÚeÚentityÚiÚentity1Úentity2s               r   Úadd_documentzKnowledgeNavigator.add_documentQ   s  € ð ×!Ñ!×%Ñ% g¨x×/@Ñ/@×/DÑ/DÐE[Ð]lÓ/mÓnˆØ�‰�UÑ×"Ñ" 8×#7Ñ#7Ô8ð × Ñ ×$Ñ$ V¨X×->Ñ->×-BÑ-BÐCXÐZ\Ó-]Ó^ˆÜ�dœCÔ Ø'+§z¡z°#£Ö7 !�A—G‘G•IÐ7ˆDÐ7Øò 	9ˆCØ�J‰J�s‰O×"Ñ" 8×#7Ñ#7Õ8ð	9ð ×$Ñ$×(Ñ(Ð)BÀH×DUÑDU×DYÑDYÐZdÐfhÓDiÓjˆÜ�h¤Ô$Ø+3¯>©>¸#Ó+>Ö? a˜Ÿ™�	Ð?ˆHÐ?Ü�h¤Ô%Ø"ò D�Ø §¡Ñ+Ø)+�D—J‘J˜vÑ&Ø×'Ñ'¨t¯z©z¸&Ñ/AÒAØ—J‘J˜vÑ&×-Ñ-¨h×.BÑ.BÕCð	Dô �8‹}˜qÒ Ü"+¨HÓ"5ò e‘J�A�wØ#+¨A°©E¨FÐ#3ò e˜Ø×,Ñ,¨W°g¸~Èx×OcÑOcÕdñeñeð !ð &ùò 8ùò @s   Â8H9ÅH>c                óH   — t        | j                  j                  «       «      S )zReturn all known topics.)Úsortedr5   Úkeysr9   s    r   Ú
get_topicszKnowledgeNavigator.get_topicso   s   € ä�d—l‘l×'Ñ'Ó)Ó*Ð*r   c                ó:   — | j                   j                  |g «      S )z Return document IDs for a topic.)r5   rE   )r:   r   s     r   Úget_documents_by_topicz)KnowledgeNavigator.get_documents_by_topics   s   € à�|‰|×Ñ  rÓ*Ð*r   c                ó:   — | j                   j                  |g «      S )zReturn document IDs for a tag.)r6   rE   )r:   rO   s     r   Úget_documents_by_tagz'KnowledgeNavigator.get_documents_by_tagw   s   € à�z‰z�~‰~˜c 2Ó&Ð&r   c                óH   — t        | j                  j                  «       «      S )zReturn all known tags.)rW   r6   rX   r9   s    r   Úget_all_tagszKnowledgeNavigator.get_all_tags{   s   € ä�d—j‘j—o‘oÓ'Ó(Ð(r   c           
     ó´   — g }| j                   j                  «       D ],  \  }}|j                  t        ||t	        |«      d¬«      «       Œ. t        |d„ ¬«      S )z'Build a navigation index of all topics.g        )r   r   r!   r#   c                ó   — | j                   S r4   )r   )rP   s    r   ú<lambda>z9KnowledgeNavigator.get_navigation_index.<locals>.<lambda>‹   s
   € ¨Q¯W©W€ r   )Úkey)r5   ÚitemsrF   r   rJ   rW   )r:   Úentriesr   Údoc_idss       r   Úget_navigation_indexz'KnowledgeNavigator.get_navigation_index   s[   € àˆØ"Ÿl™l×0Ñ0Ó2ò 	‰NˆE�7Ø�N‰NÜØØ!(Ü # G£Ø!$ô	õð	ô �gÑ#4Ô5Ð5r   c                ó   — t        t        «      }|D ]`  }d}d|j                  v r0|j                  j                  d«      d   j                  d«      d   }||   j	                  |j
                  «       Œb t        |«      S )z)Group documents by their source URI host.Úunknownz://rB   ú/r   )r   r   Ú
source_urirH   rF   r*   r0   )r:   Ú	documentsÚclustersÚdocÚhosts        r   Úcluster_by_sourcez$KnowledgeNavigator.cluster_by_source�   sw   € ä)4´TÓ):ˆØò 	3ˆCØˆDØ˜Ÿ™Ñ&Ø—~‘~×+Ñ+¨EÓ2°1Ñ5×;Ñ;¸CÓ@ÀÑC�Ø�T‰N×!Ñ! #§/¡/Õ2ð		3ô
 �H‹~Ðr   c                ó„  — |j                  «       }g }|D ]¨  }|j                  j                  «       D ]B  }t        |t        «      sŒ||j                  «       v sŒ'|j                  |j                  «        n ||j                  j                  «       v sŒ|j                  |vsŒŽ|j                  |j                  «       Œª |S )z-Simple keyword search over document metadata.)ÚlowerrD   ÚvaluesrG   r   rF   r*   rk   )r:   Úkeywordrl   Úkeyword_lowerÚresultsrn   Úvalues          r   Úsearch_by_keywordz$KnowledgeNavigator.search_by_keyword—   s¡   € àŸ™›ˆØˆØò 	0ˆCàŸ™×,Ñ,Ó.ò �Ü˜e¤SÕ)¨m¸u¿{¹{»}Ò.LØ—N‘N 3§?¡?Ô3Ùðð
  §¡× 4Ñ 4Ó 6Ò6¸3¿?¹?ÐRYÒ;YØ—‘˜sŸ™Õ/ð	0ð ˆr   Nc                ó   — |j                   syy)u  MemStrata pattern: deterministic staleness check.

        Returns True if document is currently valid, False if superseded.
        Uses (subject, relation, object) supersedence rule â€” no similarity threshold,
        no LLM call for stale fact retirement.
        TF)Úsuperseded_by)r:   rM   Úcurrent_times      r   Úcheck_temporal_validityz*KnowledgeNavigator.check_temporal_validity¦   s   € ð ×%Ò%ØØr   c                óP   — |D �cg c]  }| j                  |«      sŒ|‘Œ c}S c c}w )z8Filter out superseded documents using temporal validity.)r|   )r:   rl   Úds      r   Úget_valid_documentsz&KnowledgeNavigator.get_valid_documents³   s%   € ð %ÖH�a¨×(DÑ(DÀQÕ(G’ÒHÐHùÒHs   …#œ#c                óP   — ddl m} |€ddl}|j                  «       } ||||¬«      S )z–Mark a document as superseded (MemStrata bi-temporal ledger).

        Sets valid_to to current time and records the superseding document ID.
        r   )ÚreplaceN)Úvalid_torz   )Údataclassesr�   Útime)r:   rM   rz   r{   r�   r„   s         r   Úsupersede_documentz%KnowledgeNavigator.supersede_document¹   s1   € õ 	(àÐÛàŸ9™9›;ˆLáØØ!Ø'ô
ð 	
r   c                óê  — || j                   j                  vr!t        «       | j                   j                  |<   || j                   j                  vr!t        «       | j                   j                  |<   || j                   j                  vr!t        «       | j                   j                  |<   || j                   j                  vr!t        «       | j                   j                  |<   | j                   j                  |   j	                  |«       | j                   j                  |   j	                  |«       t        ||||¬«      }|› d|› �}|| j                   j                  vrg | j                   j                  |<   | j                   j                  |   j                  |«       | j                   j                  |   j	                  |«       | j                   j                  |   j	                  |«       y)z°Add an edge to the entity relationship graph.

        Tracks co-occurrence and relationships between entities extracted
        from document classification metadata.
        )r'   r(   r)   r*   ú->N)r8   r-   Úsetr/   Úaddr&   r.   rF   )r:   r'   r(   r)   r*   ÚedgeÚedge_keys          r   rL   z"KnowledgeNavigator.add_entity_edgeÕ   s¡  € ð  × 2Ñ 2× ;Ñ ;Ñ;Ü9<»ˆD×Ñ×'Ñ'¨Ñ6Ø × 2Ñ 2× ;Ñ ;Ñ;Ü9<»ˆD×Ñ×'Ñ'¨Ñ6Ø × 2Ñ 2× CÑ CÑCÜADÃˆD×Ñ×/Ñ/°Ñ>Ø × 2Ñ 2× CÑ CÑCÜADÃˆD×Ñ×/Ñ/°Ñ>à×Ñ×#Ñ# MÑ2×6Ñ6°}ÔEØ×Ñ×#Ñ# MÑ2×6Ñ6°}ÔEÜØ'Ø'Ø/Ø#ô	
ˆð $�_ B } oÐ6ˆØ˜4×-Ñ-×3Ñ3Ñ3Ø13ˆD×Ñ×$Ñ$ XÑ.Ø×Ñ× Ñ  Ñ*×1Ñ1°$Ô7Ø×Ñ×+Ñ+¨MÑ:×>Ñ>¸{ÔKØ×Ñ×+Ñ+¨MÑ:×>Ñ>¸{ÕKr   c                óp   — t        | j                  j                  j                  |t	        «       «      «      S )z5Return entities directly related to the given entity.)rW   r8   r-   rE   rˆ   ©r:   rQ   s     r   Úget_entity_neighborsz'KnowledgeNavigator.get_entity_neighborsú   s(   € ä�d×(Ñ(×1Ñ1×5Ñ5°f¼c»eÓDÓEÐEr   c                óp   — t        | j                  j                  j                  |t	        «       «      «      S )z0Return document IDs containing the given entity.)rW   r8   r/   rE   rˆ   r�   s     r   Úget_entity_documentsz'KnowledgeNavigator.get_entity_documentsþ   s(   € ä�d×(Ñ(×9Ñ9×=Ñ=¸fÄcÃeÓLÓMÐMr   c                ó  — g }| j                   j                  j                  «       D ]X  \  }}|j                  |› d�«      s|j	                  d|› �«      sŒ/|D ]%  }|�|j
                  |k(  sŒ|j                  |«       Œ' ŒZ |S )zsReturn all relationship edges involving the given entity.

        Optionally filter by relationship type.
        r‡   )r8   r.   rd   Ú
startswithÚendswithr)   rF   )r:   rQ   r)   r.   rc   Ú	edge_listrŠ   s          r   Úget_entity_relationshipsz+KnowledgeNavigator.get_entity_relationships  sŠ   € ð #%ˆØ"×0Ñ0×6Ñ6×<Ñ<Ó>ò 	+‰NˆC�Ø�~‰~  ¨˜mÔ,°·±¸rÀ&À¸]Õ0KØ%ò +�DØ(Ð0°D×4JÑ4JÐN_Ó4_ØŸ™ TÕ*ñ+ð	+ð
 ˆr   c                ó&  — |dk  ri S |h}|g}i }d}|r}||k  rxg }|D ]b  }	| j                  |	«      }
|
D ]J  }||vsŒ|j                  |«       |j                  |«       |j                  |g «      j                  |«       ŒL Œd |}|dz  }|r||k  rŒx|S )a^  Return entities related to the given entity up to a traversal depth.

        Performs breadth-first traversal over the entity relationship graph.
        Returns a dict mapping distance -> list of entity names.
        depth=1 returns immediate neighbors (distance 1).
        depth=2 returns neighbors + their neighbors (distance 1 and 2).
        rB   )rŽ   r‰   rF   Ú
setdefault)r:   rQ   Údepthr)   ÚvisitedÚfrontierÚresultÚcurrent_depthÚnext_frontierÚcurrent_entityÚ	neighborsÚneighbors               r   Úget_related_entitiesz'KnowledgeNavigator.get_related_entities  sÊ   € ð �1Š9ØˆIà#˜HˆØ%˜hˆØ')ˆàˆÙ˜=¨EÒ1Ø')ˆMØ"*ò N�Ø ×5Ñ5°nÓE�	Ø )ò N�HØ wÒ.ØŸ™ HÔ-Ø%×,Ñ,¨XÔ6Ø×)Ñ)¨-¸Ó<×CÑCÀHÕMñ	NðNð %ˆHØ˜QÑˆMñ ˜=¨EÓ1ð ˆr   )ÚreturnÚNone)rM   r   r¢   r£   )r¢   r   )r   r   r¢   r   )rO   r   r¢   r   )r¢   zlist[NavigationEntry])rl   úlist[KnowledgeDocument]r¢   zdict[str, list[str]])rt   r   rl   r¤   r¢   r   r4   )rM   r   r{   úfloat | Noner¢   Úbool)rl   r¤   r¢   r¤   )rM   r   rz   r   r{   r¥   r¢   r   )
r'   r   r(   r   r)   r   r*   r   r¢   r£   )rQ   r   r¢   r   )rQ   r   r)   ú
str | Noner¢   zlist[EntityEdge])rB   N)rQ   r   r˜   r    r)   r§   r¢   zdict[int, list[str]])r   r   r   r   r;   rU   rY   r[   r]   r_   rg   rp   rx   r|   r   r…   rL   rŽ   r�   r•   r¡   r   r   r   r2   r2   @   s?  „ ñó>óeó<+ó+ó'ó)ó6óóð  IMðØ)ðØ9Eðà	óðIØ0ðIà	 óIð &*ð	
à#ð
ð ð
ð #ð	
ð
 
ó
ð8#Làð#Lð ð#Lð ð	#Lð
 ð#Lð 
ó#LóJFóNð
 <@ðØðØ.8ðà	óð$ Ø(,ð	"àð"ð ð"ð &ð	"ð
 
ô"r   r2   )r&   r,   r2   r   r
   N)r   Ú
__future__r   Úcollectionsr   rƒ   r   r   Ú&cyberbrain26.knowledge_plane.contractsr   r
   r   r&   r,   r2   Ú__all__r   r   r   ú<module>r¬      s¨   ðñõ #å #ß (å Dñ �$Ô÷2ð 2ó ð2ñ �$Ô÷ð ó ðñ �$Ô÷
ð 
ó ð
ñ �$Ô÷
Hð 
Hó ð
H÷sñ sòj d�r   