
    Oj                         d Z ddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZ  ej                  e      ZdZdZ G d d	ee	      Zy)
uV   Shot별 VE 판정 StepRunner — scene_director 이후 shot 단위 VE + 변형 확정.    N)AnyDict)
StepRunner)_EntityStepMixin   z6.202605172247c                   4    e Zd ZdZdefdZddeeef   fdZy)ShotDirectorStepu   Step 16.5: Shot별 visible entities 판정.

    scene_director의 씬 레벨 VE를 shot 단위로 세분화하고,
    변형 캐릭터의 전환 시점을 확정한다.
    returnc                     t         t        d}t        j                  t	        j
                  |d      j                  d            j                         dd S )u   schema_version + prompt_version 조합 hash. step_runner._check_cp_mismatch
        가 호출 — bump 시 stale cp BLOCK (allowlist 외).
        )schema_versionprompt_versionT)	sort_keyszutf-8N   )SHOT_DIRECTOR_SCHEMA_VERSIONSHOT_DIRECTOR_PROMPT_VERSIONhashlibsha256_jsondumpsencode	hexdigest)selfpayloads     W/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/steps/shot_director_step.py_config_hashzShotDirectorStep._config_hash)   sM    
 ;:
 ~~KK4077@

)+cr 	    c                    | j                  d      }|xs i j                  di       j                  dg       }| j                  d      }|r!|j                  di       j                  d      sddlm}  |dd	d
      | j                  d      }|r!|j                  di       j                  d      sddlm}  |ddd
      ddlm}  ||| j                  d       | j                  d      }| j                  d      }	| j                  d      }
| j                  d      }|
r*|
j                  di       j                  d      r	|
d   d   }nY|rQ|j                  d      r@|d   j                  dg       |d   j                  dg       |d   j                  dg       d}ng g g d}ddlm}  |||d   |d   |r|j                  d      nd |	r|	j                  d      nd || j                  | j                               }t        |d<   t        |d<   t        |j                  dg             t        |      d|t        | j                         dS )N
scene_savedatasegmentsscene_directorscenesr   )AppErrorzstep.no_inputu   scene_director 결과 없음i  )codemessagestatus_codeshot_validatoru   shot_extract 결과 없음)assert_no_failed_scenesshot_director)consumer_stepshot_selectionentity_relationentity_filterentity_mergefiltered_entities
characters	locationsprops)r0   r1   r2   )direct_shots)r    scene_director_datashot_extract_datashot_selection_dataentity_relation_dataentitiesproject_configopik_metadatar   r   )completed_countapplicable_countfailed_countr   r   config_hash)_load_prev_checkpointgetapp.core.errorsr#   "app.core.steps.shot_validator_stepr(   r9   "app.modules.pipeline.shot_directorr3   build_opik_metadatar   r   lenr   )r   modesave_cpr    director_cpr#   shot_cpr(   sel_cprel_cp	filter_cpmerge_cpr8   r3   results                  r   _executezShotDirectorStep._execute5   s\   ,,\:Mr&&vr266z2F 001AB+//&""="A"A("K0$6  ,,-=>gkk&"599(C0$4  	O)<)<O\ ++,<= ++,=> ..?	--n=vr2667JK ()<=H(,,v.&v.22<D%f-11+rB!&)--gr:H ')rBGHC +F 3%fo6<

6 2$7=F!34..224	
 $@ #?   #6::h#;< #H:,,.
 	
r   N)resume)	__name__
__module____qualname____doc__strr   r   r   rO    r   r   r	   r	   "   s)    
c 
J
c3h J
r   r	   )rT   r   jsonr   loggingtypingr   r   app.core.step_runnerr   app.core.steps.entity_stepsr   	getLoggerrQ   loggerr   r   r	   rV   r   r   <module>r^      sM    \     + 8			8	$  !   0 ]
' ]
r   