
    mCj                        d Z ddlmZ ddlZddlZddlmZmZmZm	Z	  ej                  e      Zddddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)u  Final-asset lineage annotate — persist-all Wave 1.

이미 전용 등록 경로(reference_phase1/2/3, image_steps state_variant,
scene_persistence, floor_plan_render, background_render 등)로 ``image_asset`` 에
insert 되는 **최종물**에, 캔버스 lineage 컬럼을 **보강(annotate)** 한다.

★중복 0 원칙(Codex 합의): capture sink 의 신규 insert 와 섞지 않는다. 본 함수는
기존 ImageAsset row(또는 commit 전 in-memory 객체)에 컬럼만 채우며,
``is_intermediate`` / ``asset_type`` 을 건드리지 않는다 (최종물은 영원히
is_intermediate=False 유지). commit 은 호출자가 한다.

설정 컬럼: pipeline_role / stage / input_image_ids(UUID-only) /
generation_call_id / pipeline_metadata_json(merge).
    )annotationsN)AnyDictListOptional)stageinput_image_idsgeneration_call_idpipeline_metadatac               8   	 || _         ||n|| _        |O|D cg c]*  }|t        |      j                         s t        |      , }}t	        j
                  |      | _        ||| _        |rfi }t        | dd      }	|	r(	 t	        j                  |	      }
t        |
t              r|
}|j                  |       t	        j
                  |d      | _        | S c c}w # t        t        f$ r i }Y Gw xY w# t         $ r t"        j%                  d|d       Y | S w xY w)u  최종 ImageAsset 객체에 lineage/role 컬럼을 보강한다 (non-fatal, no commit).

    Args:
        asset: ImageAsset ORM 인스턴스 (commit 전/후 무관).
        pipeline_role: 캔버스 색/필터용 역할 (reference_face / reference_outlook /
            reference_composite / character_state_variant / scene_still /
            floor_plan / background_render 등).
        stage: 파이프라인 stage 라벨 (없으면 pipeline_role 재사용).
        input_image_ids: 입력 이미지 **asset UUID** 리스트(구조키/경로/라벨 금지).
            None=lineage 미상(루트), []=입력 없음을 명시. None/빈 문자열 원소는 제거.
        generation_call_id: llm_call_log 연결용 call id.
        pipeline_metadata: 추가 메타(기존 pipeline_metadata_json 에 merge).

    Returns:
        같은 asset (체이닝용). 예외는 삼키지 않고 로깅 후 asset 반환(non-fatal).
    Npipeline_metadata_jsonF)ensure_asciiz3annotate_generated_asset failed (non-fatal) role=%sT)exc_info)pipeline_roler   strstripjsondumpsr	   r
   getattrloads
isinstancedict
ValueError	TypeErrorupdater   	Exceptionloggerwarning)assetr   r   r	   r
   r   xcleanedexistingrawparseds              Y/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/image_capture/annotate.pyannotate_generated_assetr&      s    2
+$0em&'6[!!-CPQFLLNs1vG[$(JJw$7E!)'9E$')H%!94@C"!ZZ_F!&$/#) OO-.+/::hU+SE( L/ \ #I. "!H"  
A= 	 	
 L
sP   C4 CCC	8C4 'C )-C4 C4 C1.C4 0C11C4 4!DD)r   r   r   r   r   Optional[str]r	   zOptional[List[str]]r
   r'   r   zOptional[Dict[str, Any]]returnr   )__doc__
__future__r   r   loggingtypingr   r   r   r   	getLogger__name__r   r&        r%   <module>r1      s    #   , ,			8	$  +/(,2655 5 	5
 )5 &5 05 	5r0   