
    ej5i                    R   d Z ddlmZ ddlZddl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mZ ddlmZ ddlmZmZmZmZ  ej.                  e      Z ej4                  d      Zdd	lmZmZmZm Z  dd
Z!ddZ"	 	 	 	 	 	 	 	 d dZ#d!dZ$d"dZ%	 	 	 	 	 	 	 	 	 	 d#dZ&	 	 	 	 	 	 	 	 d$dZ'd%dZ(	 	 	 	 	 	 d&dZ)	 	 	 	 	 	 d'dZ*d(dZ+	 	 	 	 	 	 	 	 d)dZ,	 	 	 	 	 	 d*dZ-	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d+dZ.d,dZ/	 	 	 	 	 	 	 	 d-dZ0d.dZ1	 	 	 	 	 	 	 	 	 	 d/dZ2	 	 	 	 	 	 	 	 	 	 d0dZ3	 d1	 	 	 	 	 	 	 d2dZ4y)3u  이미지 생성 파이프라인 그래프 조립 서비스 (read-only).

설계 SOT: docs/w21b-pipeline-canvas-ui-20260629/design.html (§9 Codex 반영).

- 노드: DB ``image_asset`` (+ 후속: checkpoint virtual guide/sketch).
- 엣지: i2i(source/parent_image_id) / reference lineage / FP→bg→씬 구조키 / prev_scene.
- ``llm_call_log`` 는 검증/라벨 표시 용도 — UUID edge SOT 아님.

메인 파이프라인 무접촉 — 오직 읽기 전용 조회. 신규 모듈(기존 무수정).
    )annotationsN)Path)AnyDictListOptionalTuple)Session)EntityCanonEpisode
ImageAsset
SceneStillz^S(\d+)_Shot(\d+)$)
EpisodeRefPipelineEdgePipelineGraphResponsePipelineNodec                "    d|  d| d}| d|fS )uN   (thumb_url, full_url) for an image_asset id (frontend 파일 엔드포인트).z/api/v1/projects/z/images/z/filez?thumb=1 )
project_idimage_idbases      Y/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/pipeline_graph_service.py_image_urlsr   %   s(    zl(8*EBDV8d""    c                   | j                  t              j                  t        j                  |k(        j	                  t        j
                  j                               j                         }|D cg c]E  }t        |j                  d|j
                   d|j                  xs d j                               G c}S c c}w )NEP  )idlabel)queryr   filterr   order_byepisode_numberascallr   r   titlestripdbr   rowses       r   list_episodesr-   +   s    
	""j0	1	'((,,.	/		 	 A 	addBq'7'7&8!''-R"I"O"O"QR  s   3A
C c                   |sy| j                  t        j                        j                  t        j                  |k(  t        j                  j                  d            j                         j                         }|D ch c]  }|d   	 }}|D ]  }|j                  |v s|j                  c S  |d   j                  S c c}w )ux  episode_id 미지정 시 default 에피소드.

    첫 에피소드(예: 기획안)는 이미지 자산이 0개라 빈 캔버스가 되기 쉽다 →
    에피소드-스코프 image_asset 이 하나라도 있는 첫 에피소드(번호 순)를 고른다.
    공용 자산(episode_id IS NULL: 인물 ref/FP)은 콘텐츠 판단에서 제외. 없으면 첫 에피소드.
    Nr   )	r!   r   
episode_idr"   r   isnotdistinctr&   r   )r*   r   episodesr+   rwith_assetseps          r   _default_episode_idr6   8   s     
&&'	
%%3Z5J5J5P5PQU5V	W			 	 "&&A1Q4K&55K55L  A;>>	 's   Cc                    | j                  t              j                  t        j                  |k(        j	                         }|D ci c]  }|j
                  | c}S c c}w N)r!   r   r"   r   r&   r   r)   s       r   _entity_mapr9   P   sO    88K ''(>(>*(LMQQSD!"TADD!GT"""s   Ac                   | j                  t              j                  t        j                  |k(        }|"|j                  t        j                  |k(        }|j                         D ci c]  }|j                  | c}S c c}w r8   )r!   r   r"   r   r/   r&   r   )r*   r   r/   qss        r   
_still_mapr=   U   sk    
##J$9$9Z$GHAHHZ**j89UUW%WADD!GW%%%s   ,Bc                   t        | |j                        \  }}|j                  r|j                  |j                        nd }|j                  r|j                  |j                        nd }||j
                  nd }||j                  n|j                  }	d }
|j                  r2	 t        j                  |j                        }t        |t              r|}
t!        di d|j                  ddd|j"                  d|j                  d|r|j$                  nd d|r|j&                  nd d	|r|j(                  nd d
|j                  d|d|	d|j*                  d|j,                  d|d|d|j.                  d|j0                  d|j2                  d|j4                  d|j6                  d|j8                  d|j:                  d|j<                  d|
d|j>                  d|j@                  dtC        |jD                        S # t        t        f$ r$ t        j                  d|j                         Y fw xY w)Nz7pipeline_graph: invalid pipeline_metadata_json asset=%sr   node_originimage_asset
asset_type	entity_identity_short_identity_nameentity_typestill_idscene_index
shot_indexr/   variant_label	thumb_urlfull_urlpromptstatus
created_atgeneration_modelstagegeneration_call_idcandidate_indexattempt_indexpipeline_metadatapipeline_roledispositionis_intermediater   )#r   r   rB   getrF   rG   rH   pipeline_metadata_jsonjsonloads
isinstancedict	TypeError
ValueErrorloggerwarningr   rA   short_idnamerE   r/   rI   prompt_usedrM   rN   rO   rP   rQ   rR   rS   rU   rV   boolrW   )r   assetentitiesstillsrJ   rK   entstillrG   rH   rT   parseds               r   _asset_to_noderl   \   se    &j%((;Ix+0??(,,u
'C*/..FJJu~~&dE','8%##dK%*%6!!E<L<LJ26##	ZZ < <=F&$'$*!
  88! ## //	
 ), !$CHH (+COO     ## ))       ||!" ###$ //%& kk'( !33)* --+, ))-. ,/2 ))34 %%56 U2237 	 :& 	NNI588	s   %1H
 
/H=<H=c                   | j                  t              j                  t        j                  |k(        }|B|j                  t        j                  |k(  t        j                  j                  d      z        }|j                         S )u   이 프로젝트의 image_asset row.

    episode_id 가 주어지면 해당 에피소드 + 에피소드 무관(프로젝트 공용: 인물 ref/FP 등
    episode_id IS NULL) 자산을 함께 포함한다.
    N)r!   r   r"   r   r/   is_r&   )r*   r   r/   r;   s       r   _query_image_assetsro      sm     	##J$9$9Z$GHAHH""j0Z5J5J5N5Nt5TU
 557Nr   c                    | sg S 	 t        j                  |       }t	        |t
              sg S |D cg c]$  }t	        |t        t        f      st        |      & c}S # t        t        f$ r g cY S w xY wc c}w )ub   reference_image_ids 같은 JSON 문자열 배열을 안전하게 파싱(실패 시 빈 리스트).)rZ   r[   r_   r^   r\   liststrint)rawvalxs      r   _parse_id_listrw      sr    	jjo c4 	=Cq:a#s#<CFC==	 	" 	 >s   A A4A4A10A1c           	        g t               	 	 	 	 dfd}| D ]h  }|j                  |j                  fD ]  }|s |||j                  ddd        t	        |j
                        D ]  } |||j                  ddd        j S )	u  DB image_asset 컬럼에서 직접 복원되는 엣지(i2i + reference lineage).

    - i2i: source_image_id / parent_image_id (이미지 UUID 직접 FK). confidence=direct_fk.
    - reference: reference_image_ids (lineage — visible 인물/소품 ref UUID). confidence=lineage_reference.

    노드 집합에 없는 끝점(dangling)은 엣지를 만들지 않는다. (source,target,kind) 중복 제거.
    c           	         | vs	|vs| |k(  ry | ||f}|v ry j                  |       j                  t        | ||||             y )Nsourcetargetkind
confidenceverification_statusaddappendr   )	r{   r|   r}   r~   verificationkeyedgesnode_idsseens	         r   _addz,_reconstruct_image_asset_edges.<locals>._add   s`    !V8%;v?Ovt$$;%$0	
r   i2i	direct_fkverified_direct	referencelineage_referencestructural_inferred)r{   rr   r|   rr   r}   rr   r~   rr   r   rr   returnNone)setsource_image_idparent_image_idr   rw   reference_image_ids)assetsr   r   aparentref_idr   r   s    `    @@r   _reconstruct_image_asset_edgesr      s     !#E&)eD

#'
$ ((!*;*;<FVQTT5+7HI = %Q%:%:;F{,?AVW <  Lr   c                R   g }t               }d}| D ]  }t        |j                        D ]w  }||j                  k(  r||vs|j                  |vr|dz  }+||j                  f}||v r>|j	                  |       |j                  t        ||j                  ddd             y  ||fS )u  persist-all Wave1/2 ``input_image_ids`` 에서 복원되는 입력 lineage 엣지.

    이 컬럼은 생성물 row 에 **실제 기록된 입력 이미지 UUID**(composite=face+outfit,
    bg=floor_plan, i2i 변형=source 등). 구조적으로 추론된 reference/fp/bg/prev_scene
    엣지와 **중복될 수 있으나 dedup 하지 않는다**(Codex): 사용자가 "구조적 계획 연결"과
    "생성물에 기록된 실제 입력 UUID"를 둘 다 봐야 한다 → 별도 kind=``generated_input``.

    confidence=``input_uuid``(DB UUID 직접 참조), verification=``recorded_input``.
    dangling(노드에 없는 끝점)은 조용히 엣지로 만들지 않고 skip + count 반환(진단 투명성).

    Returns ``(edges, dangling_count)``.
    r      generated_input
input_uuidrecorded_inputrz   )r   rw   input_image_idsr   r   r   r   )r   r   r   r   danglingr   srcr   s           r   _reconstruct_input_image_edgesr      s      !#E!$DH!!"3"34Cadd{("add(&:A+Cd{HHSMLL44*+(8 5 ( (?r   c                \    ddl m} t        |j                        | z  dz  dz  |z  |z  dz  S )u   체크포인트 manifest 경로(읽기 전용). scene_checkpoint_loaders._ep_checkpoint_path 미러.

    기존 모듈 무접촉을 위해 private helper 를 import 하지 않고 동일 구조를 재현한다.
    r   settingscheckpointsr2   zmanifest.json)app.core.configr   r   projects_dir)r   r/   	step_namer   s       r   _checkpoint_manifest_pathr     sT    
 ) 	X""#
	
	 	 		
 	 	r   c                   |xs i j                  d      xs i }t        |t              sy|j                         D ]  \  }}t        |t              s|j                  d      dk7  r,|j                  d      xs d}|sD|| v rI	 t	        t        |      j                  |            }||j                  d      xs g D cg c]  }t	        |       c}|j                  d      xs dd	| |<    y# t        $ r |}Y Vw xY wc c}w )
u'  Phase 7 / Phase 5 공통 shape ``data.groups[bg_id]`` 를 out 에 ingest(첫 매칭 보존).

    이미지 바이트는 읽지 않는다(그래프 조립 전용). ``load_background_chain_bg_map`` 의
    소비자 키와 동일한 구조 필드(bg_id/shot_ids/location_id)만 사용한다.
    groupsNrM   okpng_pathr   shot_idslocation_idr   r   r   )rX   r\   r]   itemsrr   r   relative_tor_   )	outdataprojects_rootr   bg_idgresr   relr<   s	            r   _ingest_groups_shaper     s    jbh'-2Ffd#||~t$%88H%88J'-2C<	d8n00?@C *.((:*>*D"*DF*DAQ*DF88M28b
E
 &  	C	 Gs   #C1 D1C?>C?c           	        ddl m} i }t        |j                        j                  }dD ]n  }t        | ||      }|j                         s"	 t        j                  |j                  d            j                  di       }t        |||       |d	k(  sk|j                  d
      xs i }	t!        |	t"              s|	j%                         D ]  \  }
}|xs i j                  dg       xs g D ]  }t!        |t"              s|j                  d      |j                  d      }}|j                  dd      xs d}|||sS|j                  d      xs d|
 d| d| }||v rv	 t'        t        |      j)                  |            }|d| d| g|
d||<     q |S # t        t        f$ r"}t        j                  d||       Y d}~d}~ww xY w# t        $ r |}Y Zw xY w)uh  배경 체크포인트에서 ``bg_id -> {png_path, shot_ids, location_id}`` 복원(읽기 전용).

    우선순위(설계 §9.1): background_render(Phase 7) → background_chain_render(Phase 5)
    → legacy ``data.locations[loc].shot_backgrounds[]``. 첫 매칭 보존(Phase 7 우선).
    체크포인트 부재/파싱 실패 시 빈 dict(non-fatal).
    r   r   )background_renderbackground_chain_renderutf-8)encodingr   z-pipeline_graph: %s checkpoint load failed: %sNr   	locationsshot_backgroundsrG   rH   
image_pathr   node_idlegacy__S_Shotr   )r   r   r   r   r   r   existsrZ   r[   	read_textrX   OSErrorr_   r`   ra   r   r\   r]   r   rr   r   )r   r/   r   r   r   r   cpr   excr   loc_idloc_datasbsishiimg_pathr   r   s                     r   _load_background_groupsr   9  s    )%'C../66ME	&z:yIyy{	::bllGl<=AA&"MD 	S$6 11-3I)T*(1(9$FH'~2223ErJPbP)"d3$"$&&"79MC#%66,#;#Ar:H$"$&&"3"T"Qse7T"c>$+"%d8n&@&@&O"PC ),+,RDcU);(<+1(G Q ): FF J; $ 	NNJIWZ[	,  * +"*C+s*   5F"#GG-G

GG 	G 	c                  g g }t               }t               	 	 	 	 dfd}	| j                         D ]  \  }
}|j                  d      xs d}|j                  d      xs d}|j                  |      }|j                  |
      }|u|sXdt        j                  |j                  d            j                         z   }||vr7||vr3|j                  |       |j                  t        |dd|||
|d	
             |}|j                  d      xs g D ]{  }t        j                  t        |            }|s$t        |j                  d            t        |j                  d            f}|j                  |g       D ]  } |	||ddd|
        } |sa|j                  |g       D ]  }||v s |	||ddd|
         |fS )u  FP→배경→씬 엣지 복원(설계 §9.1, 구조키만 — 라벨 파싱 금지).

    - bg→scene: groups[bg_id].shot_ids(``Sxx_Shotyy``) → (scene_index, shot_index) →
      그 shot 의 scene asset. confidence=planned_only/verification=unverified(실제 attach
      는 close-framing 등으로 skip 가능 → Task4 call_log 로 승급).
    - fp→bg: floor_plan asset(entity_id == location canon) → bg. confidence=checkpoint_structural.
    - bg 노드: DB chain_bg(variant_type=bg_id) 매칭, 없으면 png_path 기반 virtual 노드
      (node_origin='checkpoint_virtual' — DB sync miss 숨기지 않음).

    반환: (edges, virtual_nodes). virtual_nodes 는 호출부가 nodes/node_ids 에 합친다.
    c           
         | |k(  ry | ||f}|v ry j                  |       j                  t        | |||||             y )N)r{   r|   r}   r~   r   r   r   )	r{   r|   r}   r~   r   r   r   r   	seen_edges	          r   r   z+_reconstruct_background_edges.<locals>._add  sR    Vvt$)c\&t
 ,E
 	r   r   r   r   zvirtual:r   checkpoint_virtualchain_bgcheckpoint_only)r   r?   rA   rB   r/   rI   rK   rM   r   r      
backgroundplanned_only
unverifiedfpcheckpoint_structuralr   )r{   rr   r|   rr   r}   rr   r~   rr   r   rr   r   Optional[str]r   r   )r   r   rX   hashlibsha1encode	hexdigestr   r   r   _SHOT_ID_REmatchrr   rs   group)r   r/   chain_bg_by_bgidfp_ids_by_canonlocation_canon_by_shortscene_assets_by_shotr   virtual_nodesseen_virtualr   r   gr   	loc_shortcanon
bg_node_idvidsidmshot_keyscene_idfp_idr   r   s                         @@r   _reconstruct_background_edgesr   m  s   * !#E(*M UL+.5I!&* LLNq55$*EE-(.B	'++I6%))%0
w||HOOG,DEOOQQC,&3h+>  %$$\ 4)#)"'%,	& 	 J55$**C!!#c(+AAGGAJQWWQZ9H044XrBZ<W\] C + (,,UB7H$
D2I.7 8E #N -r   c                |    | syt        | d       }t        |d d      }t        |d       }|d   j                  S )	u^   still 한 개의 scene asset 들 중 대표 1개(결정론). is_primary → 최신 → id 순.Nc                ,    t        | j                        S r8   )rr   r   r   s    r   <lambda>z-_representative_scene_asset.<locals>.<lambda>  s    QTTr   )r   c                "    | j                   xs dS )Nr   )rN   r   s    r   r   z-_representative_scene_asset.<locals>.<lambda>  s    ALL,>B,>r   T)r   reversec                $    t        | dd      rdS dS )N
is_primaryr   r   )getattrr   s    r   r   z-_representative_scene_asset.<locals>.<lambda>  s    L!1LA,SRS,Sr   r   )sortedr   )scene_assetsordereds     r   _representative_scene_assetr    s?    \':;GW">MGW"STG1:==r   c                   g }t               }| j                         D ]  \  }}t        |dd      }|r	||k(  s|| vrt        |j	                  |g             }|||vrA|j	                  |g       D ]o  }	|	j
                  |vs|	j
                  |k(  r!||	j
                  f}
|
|v r4|j                  |
       |j                  t        ||	j
                  ddd|d             q  |S )u  prev_scene 엣지: ``scene_still.dependent_scene_id``(직전 의존 still UUID) → 현재 씬.

    의존 still 의 대표 scene asset(is_primary→최신) → 현재 still 의 각 scene asset.
    confidence=still_fk_resolved(이미지 self-FK 아닌 still FK 해석 — Codex 보강),
    verification=structural_inferred. 투명성 위해 dependent_still_id/source_selection 부착.
    dependent_scene_idN
prev_scenestill_fk_resolvedr   is_primary_or_latest)r{   r|   r}   r~   r   dependent_still_idsource_selection)	r   r   r  r  rX   r   r   r   r   )rh   scene_assets_by_stillr   r   r   rF   rj   dep_idrep_depcurr   s              r   _reconstruct_prev_scene_edgesr    s     !#E!$D!<<>% 4d;8+vV/C-.C.G.GPR.ST?gX5(,,Xr:CvvX%7):CFF#Cd{HHSMLLsvvL.DY#)<R  ; *& Lr   c                    i }| D ]W  }|j                    d|j                   d|j                   }|j                  |d      }|dz   ||<   |dk(  r|n| d| |_        Y y)u   React Flow 용 안정·결정론 edge id 부여(in-place). ``kind:source:target``,
    동일 키 중복 시 ``#n`` suffix(Codex 권고 — index 기반 id 회피).:r   r   #N)r}   r{   r|   rX   r   )r   r   r,   r   ns        r   _assign_edge_idsr    sk     D&&188*AahhZ0HHT1UT
AvtdV1QC=	 r   c                "   i }|s|S ddl m}  |d      }	 | j                  |||t        |      d      j	                         }|D ]  \  }	}
}|	s
	 t        j                  |
xs d      }t        |t              rt        |      nd}|j                  |	      }|d||dkD  |d	||	<   bt        |d
   |      |d
<   |d   xs |dkD  |d<    |S # t
        $ r"}t        j                  d|       |cY d}~S d}~ww xY w# t        t        f$ r d}Y w xY w)u  still 별 scene_image_gen call_log 집계 — call-level overlay(설계 §9.2, Codex 보강).

    ★절대규칙: 라벨 텍스트 의미파싱 0. 구조 키(``metadata_json.still_id`` + operation_type)
    로만 조인하고, ``reference_image_ids`` 는 **원소 개수(len)** 만 센다(어떤 ref인지
    내용은 보지 않음 — UUID 매칭은 증명 불가).

    Returns ``{still_id: {has_call, max_ref_count, any_refs, prompt_authoritative}}``.
    call_log 없거나 쿼리 실패 시 빈 dict(non-fatal).
    r   )texta|  
        SELECT (metadata_json::jsonb)->>'still_id' AS sid,
               reference_image_ids, user_prompt
        FROM llm_call_log
        WHERE project_id = :pid
          AND episode_id = :eid
          AND operation_type IN ('single_scene_image_gen', 'scene_image_gen')
          AND (metadata_json::jsonb)->>'still_id' = ANY(:sids)
        ORDER BY created_at DESC
        )pideidsidsz2pipeline_graph: call_log overlay lookup failed: %sNz[]T)has_callmax_ref_countany_refsprompt_authoritativer  r  )
sqlalchemyr  executerq   r&   	Exceptionr`   ra   rZ   r[   r\   lenr_   r^   rX   max)r*   r   r/   	still_idsr   _textsqlr+   r   r   ref_ids_jsonuser_promptref_listr  aggs                  r   _load_call_log_overlayr,    s;    &(C
(
		CzzJYP

#% 	 +/&\;	zz,"6$7H!+Hd!;HA ggcl; !!"E(3	CH $'s?';Q#?C !*o6QC
O' +/( J1  KSQ
 I& 	A	s/   -C 6C:	C7C2,C72C7:DDc                   | D ]Z  }|j                   r|j                  |j                         nd}|s/|j                  d      |_        |j                  d      |_        \ |D ]]  }|j                  dk7  r|j                  |j
                        }|r|j                  |      nd}|sF|d   |_        |d   rdnd|_        _ y)u  call-level overlay 를 노드(prompt_authoritative/actual_ref_count)와 background
    엣지(verification_status/call_ref_count)에 반영. in-place. 라벨 내용 미파싱.

    - 노드: 그 still 의 scene 호출 user_prompt + ref 개수.
    - background 엣지: ref 0개 → ``call_log_no_refs``(미attach 확정), ref>0 →
      ``refs_present_unresolved``(어떤 ref인지 UUID 매칭 불가). call 없으면 그대로.
    Nr  r  r   r  refs_present_unresolvedcall_log_no_refs)rF   rX   r  actual_ref_countr}   r|   call_ref_countr   )nodesr   overlayscene_still_by_assetr  ovr,   r   s           r   _apply_call_log_overlayr6  3  s     ()

W[[$%'VV,B%CA"!#!8A	 
 66\!"&&qxx0!$W[[$o.)+J%=O 	
 r   c                   t        | |      }||rt        | ||      }t        | |      }t        | ||      }t	        | ||      }|D cg c]  }t        ||||       }}|D 	ch c]  }	|	j                   }
}	t        ||
      }|j                         D ci c]-  \  }}|j                  dk(  r|j                  r|j                  |/ }}}|D ci c]C  }|j                  dk(  r2|j                  r&|j                  |k(  r|j                  |j                  E }}i }i }i }i }|D ].  }|j                  dk(  rB|j                  r6|j                  |j                  g       j!                  |j                         U|j                  dk(  se|j"                  sr|j                  |j"                  g       j!                  |       |j"                  ||j                  <   |j%                  |j"                        }||j&                  |j(                  |j                  |j&                  |j(                  fg       j!                  |j                         1 |rt+        ||      ni }t-        |||||||
      \  }}|j/                  |       |
j1                  d |D               |j/                  |       |j/                  t3        |||
             t5        ||
      \  }}|j/                  |       |r5t7        | ||t9        |j;                                     }|rt=        ||||       t?        |       ddl m!} tE        ||||tG        tI        |d	d
            d|i      S c c}w c c}	w c c}}w c c}w )u   프로젝트의 이미지 생성 파이프라인 그래프(에피소드 단위).

    노드 = image_asset (후속: checkpoint virtual). 엣지 = i2i + reference lineage
    (후속: FP→bg→씬 구조키, call_log 검증).
    locationr   
floor_planscene)r/   r   r   r   r   r   c              3  4   K   | ]  }|j                     y wr8   )r   ).0r  s     r   	<genexpr>z'build_pipeline_graph.<locals>.<genexpr>  s     0-QADD-s   r   r   background_chain_enabledTdangling_input_refs)r/   r2  r   r2   background_consumer_enableddiagnostics)%r-   r6   r9   r=   ro   rl   r   r   r   rE   rb   rA   variant_typer/   rB   
setdefaultr   rF   rX   rG   rH   r   r   extendupdater  r   r,  rq   keysr6  r  r   r   r   re   r  )r*   r   r/   r2   rg   rh   r   r   r2  r  r   r   cidri   r   r   r   r   r  r4  str   bg_edgesr   input_edgesdangling_inputsr3  r   s                               r   build_pipeline_graphrL  R  sH    R,Hh(ZB
2z*HJ
3F Z<FFLMf^J8V<fEM#$eeH$*68<E
 !((HC??j(S\\ 	c(   (A<<:%!..Q\\Z=W 	
  (
 -/O=?9;+-<<<'AKK&&q{{B7>>qttD\\W$!,,QZZ<CCAF)* &AJJ'B~".."<AZ$//^^R]]3R&,  AK$Z<PRF;)' 71Hm 
LLOO0-00	LL	LL%f.CXN
 $B&(#S K	LL (
J-B-G-G-I(J
 #E5';OPU( $(H8$?%
 +O<	 	A N$
(s   M #M%2M*AM0)r   rr   r   rr   r   ztuple[str, str])r*   
OrmSessionr   rr   r   List[EpisodeRef])r*   rM  r   rr   r2   rN  r   r   )r*   rM  r   rr   r   Dict[str, EntityCanon])r*   rM  r   rr   r/   r   r   Dict[str, SceneStill])
r   rr   rf   r   rg   rO  rh   rP  r   r   )r*   rM  r   rr   r/   r   r   List[ImageAsset])rt   r   r   	List[str])r   rQ  r   set[str]r   List[PipelineEdge])r   rQ  r   rS  r   zTuple[List[PipelineEdge], int])r   rr   r/   rr   r   rr   r   r   )r   Dict[str, Dict[str, Any]]r   zDict[str, Any]r   r   r   r   )r   rr   r/   rr   r   rU  )r   rU  r/   r   r   Dict[str, str]r   zDict[str, List[str]]r   rV  r   z Dict[Tuple[int, int], List[str]]r   rS  r   z-Tuple[List[PipelineEdge], List[PipelineNode]])r  rQ  r   r   )rh   rP  r  zDict[str, List[ImageAsset]]r   rS  r   rT  )r   rT  r   r   )
r*   rM  r   rr   r/   rr   r%  rR  r   rU  )
r2  zList[PipelineNode]r   rT  r3  rU  r4  rV  r   r   r8   )r*   rM  r   rr   r/   r   r   r   )5__doc__
__future__r   r   rZ   loggingrepathlibr   typingr   r   r   r   r	   sqlalchemy.ormr
   rM  app.models.projectr   r   r   r   	getLogger__name__r`   compiler   app.schemas.pipeliner   r   r   r   r   r-   r6   r9   r=   rl   ro   rw   r   r   r   r   r   r   r  r  r  r,  r6  rL  r   r   r   <module>rc     s  	 #    	  3 3 0 K K			8	$ bjj./ #
 #/?0#
&111 %1 "	1
 1h  	$
>))) )X''' $'T$
	"


 
 
	
D11!$11hN %N  N  %	N 
 *N  ,N  ;N  N  3N b ! 6    	 F199 #9149AJ99x


 '
 )	

 

D !%[[[ [ 	[r   