
    (<i                    \    d Z ddlmZ ddlZddlmZ  ee      ZdZddZ	ddZ
ddd	dd
Zy)uA  
utils/context_summarizer.py — 규칙 기반 컨텍스트 요약

LLM 호출 없이 Goal/Progress/Decisions/Files/NextSteps 구조로
중간 구역 turns를 요약한다.

Usage:
    from utils.context_summarizer import generate_summary, serialize_for_summary

    summary = generate_summary(turns, prev_summary="...")
    )annotationsN)
get_loggerzclaude-haiku-4-5-20251001c           	     h   g }| D ]  }|j                  dd      }|j                  d      xs d}|j                  d      }|j                  d      }|r|D cg c]5  }t        |t              s|j                  di       j                  dd	      7 }}|j                  d
| ddj	                  |              |s|j                  d|dd         |r$|r|dd nd}	|j                  d
| d| d|	        |r|dd nd}	|j                  d
| d|	         dj	                  |      S c c}w )u   turns를 요약용 텍스트로 직렬화한다.

    tool_calls 이름과 tool 결과를 레이블 텍스트로 변환한다.

    Args:
        turns: 메시지 dict 목록

    Returns:
        직렬화된 텍스트 문자열
    roleunknowncontent 
tool_callstool_call_idfunctionname?[z] tool_calls: , z  content: N   z(empty)z] tool_result(z): i,  z] 
)get
isinstancedictappendjoin)
turnslinesmsgr   r   r
   r   tcnamessnippets
             I/home/jay/workspace/.worktrees/task-2057-dev2/utils/context_summarizer.pyserialize_for_summaryr      s@    E 0wwvy)'')$*WW\*
ww~.GQjU_`bdhUiRVVJ+//<jEjLL1TF.51A0BCD{74C=/:;'.gdsmIGLL1TF.c'KL'.gdsmIGLL1TF"WI./!0" 99U ks   D/.$D/c                   t         j                  j                  d      }|st        j	                  d       y	 ddl}|j                  |      }t        |       }dg}|r|j                  d| d       |j                  d	|        |j                  j                  t        d
ddj                  |      dg      }|j                  rKt        |j                        dkD  r3t        |j                  d   dd      }|r|j!                         }	|	rd|	 S y# t"        $ r }
t        j%                  d|
       Y d}
~
yd}
~
ww xY w)uJ  Anthropic API (haiku)를 사용하여 구조화 요약을 생성한다.

    API 키 미설정, 네트워크 오류 등 모든 실패 시 None을 반환한다.

    Args:
        turns: 요약할 메시지 dict 목록
        prev_summary: 이전 요약 텍스트

    Returns:
        LLM 생성 요약 문자열 또는 None
    ANTHROPIC_API_KEYu.   ANTHROPIC_API_KEY 미설정, LLM 요약 스킵Nr   )api_keyuk   아래 대화 내용을 구조화 요약하세요.
형식: Goal / Progress / Decisions / Files / NextSteps
   이전 요약:
r   u   대화 내용:
i   user)r   r   )model
max_tokensmessagestextu   [LLM 요약]
u   LLM 요약 생성 실패: %s)osenvironr   loggerdebug	anthropic	Anthropicr   r   r'   create_LLM_SUMMARY_MODELr   r   lengetattrstrip	Exceptionwarning)r   prev_summaryr"   r-   client
serializedprompt_partsresponser(   resultes              r   _try_llm_summaryr=   9   sA    jjnn01GEF:$$W$5*51
 H  I"2<. CD.zl;<??))$%$))L2IJK * 
 H$4$4 5 98++A.=D+F844   :5q99:s   CD 	D>D99D>F)use_llmc                  | sy|r%t        | |      }||S t        j                  d       g }g }g }g }| D ]  }|j                  dd      }	|j                  d      xs d}
|j                  d      }|	dk(  r|
r|j	                  |
dd        X|	d	k(  s^|
r|j	                  |
dd        |sw|D ]  }t        |t              s|j                  d
i       }|j                  dd      }|j                  dd      }|j	                  |       d|v sd|j                         v srddl}|j                  d|      }|j                  |dd          dg}|r"|j	                  d|j                                 |r(dj                  |dd       }|j	                  d|        |r(dj                  |dd       }|j	                  d|        |rDt        t        j                  |            }|j	                  ddj                  |dd               |rDt        t        j                  |            }|j	                  ddj                  |dd               t        |       }|j	                  d| d       dj                  |      S )u#  중간 구역 turns를 구조화 요약 문자열로 반환한다.

    use_llm=False: 규칙 기반 (Goal/Progress/Decisions/Files/NextSteps).
    use_llm=True: Anthropic API (haiku)로 구조화 요약 생성. 실패 시 규칙 기반 fallback.
    빈 turns이면 None 반환.

    Args:
        turns: 요약할 메시지 dict 목록
        prev_summary: 이전 압축 시 생성된 요약 (iterative 누적용)
        use_llm: True이면 LLM 요약 시도 (기본값: False)

    Returns:
        구조화 요약 문자열 또는 None
    Nu0   LLM 요약 실패, 규칙 기반 fallback 사용r   r	   r   r
   r$   r   	assistantr   r   	argumentspathfiler   z["\']([^"\']+\.[a-z]{2,4})["\']   u   [압축 요약]r#   z; zGoal: z
Progress: z	Actions: r   
   zFiles: u   (압축된 턴 수: )r   )r=   r+   infor   r   r   r   lowerrefindallextendr3   r   listfromkeysr1   )r   r6   r>   
llm_result	user_msgsassistant_msgs
tool_names	file_refsr   r   r   r
   r   fnr   argsrI   foundsectionsgoalsprogressunique_toolsunique_files
turn_counts                           r   generate_summaryr\   g   s}    %e\:
!FG I "NJI 8wwvr"'')$*WW\*
6>gWTc]+[ %%gdsm4$ 8B!"d+VVJ3!vvfb1!vvk26"))$/!T>Vtzz|-C%$&JJ/QSW$XE%,,U2AY7882 --H*<+=+=+?*@AB		)BQ-(&()99^BQ/0*XJ/0DMM*56)DIIl3B.?$@#ABCDMM)45'$))L",=">!?@AUJOO*:,a8999X    )r   
list[dict]returnstr)r   r^   r6   
str | Noner_   ra   )N)r   r^   r6   ra   r>   boolr_   ra   )__doc__
__future__r   r)   utils.loggerr   __name__r+   r0   r   r=   r\    r]   r   <module>rh      s@   
 # 	 #	H	0 @+\O\a Or]   