
    Ri}              %       6   d Z ddlZddlZddlmZmZ ddlmZ ddlmZm	Z	 ej                  j                  d e ee      j                         j                  j                  j                              Zdedeeef   fd	Z	 	 	 	 	 	 	 	 d#d
eeef   dedededededee   dedededededededededeeef   f"dZd
eeef   dedeeef   fdZdede	e   defdZd$d
eeef   dede	e   defdZd$dede	e   de	eeef      fd Zd%d
eeef   d!edefd"Zy)&u   변경 로그 관리 모듈    N)datetimetimezone)Path)AnyOptionalWORKSPACE_ROOT
skill_namereturnc                 v    | t        j                  t        j                        j	                         g dddddS )u  새로운 changelog 구조 생성.

    Returns:
        {
            "skill": str,
            "started_at": ISO timestamp,
            "rounds": [],
            "final_score": 0,
            "total_rounds": 0,
            "kept": 0,
            "reverted": 0,
        }
    )tzr   )skill
started_atroundsfinal_scoretotal_roundskeptreverted)r   nowr   utc	isoformat)r	   s    O/home/jay/workspace/.worktrees/task-2117-dev1/scripts/autoresearch/changelog.py
create_logr      s9     llhll3==?     log	round_nummutation_typemutation_descriptionscore_beforescore_afteritems_detaildecisioninput_tokensoutput_tokensmutation_input_tokensmutation_output_tokensexecution_input_tokensexecution_output_tokensjudge_input_tokensjudge_output_tokensc                     |||||||||	|
|||||d}| d   j                  |       |dk(  rt        | d         dz   | d<   | S |dk(  rt        | d         dz   | d<   | S )u  라운드 결과를 로그에 추가.

    Args:
        log: 현재 changelog dict
        round_num: 라운드 번호
        mutation_type: 변경 유형 (예: "rewrite", "append")
        mutation_description: 변경 내용 설명
        score_before: 변경 전 점수
        score_after: 변경 후 점수
        items_detail: 개별 항목 점수 리스트
        decision: "kept" 또는 "reverted"
        input_tokens: 사용된 입력 토큰 수 (전체 합산)
        output_tokens: 사용된 출력 토큰 수 (전체 합산)
        mutation_input_tokens: 뮤테이션 단계 입력 토큰 수
        mutation_output_tokens: 뮤테이션 단계 출력 토큰 수
        execution_input_tokens: 실행 단계 입력 토큰 수
        execution_output_tokens: 실행 단계 출력 토큰 수
        judge_input_tokens: 판단 단계 입력 토큰 수
        judge_output_tokens: 판단 단계 출력 토큰 수

    Returns:
        업데이트된 log dict
    )roundr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r   r      r   )appendint)r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   round_entrys                    r   	add_roundr0   '   s    T & 4$"$$&!6"8"8#:02#K$ M%6#f+&*F J 
Z	c*o.2JJr   r   c                 2    || d<   t        | d         | d<   | S )u   로그 마무리 - 최종 점수와 total_rounds 업데이트.

    Args:
        log: 현재 changelog dict
        final_score: 최종 점수

    Returns:
        업데이트된 log dict
    r   r   r   )len)r   r   s     r   finalize_logr3   l   s&     %Cc(m,CJr   	evals_dirc                 L    |t        |      S t        t              dz  | z  dz  S )u   evals 디렉토리 경로를 결정.

    evals_dir이 지정되면 그 디렉토리를 직접 사용.
    지정되지 않으면 기본 경로: /home/jay/workspace/skills/<skill_name>/evals/
    skillsevals)r   _WORKSPACE_ROOT)r	   r4   s     r   _resolve_evals_pathr9   {   s.     I 8+j87BBr   c                     t        ||      }|j                  dd       |dz  }|j                  t        j                  | dd      d       t        |j                               S )	u  로그를 JSON 파일로 저장.

    경로: <evals_dir>/autoresearch-log.json
    evals_dir 미지정 시: skills/<skill_name>/evals/autoresearch-log.json

    Args:
        log: 저장할 changelog dict
        skill_name: 스킬 이름
        evals_dir: 저장 디렉토리 (None이면 기본 경로 사용)

    Returns:
        저장된 파일의 절대 경로 문자열
    T)parentsexist_okautoresearch-log.jsonF   )ensure_asciiindentutf-8encoding)r9   mkdir
write_textjsondumpsstrresolve)r   r	   r4   
target_dir	file_paths        r   save_logrL      sj     %Z;JTD144I

3U15   y  "##r   c                     t        | |      }|dz  }|j                         sy|j                  d      }t        j                  |      }|S )u   기존 로그를 로드.

    Args:
        skill_name: 스킬 이름
        evals_dir: 로그 디렉토리 (None이면 기본 경로 사용)

    Returns:
        로드된 changelog dict, 없으면 None
    r=   NrA   rB   )r9   exists	read_textrF   loads)r	   r4   rJ   rK   contentresults         r   load_logrS      sP     %Z;J44I!!7!3G!ZZ0FMr   countc                 ^   | j                  dg       }|syt        |      |kD  r|| d n|}g }|j                  dt        |       d       |D ]  }|j                  dd      }|j                  dd	      }|j                  d
d      }|j                  dd      }	|j                  dd      }
|j                  dd	      }t        |
      t        |	      z
  }|dk\  rd|dn|d}|j                  d| d| d|        |j                  d|	dd|
dd| d|         dj	                  |      S )u	  최근 N개 라운드 변경 내역을 텍스트로 반환 (mutator 프롬프트에 제공용).

    Args:
        log: changelog dict
        count: 반환할 최근 라운드 수

    Returns:
        사람이 읽기 쉬운 텍스트 형식의 변경 내역
    r   u   변경 이력 없음Nu   === 최근 u   개 변경 내역 ===r+   ?r   unknownr    r   g        r   r!   r   +z.3fz[Round z] z: u
     점수: z -> z (u   ) | 결정: 
)getr2   r-   floatjoin)r   rT   r   recentlinesentryr   r   r   r   r   r!   delta	delta_strs                 r   get_recent_changelogrc      sS    "-F% #Fe 3VUFG_FE	LL;s6{m+@AB nIIgs+			/9=$yy)?Dyy5iis399Z3k"U<%88',zac{O%	wykM?"=Q<RSTz,s!34C7H9+Uabjaklmn 99Ur   )r   r   r   r   r   r   r   r   )N)   )__doc__rF   osr   r   pathlibr   typingr   r   environr[   rH   __file__rI   parentr8   dictr   r.   r\   listr0   r3   r9   rL   rS   rc    r   r   <module>ro      s$   !  	 '   **..c$x.00299@@GGH
3 4S> D !""#"##$ !B	c3hBB B 	B
 B B s)B B B B B  B  B !B B  !B" 
#s(^#BJd38n 5 T#s(^ CC CHSM Cd C$$sCx. $c $hsm $WZ $2 # (4PSUXPX>BZ *!d38n !S ! !r   