
    "Aj                        d Z ddlZddlZddlmZ dZg dZg dZh dZg dZ	 ej                  d	       ej                  d
       ej                  d       ej                  d       ej                  d       ej                  d      gZ ej                  d       ej                  d       ej                  d      gZeD  cg c]$  }  ej                   ej                  |             & c} Z G d d      ZdadefdZyc c} w )a  
scope_policy_checker.py
Wiederverwendbares Modul fuer alle Graphiti-Import-Skripte.
Laedt import_scope_policy.yaml und prueft Dateipfade und Content
gegen Allowlist, Denylist und Content-Filter.

Verwendung:
    from scope_policy_checker import ScopeChecker
    checker = ScopeChecker()
    ok, reason = checker.check_path("/opt/obsidian-vault/YouTube-Research/Welle-1/ID-034.md")
    ok, reason = checker.check_content(content_string)
    clean_content = checker.clean_content(content_string)
    N)Pathz//opt/struktur/graphiti/import_scope_policy.yaml)	u   LüftungsProfiLueftungsprofizLP-spezifischz	LP-SkillszLP-spezifischezAgent Solutionszprojekte-LPzprojekte-AGinkasso2025)
LP-CONTEXTLP-SPECIFICzLP-
AG-CONTEXTAG-SPECIFIC03-Projekte06-Daily-Notes
00-Staging	07-ArchivzUse-Cases/LueftungsprofizUse-Cases/LP-r   LUEFTUNGSPROFIz.envcredentialssecretszSYNC-LPzSYNC-AGVolltranskriptRohdaten>   .claude	.claudian	.obsidian08-AttachmentsINSTALLsessionsr   r   r   r   r
   r	   r   r   )z,/opt/obsidian-vault/YouTube-Research/Welle-1z,/opt/obsidian-vault/YouTube-Research/Welle-2z*/opt/obsidian-vault/YouTube-Research/Pilotzn(?i)(the|das|this|dieses?) video[^.]{0,80}?(discusses|is about|covers|erklaert|zeigt|handelt|bespricht)[^.]*\.zD(?i)(is|are) (hosted|published|available|featured) on youtube[^.]*\.zM(?i)(published|posted|created|produced|released).{0,30}(youtube|video)[^.]*\.zP(?i)(channel|kanal)[^.]{0,40}provides (content|tutorials|insights|videos)[^.]*\.z<(?i)the episode[^.]{0,60}?(is about|discusses|titled)[^.]*\.z(?i)(Webronaq|Jack Roberts|Der KI-Doktor|Mike Mildenberger|Julian Ivanov|Marc De Fanti|Philip Thomas|AI mit Arnie|Alex Sprogis|Prompt Engineer)[^.]{0,40}(published|posted|created|produced|made|released)[^.]*\.z#(?i)\w+.s\s+creator\s+created\s+\w+z,(?i)\w+\s+is\s+used\s+in\s+\w+\s+environmentzC(?i)^\s*-\s+the video (about|on|regarding) \w+ is hosted on youtubec                   t    e Zd ZdZdedefdZdedefdZdedefdZ	dedefd	Z
	 ddedefd
ZdedefdZy)ScopeCheckerz7Prueft Pfade und Content gegen die Import-Scope-Policy.filepathreturnc                     t        |      t              }|j                  }|D ]  }|t        v sdd| dfc S  t        D ]  }|v sdd| dfc S  t        fdt        D              }|sdS y)zp
        Gibt (True, "ok") oder (False, "Grund") zurueck.
        Denylist gewinnt immer vor Allowlist.
        FzDENY: Verzeichnis 'z' ist gesperrtzDENY: Pfadpattern 'c              3   @   K   | ]  }j                  |        y wN)
startswith).0rootfps     ./opt/struktur/graphiti/scope_policy_checker.py	<genexpr>z*ScopeChecker.check_path.<locals>.<genexpr>]   s     DdbmmD)D   Tok)FzKDENY: Pfad liegt nicht unter einem erlaubten Root (allowed_roots in Policy))strr   partsDENIED_DIR_NAMESDENIED_PATH_PATTERNSanyALLOWED_ROOTS)selfr   pathr*   partpatternallowedr#   s          @r$   
check_pathzScopeChecker.check_pathI   s    
 ]Bx 

 	ID'' 3D6HHH	I
 , 	LG"} 3G9NKKK	L
 DmDDhh    contentc                 p    t         D ]-  }|j                  |      }|sdd|j                          dfc S  y)zt
        Prueft ob Content private Terme enthaelt.
        Gibt (True, "ok") oder (False, "Grund") zurueck.
        FzDENY: Private Term 'z' im Contentr'   )PRIVATE_TERM_REsearchgroup)r/   r6   patms       r$   check_contentzScopeChecker.check_contentc   sF    
 # 	MC

7#A 4QWWYK|LLL	M r5   frontmatterc                     t        |j                  dd            j                         }|dvrdd| dfS t        |j                  dd            }|d	v rdd
| dfS y)zR
        Prueft YAML-Frontmatter auf Pflichtfelder fuer YouTube-Research.
        graphiti_readyfalse)trueyes1FzDENY: graphiti_ready=z (muss true sein)internal_id >   046zDENY: internal_id=z ist explizit gesperrtr'   )r)   getlower)r/   r>   griids       r$   check_frontmatterzScopeChecker.check_frontmattern   sw     !17;<BBD))1"5FGGG+//-45'>.se3IJJJr5   c                    |j                  d      }g }|D ]  }|j                         rj                  d      r|j                  |       8t	        fdt
        D              }|rSt	        fdt        D              }|rnt	        fdt        D              }|r|j                  |        dj                  |      S )zz
        Bereinigt Content: entfernt Video-Meta-Saetze, Tautologien,
        private Label-Vorkommen zeilenweise.
        
#c              3   @   K   | ]  }|j                          y wr   r9   r!   r;   strippeds     r$   r%   z-ScopeChecker.clean_content.<locals>.<genexpr>   s     Nscjj2Nr&   c              3   @   K   | ]  }|j                          y wr   rQ   rR   s     r$   r%   z-ScopeChecker.clean_content.<locals>.<genexpr>   s      U#H!5 Ur&   c              3   @   K   | ]  }|j                          y wr   rQ   rR   s     r$   r%   z-ScopeChecker.clean_content.<locals>.<genexpr>   s     S

8 4Sr&   )	splitstripr    appendr-   r8   VIDEO_META_PATTERNSTAUTOLOGY_PATTERNSjoin)	r/   r6   linescleanedlinehas_privatehas_video_metahas_tautologyrS   s	           @r$   clean_contentzScopeChecker.clean_contentz   s    
 d# 	!Dzz|Hx2237t$NoNNK  UAT UUNS@RSSMNN4 %	!& yy!!r5   c                     |j                  d      }g }d}|D ]N  }|j                  d      r'|dd j                         t        fd|D              }|r>|j	                  |       P dj                  |      S )zv
        Entfernt vollstaendige Markdown-Sektionen aus dem Content.
        Gibt bereinigten Content zurueck.
        rN   Fz##    Nc              3   &   K   | ]  }|v  
 y wr    )r!   bsec_names     r$   r%   z6ScopeChecker.strip_blocked_sections.<locals>.<genexpr>   s     :Q1=:s   )rV   r    rW   r-   rX   r[   )r/   r6   blockedr\   resultskipr^   rh   s          @r$   strip_blocked_sectionsz#ScopeChecker.strip_blocked_sections   sz     d# 	$Du%8>>+:'::d#	$ yy  r5   metac                    |j                  dd      j                         }|j                  dd      j                         }|j                  dd      j                         }|j                  dd      j                         }t        D ]B  }|j                  |d      j                         }|j                  |d      j                         }D d| d| d| d	| S )
z2Erzeugt neutrale Quellenzeile ohne private Labels.titlerF   channel
youtube_idlanguagezQuelle: z
 | Kanal: z | ID: z | Sprache: )rH   rW   PRIVATE_TERMSreplace)r/   rm   ro   rp   yt_idlangterms          r$   neutral_source_linez ScopeChecker.neutral_source_line   s    ((7B'--/((9b)//1((<,224((:r*002! 	8DmmD"-335EoodB/557G	8 %
7)75'dVTTr5   N))zVolltext-KontextQuellenanker)__name__
__module____qualname____doc__r)   tupler4   r=   dictrL   rb   rl   rx   rf   r5   r$   r   r   F   s    A3 5 4	S 	U 	
T 
e 
"S "S ": (L!c !PS!"
U 
U 
Ur5   r   r   c                  .    t         
t               a t         S r   )_checkerr   rf   r5   r$   get_checkerr      s    >Or5   )r}   reospathlibr   POLICY_PATHrs   r,   r+   r.   compilerY   rZ   escaper8   r   r   r   )ts   0r$   <module>r      s0   
 	 ?	   BJJ  A  BBJJVWBJJ_`BJJbcBJJNOBJJ  d  e  BJJ56BJJ>?BJJUV  6CC:2::ibiil+CkU kU^ \ g Ds   )D