
    (<i              	           d Z ddlmZ ddlmZ dZdZdZdZ	 dde	d	e	d
e
defdZdede
fdZdedede
fdZdedede
fdZde	de
fdZdee
ef   de
de
fdZde
de
fdZy)u9   reporter.py - autoresearch 완료 보고서 생성 모듈    )Path)Anyg      @g      .@g?g      @input_tokensoutput_tokensmodelreturnc                     |j                         dk(  rt        }t        }nt        }t        }| dz  |z  |dz  |z  z   }|S )u	  입출력 토큰 수를 달러 비용으로 환산.

    Args:
        input_tokens: 입력 토큰 수
        output_tokens: 출력 토큰 수
        model: 모델 종류 ("sonnet" 또는 "haiku"). 기본값 "sonnet"

    Returns:
        예상 비용 (USD)
    haikui@B )lower_HAIKU_INPUT_RATE_HAIKU_OUTPUT_RATE_SONNET_INPUT_RATE_SONNET_OUTPUT_RATE)r   r   r   
input_rateoutput_ratecosts         N/home/jay/workspace/.worktrees/task-2057-dev2/scripts/autoresearch/reporter.pyestimate_costr      sL     {{}&
( (
)9$
2mi6OS^5^^DK    scorec                 
    | dS )N.2f )r   s    r   
_fmt_scorer   *   s    C[r   beforeafterc                 ^    || z
  }|dk\  rdnd}t        |        dt        |       d| |ddS )Nr   + u    →  (r   ))r   )r   r   deltasigns       r   _fmt_score_deltar$   .   sC    FNE1*3"D !z%'8&9D6%ANNr   initialfinalc                 F    | dk(  ry|| z
  | z  dz  }|dk\  rdnd}| |ddS )	uE   초기→최종 변화율 문자열. 초기값이 0이면 N/A 반환.        zN/Ad   r   r   r   z.1f%r   )r%   r&   rater#   s       r   _calc_change_rater,   4   s?    #~GOw&,D!)3DVD:Qr   nc                 
    | dS )u0   숫자를 천 단위 쉼표 포맷으로 변환.,r   )r-   s    r   _fmt_numberr0   =   s    UOr   log_dataoutput_pathc                 
   | j                  dd      }| j                  dd      }| j                  dd      }| j                  dg       }t        | j                  dd            }t        | j                  d	d
            }t        |      }|rt        |      nd}	d}
|rt        |d
   j                  dd            }
t	        |
|      }|D cg c]  }|j                  d      dk(  s| }}|D cg c]  }|j                  d      dk(  s| }}t        d |D              }t        d |D              }t        d |D              }t        d |D              }t        d |D              }t        d |D              }|d
k(  r|d
k(  rt        ||d      }d}n,t        ||d      }t        ||d      }||z   }d|dd|dd}g }|j                  d|        |j                  d       |j                  d       |j                  d |        |j                  d!|	        |j                  d"|        |j                  d#t        |
       d$t        |       d%| d       |j                  d       |j                  d&t        |       d'       |r|j                  d(       |j                  d)       t        |d*+      D ]  \  }}|j                  d,d      }|j                  d-d      }t        |j                  dd            }t        |j                  d.d            }|j                  d/| d0| d0| d0t        ||       d1	        n|j                  d2       |j                  d       |j                  d3t        |       d'       |r|j                  d(       |j                  d)       t        |d*+      D ]  \  }}|j                  d,d      }|j                  d-d      }t        |j                  dd            }t        |j                  d.d            }|j                  d/| d0| d0| d0t        ||       d1	        n|j                  d2       |j                  d       |j                  d4       |j                  d5t        |              |j                  d6t        |              |j                  d7|dd8|        |j                  d       d9j                  |      }t        |      } | j                  j!                  d:d:;       | j#                  |d<=       t%        | j'                               S c c}w c c}w )>u  changelog JSON → 마크다운 보고서 변환 후 파일로 저장.

    Args:
        log_data: changelog.py의 create_log/add_round/finalize_log로 만들어진 dict
        output_path: 보고서 저장 경로

    Returns:
        저장된 보고서 파일의 절대 경로
    skillunknown
started_atr   ended_atroundsfinal_scorer(   total_roundsr   -score_beforedecisionkeptrevertedc              3   R   K   | ]  }t        |j                  d d             ! yw)r   r   Nintget.0rs     r   	<genexpr>z"generate_report.<locals>.<genexpr>c   s      KqS~q!9:K   %'c              3   R   K   | ]  }t        |j                  d d             ! yw)r   r   NrA   rD   s     r   rG   z"generate_report.<locals>.<genexpr>d   s      Mc!%%";<MrH   c              3      K   | ];  }t        |j                  d d            t        |j                  dd            z    = yw)mutation_input_tokensr   execution_input_tokensNrA   rD   s     r   rG   z"generate_report.<locals>.<genexpr>g   s9     xlms155!8!<=AEEJbdeDf@ggx   AAc              3      K   | ];  }t        |j                  d d            t        |j                  dd            z    = yw)mutation_output_tokensr   execution_output_tokensNrA   rD   s     r   rG   z"generate_report.<locals>.<genexpr>h   s=      _`AEE*A./#aee<UWX6Y2ZZrM   c              3   R   K   | ]  }t        |j                  d d             ! yw)judge_input_tokensr   NrA   rD   s     r   rG   z"generate_report.<locals>.<genexpr>k   s!     Jac!%% 4a89JrH   c              3   R   K   | ]  }t        |j                  d d             ! yw)judge_output_tokensr   NrA   rD   s     r   rG   z"generate_report.<locals>.<genexpr>l   s!     Ls155!6:;LrH   sonnet)r   u   (Sonnet 기준, 추정치)r
   z
(Sonnet: $z.4fz + Haiku: $r!   u!   # Autoresearch 완료 보고서: u	   ## 요약u
   - 시작: u
   - 종료: u   - 총 라운드: u   - 초기 점수: u    → 최종 점수: r    u   ## 유지된 변경 (u   건)u'   | # | 유형 | 설명 | 점수 변화 |z|---|------|------|----------|   )startmutation_typemutation_descriptionscore_afterz| z | z |u   없음u   ## 롤백된 변경 (u	   ## 비용u   - 입력 토큰: u   - 출력 토큰: u   - 예상 비용: $ 
T)parentsexist_okzutf-8)encoding)rC   floatrB   _format_datetimer,   sumr   appendr   len	enumerater$   r0   joinr   parentmkdir
write_textstrresolve)!r1   r2   r4   r6   r7   r8   r9   r:   started_displayended_displayinitial_scorechange_raterF   kept_roundsreverted_roundstotal_input_tokenstotal_output_tokenssonnet_inputsonnet_outputhaiku_inputhaiku_output
total_costcost_breakdownsonnet_cost
haiku_costlinesidxrtyperdescsbeforesafterreport_contentoutputs!                                    r   generate_reportr   B   s3    gy1Ell<4JLLR0H#+<<"#=Fx||M3?@KHLL;<L 'z2O2:$X.M MfQimmNC@A#M;?K %Dj(9V(C1DKD"(LQAEE*,=,KqLOL KFKKMfMM xqwxxL dj M J6JJKLVLLL q[A-"#57JRZ[
5#L-xP";GL
 :-
%k#%6k*SAQQRSE 
LL4UG<=	LL 
LL	LL:o./0	LL:m_-.	LL$\N34	LL$Z%>$??ST^_jTkSllnozn{{|}~	LL 
LL([)9(:$?@>?5615 	aFCEE/2.EEE0"5EAEE.#67G15545FLL2cU#eWCwc:J7TZ:[9\\^_`	a 	X	LL 
LL(_)=(>dCD>?56q9 	aFCEE/2.EEE0"5EAEE.#67G15545FLL2cU#eWCwc:J7TZ:[9\\^_`	a 	X	LL 
LL	LL$[1C%D$EFG	LL$[1D%E$FGH	LL%j%5Q~6FGH	LLYYu%N +F
MMt4
nw7v~~  g ELs   U%U/U
	U
iso_strc                     | sy	 ddl m }m} |j                  |       }|j                  |j                        }|j                  d      S # t        t        f$ r | cY S w xY w)u   ISO 8601 타임스탬프 → 사람이 읽기 쉬운 포맷 변환.

    예) "2026-03-26T00:00:00+00:00" → "2026-03-26 00:00 UTC"
    파싱 실패 시 원본 문자열 반환.
    r;   r   )datetimetimezonez%Y-%m-%d %H:%M UTC)r   r   fromisoformat
astimezoneutcstrftime
ValueErrorAttributeError)r   r   r   dtdt_utcs        r   ra   ra      s]     /##G,x||,344' s   AA
 
AAN)rU   )__doc__pathlibr   typingr   r   r   r   r   rB   rj   r`   r   r   r$   r,   r0   dictr   ra   r   r   r   <module>r      s    ?           	6e  OU O5 OS O u  U  s  3 3 
p!d38n p!3 p!3 p!fc c r   