
    ֓j                        d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZ  ej                  e      ZdZdZ G d	 d
e      Zy)u  background_share_plan 스텝 — 에피소드 전체 배경 공유·참조 계획 (B-2).

2026-07-19 사용자 확정: 샷별 개별 판정 대신 에피소드 전체를 조망하는 LLM
계획으로 '배경 참조 vs 앞쪽 샷(prev) 참조'를 구분 지휘. 스틸 소비 시 이
계획이 shot_ref_classify prev 판정의 상위 권위(부재=기존 판정 fail-safe).
flag ``background_share_plan_enabled`` default OFF — OFF=no-op(불변).
    )annotationsN)Path)AnyDictListOptional)
StepRunner   1c                  *    e Zd ZdZddZddZdd	dZy)
BackgroundSharePlanStepbackground_share_planc                    dd l }dd l}ddlm}m} t
         |t              |d}|j                  |j                  |d      j                  d            j                         d d S )Nr   )VALIDATION_VERSIONresolve_prompt_version)schema_versionpackvalidation_versionT)	sort_keysutf-8   )hashlibjson*app.modules.pipeline.background_share_planr   r   SCHEMA_VERSIONPROMPT_VERSIONsha256dumpsencode	hexdigest)selfr   _jsonr   r   payloads         _/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/steps/background_share_plan_step.py_config_hashz$BackgroundSharePlanStep._config_hash   sd    	
 -*>: #5
 ~~KK4K077@

)+cr 	    c                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   settingscheckpointsepisodeszmanifest.jsonr   )encodingu+   background_share_plan: %s 로드 실패: %s)app.core.configr)   r   projects_dir
project_id
episode_idexistsr   loads	read_text	Exceptionloggerwarning)r!   step_idr)   cpexcs        r$   _load_prev_checkpointz-BackgroundSharePlanStep._load_prev_checkpoint3   s    , &&'oo -.0:;oo '(*9: 	
 99;zz",,,"@AA
 	  A7C  	s   $A9 9	B#BB#c                     ddl m} ddlm} 	 	 	 	 	 	 d* fd}t	        t        |dd            s |i ddd      S  j                  d	      xs i }i |j                  di       xs i j                  d
g       xs g D ]E  }|j                  d      }t        |t              s%t        |j                  d      xs d      |<   G  j                  d      xs i }i }	|j                  di       xs i j                  dg       xs g D ]N  }
|
j                  d      }||
j                  d      xs g D cg c]  }t        |       c}|	t        |      <   P  j                  d      xs i } j                  d      xs i }i }|j                  di       xs i j                  dg       xs g D ]B  }
|
j                  d      }||
j                  d      s)t        |
d         |t        |      <   D g }g }|j                  di       xs i j                  dg       xs g D ]  }
|
j                  d      }|t        |      }|
j                  dg       xs g D ]  }|j                  d      }| t        |      |	j                  |      xs g vr7d| dt        |       }|j                  |       |j                  d| d| d|j                  |d       dt        |j                  d      xs d                |s |i ddd      S dj                  fdt              D              }dj                  |      }	  |||| j                  t         j!                  d       !      }|d%   |d&   |d'}t$        j)                  d(t+        |d%   j                  d)      xs g       t+        |      |d&           ||d$d$d      S c c}w # t"        $ r6}t$        j'                  d"        |d#t        |      id$dd$      cY d }~S d }~ww xY w)+Nr   r(   )run_background_share_plandatac               R    |dk(  rdn|rdnd|||t         j                         | dS )Nr   	completedpartialfailed)statusapplicable_countcompleted_countfailed_countr   config_hashr=   )r   r%   )r=   
applicabler?   rA   r!   s       r$   _resultz1BackgroundSharePlanStep._execute.<locals>._resultJ   s:     $*Q;K"+Y$.#, &"0#002
 
r&   background_share_plan_enabledF)rG   r?   rA   
scene_savesegmentsscene_indextext shot_selectionscenesselected_shot_indicesshot_validatorscene_directorprimary_locationshots
shot_indexSshz- z	 | scene z | location: z | descriptionz

c              3  4   K   | ]  }d | d|      yw)z[scene z]
N ).0siscene_textss     r$   	<genexpr>z3BackgroundSharePlanStep._execute.<locals>.<genexpr>   s+      #
) bT[_-.)s   
r   )shots_blockscenes_block	shot_tagsr^   project_configprompt_versionopik_metadatau+   background_share_plan: 계획 저작 실패errorr
   planattempts)rh   ri   rc   u8   background_share_plan: 그룹 %d · 샷 %d (attempts=%d)share_groups)
r=   Dict[str, Any]rG   intr?   rl   rA   rl   returnrk   )r-   r)   r   r<   boolgetattrr:   get
isinstancerl   strappendjoinsortedrd   r   build_opik_metadatar4   r5   	exceptioninfolen)r!   moder)   r<   rH   scene_cpsegr]   sel_cpselectedscxval_cpdirector_cploc_by_scenerc   
shot_linesrX   shitagrb   ra   outr9   r=   r^   s   `                        @r$   _executez BackgroundSharePlanStep._executeD   sT   ,	
	"	,/	4B	 G95B C2!qCC --l;Ar&(LL,277
BGM2MC'B"c""%cggfo&;"<B N
 ++,<=C)+::fb)/R44XrBHbHB&B~$&FF+B$C$Ir$I%K$IqCF$I%KR! I ++,<=C001ABHb')??62.4"99(BGM2MB&B~"&&);"<(+B/A,B(CSW% N
  "	 "
::fb)/R44XrBHbHB&BzRBffWb)/R/ff\*;#c(8<<3C3Ir"J"RCz*  %!!Yrd#L$4$4R$<#=#bff]39r:;= 0 I  2!qCC{{ #
[)#
 
 ii
+	J+')#'#22-"66+-	C  KJ"

 	FF/526	NC
O	

 tQqAAA%Kb  	JJK#c(#QqJ J	Js$   5O	,O 	P+PPPN)rm   rr   )r7   rr   rm   zOptional[Dict[str, Any]])resume)rz   rr   rm   rk   )__name__
__module____qualname__r7   r%   r:   r   r[   r&   r$   r   r      s    %G("eBr&   r   )__doc__
__future__r   r   loggingpathlibr   typingr   r   r   r   app.core.step_runnerr	   	getLoggerr   r5   r   r   r   r[   r&   r$   <module>r      sO    #    , , +			8	$ MBj MBr&   