Ë
    uPêjä  ã                   ó€  — U d Z ddlZddlmZ ddlmZ  ej                  dej                  «       ej                  dej                  «       ej                  dej                  «       ej                  dej                  «       ej                  d	«      gZee	d
<   de
dedee   defd„Zde
dede
fd„Zde
dede
fd„Zy)zF
Replace messages with compact stubs and extract human-readable keys.
é    N)ÚFinal)Údetect_content_typez^#\s*(\S+\.\w+)z^//\s*(\S+\.\w+)z^File:\s*(\S+)z^---\s*(\S+\.\w+)z`(\S+\.\w{1,5})`Ú_FILE_PATH_PATTERNSÚmessageÚfallback_indexÚ	used_keysÚreturnc                 óp  — | j                  dd«      }t        |t        «      rdj                  d„ |D «       «      }d}t        D ]?  }|j                  |dd «      }|sŒ|j                  d«      }|j                  d«      d	   } n |€d
|› �}|}d}	||v r|› d|	› �}|	dz  }	||v rŒ|j                  |«       |S )z¹
    Extract a human-readable key for the message.

    Looks for file path patterns in the content. Falls back to message_{index}.
    Handles duplicates by appending _2, _3, etc.
    ÚcontentÚ ú c              3   óv   K  — | ]1  }t        |t        «      r|j                  d d«      n
t        |«      –— Œ3 y­w©Útextr   N©Ú
isinstanceÚdictÚgetÚstr©Ú.0Úps     úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/compression/message_stubbing.pyú	<genexpr>zextract_key.<locals>.<genexpr>   ó.   è ø€ ÒaÐTU´
¸1¼dÔ0C˜1Ÿ5™5 ¨Ô,ÌÈQËÓOÑaùó   ‚79NiÐ  é   ú/éÿÿÿÿÚmessage_é   Ú_)	r   r   ÚlistÚjoinr   ÚsearchÚgroupÚsplitÚadd)
r   r   r   r   ÚkeyÚpatternÚmatchÚpathÚbase_keyÚcounters
             r   Úextract_keyr/      sÞ   € ð �k‰k˜) RÓ(€GÜ�'œ4Ô Ø—(‘(ÑaÐY`ÔaÓaˆà
€CÜ&ò ˆØ—‘˜w u¨˜~Ó.ˆÚà—;‘;˜q“>ˆDØ—*‘*˜S“/ "Ñ%ˆCÙðð €{Ø˜Ð(Ð)ˆð €HØ€GØ
�Ñ
Ø�
˜!˜G˜9Ð%ˆØ�1‰ˆð �Ò
ð ‡M�M�#ÔØ€Jó    r)   c                 óÜ   — | j                  dd«      }t        |t        «      rdj                  d„ |D «       «      }|j	                  d«      dz   }t        |«      }d|› d|› d	|› d
�}i | ¥d|i¥S )z»
    Replace message content with a compact stub.

    Returns a new message dict with the same role but content replaced
    with a short description referencing the retrieval tool.
    r   r   r   c              3   óv   K  — | ]1  }t        |t        «      r|j                  d d«      n
t        |«      –— Œ3 y­wr   r   r   s     r   r   zstub_message.<locals>.<genexpr>?   r   r   ú
r   z[Compressed: u    â€” z lines, z9. Use litellm_content_retrieve tool to get full content.])r   r   r#   r$   Úcountr   )r   r)   r   Ú
line_countÚcontent_typeÚstub_contents         r   Ústub_messager8   6   s‹   € ð �k‰k˜) RÓ(€GÜ�'œ4Ô Ø—(‘(ÑaÐY`ÔaÓaˆàŸ™ dÓ+¨aÑ/€JÜ-¨gÓ6€Lð ˜�u˜E * ¨X°l°^ð DBð 	Cð ð
 0ˆgÐ/�y ,Ñ/Ð/r0   Ú
max_tokensc           
      ó  — | j                  dd«      }t        |t        «      rdj                  d„ |D «       «      }t	        d|dz  «      }t        |«      |k  ri | ¥d|i¥S |j                  d«      }t	        dt        |«      t	        dt        |«      «      z  «      }t	        d	||z  «      }t        |«      |k  ri | ¥d|i¥S |d
z  dz  }||z
  }dj                  |d| «      dz   dj                  || d «      z   }	i | ¥d|	i¥S )a˜  
    Truncate a message's content to approximately max_tokens by keeping
    the first 70% and last 30% of lines with a separator in between.

    Uses line-based splitting to preserve code structure (function
    boundaries, indentation) rather than word-based splitting which
    mangles code.

    Used when a message is too large to fit entirely in the budget but
    too relevant to fully stub out.
    r   r   r   c              3   óv   K  — | ]1  }t        |t        «      r|j                  d d«      n
t        |«      –— Œ3 y­wr   r   r   s     r   r   z#truncate_message.<locals>.<genexpr>Z   r   r   éd   é   r3   r   r!   é   é
   Nz&
...[truncated for context window]...
)r   r   r#   r$   ÚmaxÚlenr'   )
r   r9   r   Útarget_charsÚlinesÚavg_line_lenÚtarget_linesÚfirst_countÚ
last_countÚ	truncateds
             r   Útruncate_messagerI   L   s+  € ð �k‰k˜) RÓ(€GÜ�'œ4Ô Ø—(‘(ÑaÐY`ÔaÓaˆô ˜c :°¡>Ó2€Lä
ˆ7ƒ|�|Ò#Ø.�'Ð.˜9 gÑ.Ð.à—=‘= Ó&€Eô ˜a¤ W£´°Q¼¸E»
Ó1CÑ!CÓD€LÜ˜a °Ñ!=Ó>€Lä
ˆ5ƒz�\Ò!Ø.�'Ð.˜9 gÑ.Ð.à&¨Ñ*¨rÑ1€KØ$ {Ñ2€Jà�	‰	�%˜˜Ð%Ó&Ð)SÑSÐVZ×V_ÑV_Ð`eÐgqÐfqÐfrÐ`sÓVtÑtð ð -ˆgÐ,�y )Ñ,Ð,r0   )Ú__doc__ÚreÚtypingr   Ú%litellm.compression.content_detectionr   ÚcompileÚ	MULTILINEr   Ú__annotations__r   ÚintÚsetr   r/   r8   rI   © r0   r   ú<module>rT      sã   ðòó 
Ý å Eð €B‡J�JÐ! 2§<¡<Ó0Ø€B‡J�JÐ" B§L¡LÓ1Ø€B‡J�JÐ  "§,¡,Ó/Ø€B‡J�JÐ# R§\¡\Ó2Ø€B‡J�JÐ"Ó#ðÐ �Uó ð˜ð ¨sð ¸sÀ3¹xð ÈCó ðD0˜$ð 0 Sð 0¨Tó 0ð,$-˜dð $-°ð $-¸ô $-r0   