
    Ki	                        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 ddl	m
Z
  ej                  e      Z G d de      Z G d	 d
      Zy)u   engine_v2/qc_hook.py — QC 파이프라인 연결 훅 포인트.

engine_v2 실행 결과를 QC 파이프라인에 연결하기 위한 인터페이스.
PostToolUse 훅과 연동 가능하도록 설계.
    )annotationsN)Path)Protocol)EngineResultc                       e Zd ZdZddZddZy)	QCHandleru   QC 핸들러 프로토콜.c                     y)u    엔진 실행 완료 시 호출.N )selfresults     @/home/jay/workspace/services/multimodel-bot/engine_v2/qc_hook.pyon_engine_completezQCHandler.on_engine_complete           c                     y)u)   파이프라인 전체 완료 시 호출.Nr
   )r   resultss     r   on_pipeline_completezQCHandler.on_pipeline_complete   r   r   Nr   r   returnNoner   zlist[EngineResult]r   r   )__name__
__module____qualname____doc__r   r   r
   r   r   r   r      s    $r   r   c                  *    e Zd ZdZdddZddZd	dZy)

FileQCHooku   파일 기반 QC 훅.

    engine_v2 실행 결과를 JSON 파일로 저장하여
    외부 QC 도구(qc_verify.py 등)가 읽을 수 있도록 한다.
    Nc                f    |xs t        d      | _        | j                  j                  dd       y )Nz/home/jay/workspace/memory/qcT)parentsexist_ok)r   _output_dirmkdir)r   
output_dirs     r   __init__zFileQCHook.__init__&   s.    %N.M)Ntd;r   c                   |j                   |j                  |j                  |j                  |j                  |j
                  |j                  j                         d}| j                  |j                   d|j                   d|j                    dz  }|j                  t        j                  |dd      d	       t        j                  d
|       y)u   개별 엔진 결과 기록.)enginetask_idsteperrorflagged_count	token_est	timestamp_step_z.jsonF   ensure_asciiindentutf-8encodingzQC hook: wrote %sN)r&   r'   r(   r)   r*   r+   r,   	isoformatr!   
write_textjsondumpsloggerdebug)r   r   entryfilepaths       r   r   zFileQCHook.on_engine_complete*   s     mm~~KK\\#11))))335
 ##(8fkk]!FMM?Z_&``DJJu5KV]^((3r   c           
     x   |sy|d   j                   }|t        |      t        d |D              t        d |D              t        |D ch c]  }|j                   c}      d}| j
                  | dz  }|j                  t        j                  |dd	      d
       t        j                  d|       yc c}w )u%   파이프라인 전체 결과 요약.Nr   c              3  :   K   | ]  }|j                   sd   yw)   N)r)   .0rs     r   	<genexpr>z2FileQCHook.on_pipeline_complete.<locals>.<genexpr>A   s     8!8s   c              3  4   K   | ]  }|j                     y wN)r*   rA   s     r   rD   z2FileQCHook.on_pipeline_complete.<locals>.<genexpr>B   s      BQ Bs   )r'   total_stepserrorstotal_flaggedengines_usedz_summary.jsonFr/   r0   r3   r4   z'QC hook: pipeline summary written to %s)r'   lensumlistr&   r!   r7   r8   r9   r:   info)r   r   r'   rC   summaryr=   s         r   r   zFileQCHook.on_pipeline_complete9   s    !*$$w<8W88  B' BB G!<q!((!<=
 ##	&??DJJwU1MX_`=xH	 "=s   	B7rF   )r#   zPath | Noner   r   r   r   )r   r   r   r   r$   r   r   r
   r   r   r   r      s    <4Ir   r   )r   
__future__r   r8   loggingpathlibr   typingr   engine_v2.engine_resultr   	getLoggerr   r:   r   r   r
   r   r   <module>rV      sH    #     0			8	$	 	(I (Ir   