
    ʝj                         d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
  ej                  e      ZdZdZded	efd
Z G d de
      Zy)u  ShotContinuityStep — 자세 정본·중의어 교정·carried state 저작 (order 21.91).

s40/s41 레시피의 텍스트 안전망 데이터 스텝:
  data.pose_canon[] = {character_ko, character_short_id, pose_en, shots, basis_ko}
  data.carried[tag] = {carried_en, basis_ko}
  data.pose_fix[tag] = {movement_en, figures_en, carried_en}

still_recipe_mode="v1" 일 때만 applicable(if_still_recipe).
계약 정본: backend/app/modules/pipeline/shot_continuity_author.py docstring.
    NPath)AnyDictOptional)
StepRunner   3resolvedreturnc                 v   ddl }ddlm} ddlm}  ||      dz  | z  }|j                         }t        |j                  d            D ]\  }|j                         s|j                  |j                  j                  d             |j                  |j                                ^ |j                         dd S )	u  그 팩 디렉토리의 **스템 바이트**를 접는다.

    `shot_continuity` 는 스템이 여섯뿐이고 셋이 한 스텝에서 함께 쓰이므로
    디렉토리 통째로 접어도 과하지 않다(스틸 쪽은 스템이 수십 개라 한 장씩
    접는다).
    r   Nr   )PROMPTS_BASEshot_continuity*utf-8   )hashlibpathlibr   app.modules.prompt_loaderr   sha256sortedglobis_fileupdatenameencode
read_bytes	hexdigest)r   r   r   r   dhfs          Y/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/steps/shot_continuity_step.py_pack_content_hashr#      s     6\..9AAAFF3K 99;HHQVV]]7+,HHQ\\^$ ! ;;="    c                   X    e Zd ZdZdefdZdedeeeef      fdZ	d	dedeeef   fdZ
y)
ShotContinuityStepuJ   샷 연속성 저작 — pose_canon·pose_fix·carried (레시피 이식).r   c                 V   dd l }dd l}ddlm} ddlm} ddlm} |j                  t         |t              t         |t                    |j                   || j                        d}|j                  |j                  |d      j!                  d            j#                         d d	 S )
Nr   settings)resolve_prompt_version)compute_config_hash)still_recipe_modeschema_versionprompt_versionprompt_pack_contentmodelproject_config_hashT)	sort_keysr   r   )r   jsonapp.core.configr)   +app.modules.pipeline.shot_continuity_authorr*   app.core.step_runnerr+   r,   SCHEMA_VERSIONPROMPT_VERSIONr#   openai_modelproject_configr   dumpsr   r   )selfr   _jsonr)   r*   r+   payloads          r"   _config_hashzShotContinuityStep._config_hash3   s    ,	
 	= "*!;!;,4^D $6&~6$8**#6t7J7J#K
  ~~KK4K077@

)+cr 	r$   step_idc                 L   ddl m} t        |j                        | j                  z  dz  dz  | j
                  z  |z  dz  }|j                         r&	 t        j                  |j                  d            S y # t        $ r!}t        j                  d||       Y d }~y d }~ww xY w)	Nr   r(   checkpointsepisodeszmanifest.jsonr   )encodingu%   shot_continuity: %s 로드 실패: %s)r4   r)   r   projects_dir
project_id
episode_idexistsr3   loads	read_text	Exceptionloggerwarning)r<   r@   r)   cpexcs        r"   _load_prev_checkpointz(ShotContinuityStep._load_prev_checkpointR   s    , &&'oo -.0:;oo '(*9: 	
 99;zz",,,"@AA
 	  ;Wc  	s   $A9 9	B#BB#modec           
         ddl m}m} ddlm} | j                  d      }|xs i j                  di       j                  dg       xs g } || j                  d            }g }i }	|D ]  }
|
j                  d      }|t        |      }|
j                  d	      r|
d	   |	|<   |
j                  d
g       xs g D ]\  }|j                  d      }| ||t        |      f|      s,|j                  |t        |      |j                  d      xs dd       ^  | j                  d      }i }|xs i j                  di       j                  dg       xs g D ][  }|j                  d      }t        |t              s%|j                  d      xs d||<   |j                  d      sO||	vsT|d   |	|<   ] |s4t        j                  d       dddt        | j                         g i i ddS ddlm} | j                   j#                  |      j%                  |j&                  | j&                  k(  |j(                  dk(        j+                         }|D ci c]&  }|j,                  s|j.                  |j,                  ( }} ||||	|t0        | j2                  | j5                               }t7        |      t7        |      dt        | j                         |dS c c}w )Nr   )build_selected_keysis_selected)run_shot_continuityshot_validatordatascenesshot_selectionscene_indexscene_headingshots
shot_indexdescription )rZ   r]   r^   
scene_savesegmentstextheadingu,   shot_continuity: 선택 샷 없음 — no-op)
pose_canoncarriedpose_fix)applicable_countcompleted_countfailed_countr-   config_hashrW   )EntityCanon	character)r\   scene_textsscene_headingschar_name_to_shortr.   r:   opik_metadata)*app.modules.pipeline.outdoor_direct_commonrS   rT   r5   rU   rP   getintappend
isinstancerL   infor7   r?   app.models.projectrk   dbqueryfilterrF   entity_typeallshort_idr   r8   r:   build_opik_metadatalen)r<   rQ   rS   rT   rU   validator_cprX   selected_keysr\   rn   scsishshiscene_save_cprm   segrk   rowsero   rW   s                         r"   _executezShotContinuityStep._executec   s   	
	
 112BC$"))&"599(BGM2+&&'78
 )+B&BzRBvvo&%'%8r"ffWb)/R/ff\*;"BC>=A')&)#h')vvm'<'B 0 * 22<@&(!'R,,VR8<<ZLRPRRC'B"c""%''&/"7RB779%"N*B),YN2& S KKFG$%#$ !"0#002')bbI  	3 GGMM+&V&&$//9'';6 SU 	 )-
(,1

AFFAJJ 	 
 ##)1)..224
 !$E
"5z,,,.
 	

s   K#KN)resume)__name__
__module____qualname____doc__strr?   r   r   r   rP   r    r$   r"   r&   r&   0   sO    Tc >S Xd38n5M "Z
S Z
S#X Z
r$   r&   )r   r3   loggingr   r   typingr   r   r   r6   r   	getLoggerr   rL   r7   r8   r   r#   r&   r   r$   r"   <module>r      s]   	    & & +			8	$   *M
 M
r$   