Ë
    MÞëj½  ã                  óê   — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZmZ  ej:                  e«      Z G d„ d«      Z dgZ!y)zISQLite metadata repository for the first mySecondBrain26 ingestion slice.é    )ÚannotationsN)ÚAny)Úuuid4)ÚSQLiteDatabase)ÚTextChunker)ÚDocumentRegistrationÚDocumentStatusÚDocumentTrustÚKnowledgeDocumentÚSensitivity)ÚEmbeddingService)ÚKnowledgeVectorStoreÚVectorDocument)ÚAuditEventTypeÚAuditLogc                  óh   — e Zd ZdZddœd
d„Zdddœ	 	 	 	 	 	 	 dd„Zdd„Zedd„«       Zedd	„«       Z	y)ÚSQLiteKnowledgeRepositorya?  Persist document metadata without persisting source bytes.

    The unique source-and-content hash is the idempotency boundary: re-scanning
    an unchanged source returns the existing document instead of creating a
    duplicate.  A changed source has another digest and becomes a separate,
    traceable version.
    N)Ú	audit_logc               ó    — || _         || _        y )N)Údatabaser   )Úselfr   r   s      úM/home/oem/CyberBrain26-unified/src/cyberbrain26/knowledge_plane/repository.pyÚ__init__z"SQLiteKnowledgeRepository.__init__%   s   € Ø ˆŒØ"ˆ�ó    )Úvector_storeÚembedding_servicec               óò  — | j                  |«       |j                  }t        j                  |j                  «      j                  «       }| j                  j                  «       5 }|j                  d|j                  |f«      j                  «       }|�| j                  |«      dfcd d d «       S t        j                  «       }t        dt        «       j                  › �|j                  |j                   ||j"                  |j$                  |j&                  t(        j*                  t-        |j.                  «      ||¬«      }	|j                  d|	j0                  |	j                  |	j                   |	j2                  |	j"                  |	j$                  j4                  |	j&                  j4                  |	j6                  j4                  t9        j:                  |	j.                  dd¬«      |	j<                  |	j>                  f«       d d d «       | j@                  �ƒ| j@                  jC                  tD        jF                  d	j0                  |	j0                  |	j                  |	j2                  |	j$                  j4                  |	j&                  j4                  d	œ¬
«       |���|��Œ	 tI        «       jK                  |j                  jM                  dd¬«      	j                   ¬«      }
|jO                  |
D �cg c]  }|jP                  ‘Œ c}«      }tS        |
|«      D ��cg c]Š  \  }}tU        tW        jX                  |jZ                  |j\                  «      ||jP                  |	j                  |jZ                  |j^                  |j                  xs |	j2                  |j\                  ¬«      ‘ŒŒ }}}|ja                  |«       | j                  j                  «       5 }|j                  dt(        jb                  j4                  t        j                  «       |	j0                  f«       d d d «       |	dfS 	dfS # 1 sw Y   �Œ/xY wc c}w c c}}w # 1 sw Y   Œ)xY w# td        $ r tf        ji                  d«       Y 	dfS w xY w)NzLSELECT * FROM knowledge_documents WHERE source_id = ? AND content_sha256 = ?FÚ	document_©Údocument_idÚ	source_idÚ
source_uriÚcontent_sha256Ú
media_typeÚtrustÚsensitivityÚstatusÚmetadataÚ
created_atÚ
updated_ata-  
                INSERT INTO knowledge_documents(
                    document_id, source_id, source_uri, content_sha256, media_type,
                    trust_level, sensitivity, status, metadata_json, created_at, updated_at
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                )ú,ú:)Ú
separatorsÚ	allow_nanÚknowledge_document_registered)r!   r#   Útrust_levelr&   )ÚactionÚresourceÚmemory_writer(   zutf-8Úreplace)Úerrors)Úsource_path)ÚidÚvectorÚtextr!   ÚpathÚmtimeÚsha256Úchunk_indexzOUPDATE knowledge_documents SET status = ?, updated_at = ? WHERE document_id = ?u>   Embedding/vector store selhal, registrace zÅ¯stÃ¡vÃ¡ v SQLite.T)5Ú_validate_registrationÚsourceÚhashlibr<   ÚcontentÚ	hexdigestr   ÚtransactionÚexecuter!   ÚfetchoneÚ_row_to_documentÚtimer   r   Úhexr"   r$   r%   r&   r	   Ú
REGISTEREDÚdictr(   r    r#   Úvaluer'   ÚjsonÚdumpsr)   r*   r   Úrecordr   ÚMEMORY_UPDATEDr   Ú
chunk_textÚdecodeÚembed_textsr9   Úzipr   r   Ú	_chunk_idr6   r=   r;   Úadd_documentsÚINDEXEDÚ	ExceptionÚloggerÚ	exception)r   Úregistrationr   r   r?   ÚdigestÚ
connectionÚrowÚnowÚdocumentÚchunksÚcÚvectorsÚvÚvector_docss                  r   Úregisterz"SQLiteKnowledgeRepository.register)   sÛ  € ð 	×#Ñ# LÔ1Ø×$Ñ$ˆÜ—‘ × 4Ñ 4Ó5×?Ñ?ÓAˆØ�]‰]×&Ñ&Ó(ð *	¨JØ×$Ñ$Ø^Ø×!Ñ! 6Ð*ó÷ ‰h‹jð ð ˆØ×,Ñ,¨SÓ1°5Ð8÷*	ñ *	ô —)‘)“+ˆCÜ(Ø'¬«¯© }Ð5Ø ×*Ñ*Ø!×,Ñ,Ø%Ø'×2Ñ2Ø—l‘lØ"×.Ñ.Ü%×0Ñ0Ü˜l×3Ñ3Ó4ØØôˆHð ×Ñðð ×(Ñ(Ø×&Ñ&Ø×'Ñ'Ø×+Ñ+Ø×'Ñ'Ø—N‘N×(Ñ(Ø×(Ñ(×.Ñ.Ø—O‘O×)Ñ)Ü—J‘J˜x×0Ñ0¸ZÐSXÔYØ×'Ñ'Ø×'Ñ'ðô÷-*	ðV �>‰>Ð%Ø�N‰N×!Ñ!Ü×-Ñ-Ø6Ø!×-Ñ-Ø%×1Ñ1à!)×!3Ñ!3Ø&.×&=Ñ&=Ø#+§>¡>×#7Ñ#7Ø#+×#7Ñ#7×#=Ñ#=ñ	ð "ô ð Ñ#Ð(9Ñ(EðcÜ$›×1Ñ1Ø ×(Ñ(×/Ñ/°À	Ð/ÓJØ (× 3Ñ 3ð 2ó �ð ,×7Ñ7ÈÖ8PÀA¸¿»Ò8PÓQ�ô !$ F¨GÓ 4÷ñ ˜˜1ô #Ü/×9Ñ9¸!¿-¹-ÈÏÉÓWØ ØŸV™VØ"*×"4Ñ"4ØŸ]™]ØŸg™gØ Ÿx™xÒB¨8×+BÑ+BØ$%§M¡Mö	ð�ñ ð ×*Ñ*¨;Ô7à—]‘]×.Ñ.Ó0ð °JØ×&Ñ&ØiÜ'×/Ñ/×5Ñ5´t·y±y³{ÀH×DXÑDXÐYô÷ð ˜ˆ~Ðˆx˜ˆ~Ð÷o*	ñ *	üò~ 9Qùó÷ð ûô
 ò cÜ× Ñ Ð!aÕbà˜ˆ~Ððcús_   Á%AP.Â0EP.ÊAQ Ë.P;ÌQ ÌBQ Î&.Q ÏA
QÐQ Ð.P8Ð;Q ÑQÑQ ÑQ6Ñ5Q6c                óÌ   — | j                   j                  «       5 }|j                  d|f«      j                  «       }d d d «       �| j	                  |«      S d S # 1 sw Y   ŒxY w)Nz7SELECT * FROM knowledge_documents WHERE document_id = ?)r   r\   rD   rE   rF   )r   r    r\   r]   s       r   ÚgetzSQLiteKnowledgeRepository.getŒ   sf   € Ø�]‰]×%Ñ%Ó'ð 	¨:Ø×$Ñ$ØIÈKÈ>óç‰h‹jð ÷	ð .1¨_ˆt×$Ñ$ SÓ)ÐFÀ$ÐF÷		ð 	ús   ›"AÁA#c                ó\  — | j                   }|j                  st        d|j                  › d�«      ‚|j                  j	                  «       r|j
                  j	                  «       st        d«      ‚| j                  st        d«      ‚| j                  j	                  «       st        d«      ‚y )Nzknowledge source 'z' is not approvedz4knowledge source_id and source_uri must not be emptyz"document content must not be emptyzmedia_type must not be empty)	r?   ÚapprovedÚPermissionErrorr!   Ústripr"   Ú
ValueErrorrA   r$   )rZ   r?   s     r   r>   z0SQLiteKnowledgeRepository._validate_registration“   s˜   € à×$Ñ$ˆØ�ŠÜ!Ð$6°v×7GÑ7GÐ6HÐHYÐ"ZÓ[Ð[Ø×Ñ×%Ñ%Ô'¨v×/@Ñ/@×/FÑ/FÔ/HÜÐSÓTÐTØ×#Ò#ÜÐAÓBÐBØ×&Ñ&×,Ñ,Ô.ÜÐ;Ó<Ð<ð /r   c                óÌ   — t        | d   | d   | d   | d   | d   t        | d   «      t        | d   «      t        | d   «      t	        j
                  | d	   «      | d
   | d   ¬«      S )Nr    r!   r"   r#   r$   r0   r&   r'   Úmetadata_jsonr)   r*   r   )r   r
   r   r	   rL   Úloads)r]   s    r   rF   z*SQLiteKnowledgeRepository._row_to_documentŸ   s   € ä Ø˜MÑ*Ø˜+Ñ&Ø˜<Ñ(ØÐ/Ñ0Ø˜<Ñ(Ü  MÑ 2Ó3Ü# C¨Ñ$6Ó7Ü! # h¡-Ó0Ü—Z‘Z  OÑ 4Ó5Ø˜<Ñ(Ø˜<Ñ(ô
ð 	
r   )r   r   r   zAuditLog | NoneÚreturnÚNone)rZ   r   r   zKnowledgeVectorStore | Noner   zEmbeddingService | Nonerp   ztuple[KnowledgeDocument, bool])r    Ústrrp   zKnowledgeDocument | None)rZ   r   rp   rq   )r]   r   rp   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   re   rg   Ústaticmethodr>   rF   © r   r   r   r      sz   „ ñð RVõ #ð 59Ø59ñaà*ðað 2ð	að
 3ðað 
(óaóFGð ò	=ó ð	=ð ò
ó ñ
r   r   )"rv   Ú
__future__r   r@   rL   ÚloggingrG   Útypingr   Úuuidr   Ú$cyberbrain26.data_plane.sqlite_storer   Ú$cyberbrain26.knowledge_plane.chunkerr   Ú&cyberbrain26.knowledge_plane.contractsr   r	   r
   r   r   Ú.cyberbrain26.knowledge_plane.embedding_servicer   Ú)cyberbrain26.knowledge_plane.vector_storer   r   Ú!cyberbrain26.security_plane.auditr   r   Ú	getLoggerrs   rX   r   Ú__all__rx   r   r   ú<module>r…      sb   ðÙ Oå "ã Û Û Û Ý Ý å ?Ý <÷õ õ Lß Zß Fà	ˆ×	Ñ	˜8Ó	$€÷Q
ñ Q
ðh 'Ð
'�r   