
    Ui	              
      n   U d Z ddlmZ ddlZ ej                  d       ej                  d       ej                  d       ej                  d       ej                  d       ej                  d	       ej                  d
       ej                  d      gZded<   ddZddZddZ	ddZ
dddZddZy)u?   engine_v2/content_sanitizer.py — 3레이어 인젝션 방어.    )annotationsNz-(?i)ignore\s+(all\s+)?previous\s+instructionsz!(?i)you\s+are\s+now\s+(?:a|an)\s+z(?i)system\s*:\s*z(?i)<\s*/?\s*system\s*>z(?i)act\s+as\s+(?:a|an|if)\s+z"(?i)forget\s+(everything|all|your)z(?i)new\s+instructions?\s*:z(?i)override\s+(your|the)\s+zlist[re.Pattern[str]]_INJECTION_PATTERNSc                    d}| }t         D ]3  }|j                  |      }|t        |      z  }|j                  d|      }5 ||fS )ua   L1: 패턴 기반 정규식 필터링.

    Returns:
        (sanitized_text, flagged_count)
    r   z
[REDACTED])r   findalllensub)textflaggedresultpatternmatchess        J/home/jay/workspace/services/multimodel-bot/engine_v2/content_sanitizer.pysanitize_l1r      sU     GF& 3//&)3w<\623 7?    c                $    t        |       }d| dS )u=   L2: 구조적 격리 — <UPSTREAM_DATA> 태그로 감싸기.z<UPSTREAM_DATA>
z
</UPSTREAM_DATA>)_escape_envelope_tags)r	   escapeds     r   wrap_upstreamr   #   s    #D)Gwi'9::r   c                &    | j                  dd      S )u"   L2 보조: 태그 이스케이프.z</UPSTREAM_DATA>z&lt;/UPSTREAM_DATA&gt;)replace)r	   s    r   r   r   )   s    <<*,DEEr   c                <    t        |       \  }}t        |      }||fS )uw   전체 Sanitize 파이프라인 (L1 + L2).

    Returns:
        (sanitized_and_wrapped_text, total_flagged_count)
    )r   r   )r	   cleanedr
   wrappeds       r   sanitizer   .   s(     #4(GWG$GGr   c                    | |k\  S )uZ   L3: 오케스트레이터 게이트. flagged_count >= threshold이면 True(중단 필요). )flagged_count	thresholds     r   
check_gater   9   s    I%%r   c                    | xr | S )uV   L4: 에러 자동 제외. error=True AND fallback 미사용이면 True(중단 필요).r   )errorfallback_useds     r   check_error_gater#   >   s    &&&r   )r	   strreturnztuple[str, int])r	   r$   r%   r$   )   )r   intr   r'   r%   bool)r!   r(   r"   r(   r%   r(   )__doc__
__future__r   recompiler   __annotations__r   r   r   r   r   r#   r   r   r   <module>r.      s    E " 	 BJJ?@BJJ34BJJ#$BJJ)*BJJ/0BJJ45BJJ-.BJJ./	. * 	;F
&
'r   