
    j                        d Z ddlmZ ddlZddlmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZ  ej                  e      ZddZdddddddd		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd
ZddZy)uC  capture sink — 생성 이미지/아티팩트를 enqueue (Task A5).

저수준 생성 사이트(Phase B 에서 계측)가 호출한다. DB 를 직접 모르고, 현재
generation_context(ambient)가 있으면 spool 파일에 기록 후 그 scope 의 큐에
append 만 한다. flush(DB insert)는 scope 종료 시 queue.flush() 가 담당.

★ default-capture-off (중복 0 의 핵심): generation_context scope 가 열리지 않은
호출(=최종물 경로 등)은 ctx 가 None → 저장하지 않고 diagnostic counter 만 증가.
최종물은 기존 _register_image_assets 가 image_asset 을 만들므로 sink 가 또 만들면
중복이 된다. 따라서 sink 는 명시적으로 scope 가 열린 중간물만 포착한다.

모든 동작 non-fatal — 어떤 실패도 raise 하지 않는다(생성 파이프라인 무영향).
    )annotationsN)AnyDictListOptional)current_context)CAPTURE_DIAG)write_spoolc                h   	 t               }|t        dxx   dz  cc<   yt        |dd      st        dxx   dz  cc<   yt        | |j                  |j
                        }|j                  j                  ||       y# t        $ r+ t        dxx   dz  cc<   t        j                  dd	       Y yw xY w)
uX   공통 enqueue — ctx 없으면 skip(default-off), 있으면 spool + append. non-fatal.Nskipped_no_context   capture_enabledTskipped_capture_offflush_errorsz%image_capture sink failed (non-fatal))exc_info)r   r	   getattrr
   
project_idstagequeueappend	Exceptionloggerwarning)	png_bytesmetactx
spool_paths       U/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/image_capture/sink.py_enqueuer      s    O;-.!3.s-t4./14/ CNNCIIF
		T* O^$)$>NOs   A= A= =A= =1B10B1)input_image_idscandidate_indexgeneration_call_idpromptpipeline_metadatadispositionattempt_indexc               .    t        | ||||||||d       y)u   모델이 생성한 이미지 바이트를 (scope 가 열려 있을 때만) 포착.

    ``disposition`` — 산출물 생애 결과 (accepted|rejected|diagnostic|
    cache_hit_source). None=미상. ``attempt_index`` — 재시도 회차(0-base).
    pipeline_roler    r!   r"   r#   r$   r%   r&   N)r   )	r   roler    r!   r"   r#   r$   r%   r&   s	            r   capture_generated_imager+   -   s,    " !.."4!2&*		
    c                   t        | ||j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      d       y	)
um  비모델(PIL/결정론) 아티팩트 바이트를 (scope 가 열려 있을 때만) 포착.

    capture_generated_image 와 동일 경로 — role + 선택 메타(input_image_ids/
    candidate_index/generation_call_id/prompt/pipeline_metadata/disposition/
    attempt_index)를 받는다. 비모델 진단 아티팩트는 보통 ``disposition='diagnostic'``.
    r    r!   r"   r#   r$   r%   r&   r(   N)r   get)r   r*   kws      r   capture_artifactr0   M   so     !!vv&78!vv&78"$&&)=">ffX&!#(;!<66-0VVO4		
r,   )r   bytesr   zDict[str, Any]returnNone)r   r1   r*   strr    zOptional[List[str]]r!   Optional[int]r"   Optional[str]r#   r6   r$   zOptional[Dict[str, Any]]r%   r6   r&   r5   r2   r3   )r   r1   r*   r4   r/   r   r2   r3   )__doc__
__future__r   loggingtypingr   r   r   r   "app.services.image_capture.contextr    app.services.image_capture.queuer	    app.services.image_capture.spoolr
   	getLogger__name__r   r   r+   r0    r,   r   <module>rA      s    #  , , > 9 8			8	$O, ,0%)(, 26!%#'  )	
 # &  0  ! 
@r,   