
    Zjc                        U d Z ddlmZ ddlZddlmZ dZded<    edd	h      Z	d
ed<    ej                  d      Z ej                  d      ZddZddZ	 	 	 	 	 	 	 	 	 	 ddZy)u  Gaze direction enum SOT + target pairing + dispatch helper (Area #2 Q1 + Q3 + Q7).

closed-world enum only — LLM producer (shot_staging) emit gaze_direction_kind +
gaze_target_id, consumer = enum check via helper.
regex / substring / NL fallback 금지 (Gate 1).

validate_pairing = production runtime primary defense for kind↔target pairing.
shot_staging v15 부터 schema 의 oneOf 조건부가 제거됐다 (OpenAI strict structured-output
호환 — combinator 미지원). schema 는 gaze_direction_kind enum + gaze_target_id
required-nullable 만 강제하고, kind↔target 정합은 shot_staging 코드측에서 이
validate_pairing 으로 fail-fast 검증한다.
Q7 closure: gaze_target_id shape = registered short_id only.
    )annotationsN)AppError)cameradownupdistantclosed_eyes
off_screenlooks_at_characterlooks_at_objectztuple[str, ...]GAZE_DIRECTION_KINDSr   r   zfrozenset[str]TARGET_REQUIRED_KINDSz
^C\d{2,3}$z^(P|B)\d{2,3}$c                    | t         v S )N)r   )kinds    M/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/gaze_direction.pyis_target_requiredr       s    (((    c           	        | t         vrt        d| d| dt                t        |       }|r|st        d| d| d      |s|t        d| d| d|d	      |rb| d
k(  r+t        j	                  |xs d      st        d| d|d	      | dk(  r,t
        j	                  |xs d      st        d| d|d	      y y y )Nz0step.contract_violation.gaze_direction_kind.enumz: invalid kind=z, expected one of z>step.contract_violation.gaze_target_id.missing_for_target_kindz: kind=z requires gaze_target_idzBstep.contract_violation.gaze_target_id.present_for_non_target_kindz forbids gaze_target_id (got )r    z,step.contract_violation.gaze_target_id.shapez3: kind=looks_at_character requires ^C\d{2,3}$ (got r   z4: kind=looks_at_object requires ^(P|B)\d{2,3}$ (got )r   r   r   _CHAR_ID_REmatch_OBJECT_ID_RE)r   	target_idwheretarget_requireds       r   validate_pairingr   $   s%   ''>g_TH,>?S>TU
 	
 ).OyLgWTH$<=
 	
 y4PgWTH$A)aP
 	

 ''0A0A)/r0R>'OPY}\]^  $$]-@-@b-Q>'PQZP]]^_  .R$ r   c                p    t         j                  | xs d      sy| |vry|j                  |       }|sy| |fS )u  target_id (C##) → (sid, canonical_name) lookup.

    structural validation only: C## shape + visible_set membership.
    None = visible 밖 → consumer 가 결정 (skip or warn).
    name matching / noun matching / character/object 재판정 금지 (Gate 1).r   N)r   r   get)r   visible_character_ids
id_to_namer   names        r    resolve_visible_character_targetr#   C   sD     Y_"--->>)$Dtr   )r   strreturnbool)r   r$   r   z
str | Noner   r$   r%   None)
r   r$   r    zset[str]r!   zdict[str, str]r   r$   r%   ztuple[str, str] | None)__doc__
__future__r   reapp.core.errorsr   r   __annotations__	frozensetr   compiler   r   r   r   r#    r   r   <module>r0      s    # 	 $) o 
 )23GIZ2[(\ ~ \bjj'

,-)>#  	
 r   