§
    TpŹi±<  ć                  óF   d Z ddlmZ ddlZddlmc mZ ddl	m	Z	 ddl
Z
ddlmZmZ ddZ G d d¦  «        Z G d d¦  «        Z G d d¦  «        Z G d d¦  «        Z G d d¦  «        Z G d d¦  «        Z G d d¦  «        Z G d d¦  «        Z G d d¦  «        ZdS )z(Tests for the context management system.é    )ŚannotationsN)Śdatetime)ŚMeetingStateŚScratchpadEntryŚagentŚstrŚcontentŚreturnr   c                óH    t          | |t          ddddd¦  «        ¬¦  «        S )z0Create a ScratchpadEntry with a fixed timestamp.iź  é   é   é
   r   )Ś
agent_namer	   Ś	timestamp)r   r   )r   r	   s     śA/root/projects/multi-agents-meeting/tests/test_context_manager.pyŚ_make_entryr      s2    åŲŲŻ4  BØØAŃ.Ō.šń ō š ó    c                  ó$    e Zd ZdZdddZddZdS )ŚMockLLMClientz.Mock LLM client that returns a canned summary.ś- Key point A
- Key point BŚresponser   r
   ŚNonec                ó>    || _         d| _        d| _        g | _        d S )Nr   Ś )r   Ś
call_countŚlast_systemŚlast_messages)Śselfr   s     r   Ś__init__zMockLLMClient.__init__   s&    Ų ŲŲ "ŌŲ35ŌŠŠr   ŚsystemŚmessagesślist[dict[str, str]]c                óL    | xj         dz  c_         || _        || _        | j        S )Né   )r   r   r   r   )r   r    r!   s      r   ŚchatzMockLLMClient.chat"   s*    Ų1ŃŲ!ŌŲ%ŌŲ}Šr   N)r   )r   r   r
   r   )r    r   r!   r"   r
   r   )Ś__name__Ś
__module__Ś__qualname__Ś__doc__r   r%   © r   r   r   r      sG        Ų8Š8š6š 6š 6š 6š 6šš š š š š r   r   c                  ó2    e Zd ZdZd	dZd	dZd	dZd	dZdS )
ŚTestEstimateTokensz&Tests for the estimate_tokens utility.r
   r   c                ó¼   ddl m} d} ||¦  «        }d}||k    }d}||k    }|r|s¬t          j        d||fd|||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	z  }d
d|iz  }	t          t          j	        |	¦  «        ¦  «        dx}x}x}}dS )z!English text: ~4 chars per token.r   ©Śestimate_tokensz4Hello world this is a test sentence with some words.é   é   ©ś<=r3   ©z%(py1)s <= %(py4)sz%(py4)s <= %(py6)sŚtokens©Śpy1Śpy4Śpy6śassert %(py8)sŚpy8N©
Śsrc.context_managerr/   Ś
@pytest_arŚ_call_reprcompareŚ	_safereprŚ@py_builtinsŚlocalsŚ_should_repr_global_nameŚAssertionErrorŚ_format_explanation©
r   r/   Śtextr5   Ś@py_assert0Ś@py_assert2Ś@py_assert5Ś@py_assert3Ś@py_format7Ś@py_format9s
             r   Śtest_estimate_tokens_englishz/TestEstimateTokens.test_estimate_tokens_english1   s$   ą7Š7Š7Š7Š7Š7ąEŲ  Ń&Ō&ąŠ qFŅ Š bŠ FbŅ Š Š Š Š Š Õ Ō Š Š Š Š Š qFbŠ Ń Ō Õ Ō qŃ Ō Š Õ Ō Ń Ō Š Š Õ Ō FŃ Ō Š Õ Ō FŃ Ō Š Š Õ Ō bŃ Ō Š Š Ń Š Š Š Š Š Ń Š Õ Õ Ō Š Ń Ō Ń Ō Š Š Š Š Š Š Š Š Š Š Š r   c                ó¼   ddl m} d} ||¦  «        }d}||k    }d}||k    }|r|s¬t          j        d||fd|||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	z  }d
d|iz  }	t          t          j	        |	¦  «        ¦  «        dx}x}x}}dS )z#Chinese text: ~1.5 chars per token.r   r.   uB   čæęÆäøäøŖäø­ęęµčÆå„å­ēØäŗéŖčÆäø­ęåčÆä¼°ē®åč½r   é   r2   r4   r5   r6   r:   r;   Nr<   rF   s
             r   Śtest_estimate_tokens_chinesez/TestEstimateTokens.test_estimate_tokens_chinese:   s$   ą7Š7Š7Š7Š7Š7ąSŲ  Ń&Ō&ąŠ!rVŅ!Š!rŠ!VrŅ!Š!Š!Š!Š!Š!Õ!Ō!Š!Š!Š!Š!Š!rVrŠ!Ń!Ō!Õ!Ō!rŃ!Ō!Š!Õ!Ō!Ń!Ō!Š!Š!Õ!Ō!VŃ!Ō!Š!Õ!Ō!VŃ!Ō!Š!Š!Õ!Ō!rŃ!Ō!Š!Š!Ń!Š!Š!Š!Š!Š!Ń!Š!Õ!Õ!Ō!Š!Ń!Ō!Ń!Ō!Š!Š!Š!Š!Š!Š!Š!Š!Š!Š!Š!r   c                óv   ddl m} d} ||¦  «        }d}||k    }|st          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        d
x}}d
S )zMixed Chinese and English text.r   r.   u"   Helloäøēļ¼this is a testęµčÆ)ś>)z%(py0)s > %(py3)sr5   ©Śpy0Śpy3śassert %(py5)sŚpy5N©
r=   r/   r>   r?   rA   rB   rC   r@   rD   rE   )r   r/   rG   r5   rI   Ś@py_assert1Ś@py_format4Ś@py_format6s           r   Śtest_estimate_tokens_mixedz-TestEstimateTokens.test_estimate_tokens_mixedC   sļ    ą7Š7Š7Š7Š7Š7ą3Ų  Ń&Ō&ąŠvzŠŠŠÕŌŠŠŠŠvŠŃŌŠÕŌŃŌŠŠÕŌvŃŌŠÕŌvŃŌŠŠÕŌŃŌŠŠŃŠŠŠŠŠŃŠÕÕŌŠŃŌŃŌŠŠŠŠŠŠŠr   c                óŹ   ddl m} d} ||¦  «        }d}||k    }|s½t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        d
x}x}x}}d
S )u   Empty string ā 0 tokens.r   r.   r   ©ś==)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr/   )rU   Śpy2r8   Śpy7zassert %(py9)sŚpy9NrY   )r   r/   rZ   rK   Ś@py_assert6rJ   Ś@py_format8Ś@py_format10s           r   Śtest_estimate_tokens_emptyz-TestEstimateTokens.test_estimate_tokens_emptyL   s   ą7Š7Š7Š7Š7Š7ą!Š'rŃ"Ō"Š' aŠ'Š" aŅ'Š'Š'Š'Õ'Ō'Š'Š'Š'Š'Š" aŠ'Ń'Ō'Š'Õ'Ō'Ń'Ō'Š'Š'Õ'Ō'Ń'Ō'Š'Õ'Ō'Ń'Ō'Š'Š'Õ'Ō'rŃ'Ō'Õ'Ō'Š"Ń'Ō'Õ'Ō' aŃ'Ō'Š'Š'Ń'Š'Š'Š'Š'Š'Ń'Š'Õ'Õ'Ō'Š'Ń'Ō'Ń'Ō'Š'Š'Š'Š'Š'Š'Š'Š'Š'Š'Š'r   N©r
   r   )r&   r'   r(   r)   rN   rQ   r]   rg   r*   r   r   r,   r,   .   sj        Ų0Š0š!š !š !š !š"š "š "š "šš š š š(š (š (š (š (š (r   r,   c                  ó    e Zd ZdZddZdS )ŚTestCompactScratchpadLevel0z+Short scratchpad stays unchanged (Level 0).r
   r   c                óL   ddl m} t          dd¦  «        t          dd¦  «        g} |d¬¦  «        }t          ¦   «         }|                     ||¦  «        }d}||v }|st          j        d	|fd
||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}||v }|st          j        d	|fd
||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}||v }|st          j        d	|fd
||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}||v }|st          j        d	|fd
||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}|j        }
d}|
|k    }|sŖt          j        d|fd|
|f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        dz  }	dd|	iz  }t          t          j        |¦  «        ¦  «        dx}
x}}dS )z7Scratchpad under budget returns full text, no LLM call.r   ©ŚContextManagerŚ	architectzUse microservices.ŚdevopszSounds good.ép  ©Śbudget_tokens©Śin©z%(py1)s in %(py3)sŚresult©r7   rV   rW   rX   Nr_   ©z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)sŚmock_client©rU   ra   rX   śassert %(py7)srb   )r=   rm   r   r   Ścompact_scratchpadr>   r?   r@   rA   rB   rC   rD   rE   r   )r   rm   ŚentriesŚcmry   rv   rH   rI   r[   r\   rZ   Ś@py_assert4rK   re   s                 r   Śtest_short_scratchpad_unchangedz;TestCompactScratchpadLevel0.test_short_scratchpad_unchanged[   s^   ą6Š6Š6Š6Š6Š6õ Š%9Ń:Ō:Ż .Ń1Ō1š
š ^Ø$Š/Ń/Ō/Ż#ooą×&Ņ& w°Ń<Ō<š Š${fŠ$Š$Š$Š$Õ$Ō$Š$Š$Š$Š${fŠ$Ń$Ō$Õ$Ō${Ń$Ō$Š$Õ$Ō$Ń$Ō$Š$Š$Õ$Ō$fŃ$Ō$Š$Õ$Ō$fŃ$Ō$Š$Š$Š$Š$Ń$Š$Š$Š$Š$Š$Ń$Š$Õ$Õ$Ō$Š$Ń$Ō$Ń$Ō$Š$Š$Š$Š$Š$Ų#Š-Š# vŠ-Š-Š-Š-Õ-Ō-Š-Š-Š-Š-Š# vŠ-Ń-Ō-Õ-Ō-Š#Ń-Ō-Š-Õ-Ō-Ń-Ō-Š-Š-Õ-Ō- vŃ-Ō-Š-Õ-Ō- vŃ-Ō-Š-Š-Š-Š-Ń-Š-Š-Š-Š-Š-Ń-Š-Õ-Õ-Ō-Š-Ń-Ō-Ń-Ō-Š-Š-Š-Š-Š-ŲŠ!x6Š!Š!Š!Š!Õ!Ō!Š!Š!Š!Š!x6Š!Ń!Ō!Õ!Ō!xŃ!Ō!Š!Õ!Ō!Ń!Ō!Š!Š!Õ!Ō!6Ń!Ō!Š!Õ!Ō!6Ń!Ō!Š!Š!Š!Š!Ń!Š!Š!Š!Š!Š!Ń!Š!Õ!Õ!Ō!Š!Ń!Ō!Ń!Ō!Š!Š!Š!Š!Š!ŲŠ'~ Š'Š'Š'Š'Õ'Ō'Š'Š'Š'Š'~ Š'Ń'Ō'Õ'Ō'~Ń'Ō'Š'Õ'Ō'Ń'Ō'Š'Š'Õ'Ō' Ń'Ō'Š'Õ'Ō' Ń'Ō'Š'Š'Š'Š'Ń'Š'Š'Š'Š'Š'Ń'Š'Õ'Õ'Ō'Š'Ń'Ō'Ń'Ō'Š'Š'Š'Š'Š'ąŌ%Š*ØŠ*Š%ØŅ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š%ØŠ*Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō*{Ń*Ō*Š*Õ*Ō*{Ń*Ō*Š*Š*Õ*Ō*Š%Ń*Ō*Õ*Ō*ØŃ*Ō*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*Š*Š*r   Nrh   )r&   r'   r(   r)   r   r*   r   r   rj   rj   X   s.        Ų5Š5š+š +š +š +š +š +r   rj   c                  ó"    e Zd ZdZddZddZdS )ŚTestCompactScratchpadLevel1z4Medium scratchpad truncates early entries (Level 1).r
   r   c                ó   ddl m} d}t          d|¦  «        t          d|¦  «        t          dd¦  «        t          dd	¦  «        g} |d
¬¦  «        }t          ¦   «         }|                     ||¦  «        }d}||v }|st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        dx}}d	}||v }|st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        dx}}||v}|sĀt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }t          t          j        |¦  «        ¦  «        d}dS )z@Early entries are truncated; recent 2 entries preserved in full.r   rl   ĮŠ  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAŚagent_aŚagent_bŚagent_czRecent response C.Śagent_dzRecent response D.éō  rq   rs   ru   rv   rw   rW   rX   N©śnot in)z%(py0)s not in %(py2)sŚlong_content©rU   ra   śassert %(py4)sr8   ©r=   rm   r   r   r|   r>   r?   r@   rA   rB   rC   rD   rE   )r   rm   r   r}   r~   ry   rv   rH   rI   r[   r\   rZ   Ś@py_format3Ś@py_format5s                 r   Śtest_truncates_early_entriesz8TestCompactScratchpadLevel1.test_truncates_early_entriesy   sż   ą6Š6Š6Š6Š6Š6ą!å	 <Ń0Ō0Ż	 <Ń0Ō0Ż	Š#7Ń8Ō8Ż	Š#7Ń8Ō8š	
š ^Ø#Š.Ń.Ō.Ż#ooą×&Ņ& w°Ń<Ō<š $Š-Š# vŠ-Š-Š-Š-Õ-Ō-Š-Š-Š-Š-Š# vŠ-Ń-Ō-Õ-Ō-Š#Ń-Ō-Š-Õ-Ō-Ń-Ō-Š-Š-Õ-Ō- vŃ-Ō-Š-Õ-Ō- vŃ-Ō-Š-Š-Š-Š-Ń-Š-Š-Š-Š-Š-Ń-Š-Õ-Õ-Ō-Š-Ń-Ō-Ń-Ō-Š-Š-Š-Š-Š-Ų#Š-Š# vŠ-Š-Š-Š-Õ-Ō-Š-Š-Š-Š-Š# vŠ-Ń-Ō-Õ-Ō-Š#Ń-Ō-Š-Õ-Ō-Ń-Ō-Š-Š-Õ-Ō- vŃ-Ō-Š-Õ-Ō- vŃ-Ō-Š-Š-Š-Š-Ń-Š-Š-Š-Š-Š-Ń-Š-Õ-Õ-Ō-Š-Ń-Ō-Ń-Ō-Š-Š-Š-Š-Š-ą 6Š)Š)Š)Š)Õ)Ō)Š)Š)Š)Š)| 6Š)Ń)Ō)Š)Õ)Ō)Ń)Ō)Š)Š)Õ)Ō)|Ń)Ō)Š)Õ)Ō)|Ń)Ō)Š)Š)Š)Õ)Ō)Ń)Ō)Š)Š)Õ)Ō) 6Ń)Ō)Š)Õ)Ō) 6Ń)Ō)Š)Š)Š)Š)Ń)Š)Š)Š)Š)Š)Ń)Š)Õ)Õ)Ō)Š)Ń)Ō)Ń)Ō)Š)Š)Š)Š)Š)r   c                óz   ddl m} t          dd¦  «        t          dd¦  «        t          dd¦  «        t          d	d
¦  «        g} |d¬¦  «        }t          ¦   «         }|                     ||¦  «        }d}||v }|st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d
}||v }|st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}dS )z,The last 2 entries are always kept verbatim.r   rl   Śearly1Įø  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXŚearly2Įø  YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYŚrecent1z,Important recent insight about architecture.Śrecent2z"Final clarification on deployment.r   rq   rs   ru   rv   rw   rW   rX   Nr   )
r   rm   r}   r~   ry   rv   rH   rI   r[   r\   s
             r   Ś%test_recent_entries_preserved_in_fullzATestCompactScratchpadLevel1.test_recent_entries_preserved_in_full   s   ą6Š6Š6Š6Š6Š6õ  *Ń-Ō-Ż *Ń-Ō-Ż	Š#QŃRŌRŻ	Š#GŃHŌHš	
š ^Ø#Š.Ń.Ō.Ż#ooą×&Ņ& w°Ń<Ō<ą=ŠGŠ=ĄŠGŠGŠGŠGÕGŌGŠGŠGŠGŠGŠ=ĄŠGŃGŌGÕGŌGŠ=ŃGŌGŠGÕGŌGŃGŌGŠGŠGÕGŌGĄŃGŌGŠGÕGŌGĄŃGŌGŠGŠGŠGŠGŃGŠGŠGŠGŠGŠGŃGŠGÕGÕGŌGŠGŃGŌGŃGŌGŠGŠGŠGŠGŠGŲ3Š=Š3°vŠ=Š=Š=Š=Õ=Ō=Š=Š=Š=Š=Š3°vŠ=Ń=Ō=Õ=Ō=Š3Ń=Ō=Š=Õ=Ō=Ń=Ō=Š=Š=Õ=Ō=°vŃ=Ō=Š=Õ=Ō=°vŃ=Ō=Š=Š=Š=Š=Ń=Š=Š=Š=Š=Š=Ń=Š=Õ=Õ=Ō=Š=Ń=Ō=Ń=Ō=Š=Š=Š=Š=Š=Š=Š=r   Nrh   )r&   r'   r(   r)   r   r   r*   r   r   r   r   v   sB        Ų>Š>š*š *š *š *š.>š >š >š >š >š >r   r   c                  ó    e Zd ZdZddZdS )ŚTestCompactScratchpadLevel2z6Very long scratchpad uses LLM summarization (Level 2).r
   r   c                ó   ddl m} d t          d¦  «        D ¦   «         }|                     t	          dd¦  «        ¦  «         |                     t	          dd¦  «        ¦  «          |d	¬
¦  «        }t          d¬¦  «        }|                     ||¦  «        }|j        }d}||k    }|sŖt          j	        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        dx}x}}d}||v }|st          j	        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}||v }|st          j	        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}||v }|st          j	        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}dS )zCWhen truncation alone can't meet budget, LLM summarization is used.r   rl   c                ó4    g | ]}t          d | d¦  «        S )Śagent_Į   ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ)r   )Ś.0Śis     r   ś
<listcomp>zSTestCompactScratchpadLevel2.test_very_long_scratchpad_calls_llm.<locals>.<listcomp>°   s8    š 
š 
š 
ąõ   jŃ1Ō1š
š 
š 
r   r   r   zRecent point 1.r   zRecent point 2.éd   rq   z- Summary of early discussion©r   r$   r_   rx   ry   rz   r{   rb   NzSummary of early discussionrs   ru   rv   rw   rW   rX   )r=   rm   ŚrangeŚappendr   r   r|   r   r>   r?   rA   rB   rC   r@   rD   rE   )r   rm   r}   r~   ry   rv   rZ   r   rK   r\   re   rH   rI   r[   s                 r   Ś#test_very_long_scratchpad_calls_llmz?TestCompactScratchpadLevel2.test_very_long_scratchpad_calls_llm«   sä   ą6Š6Š6Š6Š6Š6š
š 
å2YYš
ń 
ō 
š
 	{ 9Š.?Ń@Ō@ŃAŌAŠAŲ{ 9Š.?Ń@Ō@ŃAŌAŠAą^Ø#Š.Ń.Ō.Ż#Š-LŠMŃMŌMą×&Ņ& w°Ń<Ō<š Ō%Š*ØŠ*Š%ØŅ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š%ØŠ*Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō*{Ń*Ō*Š*Õ*Ō*{Ń*Ō*Š*Š*Õ*Ō*Š%Ń*Ō*Õ*Ō*ØŃ*Ō*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*ą,Š6Š,°Š6Š6Š6Š6Õ6Ō6Š6Š6Š6Š6Š,°Š6Ń6Ō6Õ6Ō6Š,Ń6Ō6Š6Õ6Ō6Ń6Ō6Š6Š6Õ6Ō6°Ń6Ō6Š6Õ6Ō6°Ń6Ō6Š6Š6Š6Š6Ń6Š6Š6Š6Š6Š6Ń6Š6Õ6Õ6Ō6Š6Ń6Ō6Ń6Ō6Š6Š6Š6Š6Š6ą Š*Š  FŠ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š  FŠ*Ń*Ō*Õ*Ō*Š Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō* FŃ*Ō*Š*Õ*Ō* FŃ*Ō*Š*Š*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Ų Š*Š  FŠ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š  FŠ*Ń*Ō*Õ*Ō*Š Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō* FŃ*Ō*Š*Õ*Ō* FŃ*Ō*Š*Š*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*r   Nrh   )r&   r'   r(   r)   rØ   r*   r   r   r   r   Ø   s.        Ų@Š@š+š +š +š +š +š +r   r   c                  ó*    e Zd ZdZddZddZddZdS )	ŚTestBuildPMContextzTests for building PM context.r
   r   c                óL   ddl m} t          dd¬¦  «        }t          dd¦  «        g|_         |d¬	¦  «        }t          ¦   «         }|                     ||¦  «        }d}||v }|st          j        d
|fd||f¦  «        t          j	        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}||v }|st          j        d
|fd||f¦  «        t          j	        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}dS )z4PM context includes topic and compressed scratchpad.r   rl   z
API DesignzREST vs GraphQL)ŚtopicŚcontextrn   zPrefer GraphQL.rp   rq   rs   ru   rv   rw   rW   rX   N)r=   rm   r   r   Ś
scratchpadr   Śbuild_pm_contextr>   r?   r@   rA   rB   rC   rD   rE   ©
r   rm   Śstater~   ry   rv   rH   rI   r[   r\   s
             r   Ś3test_build_pm_context_includes_topic_and_scratchpadzFTestBuildPMContext.test_build_pm_context_includes_topic_and_scratchpadĪ   sž   ą6Š6Š6Š6Š6Š6å <Š9JŠKŃKŌKåŠ%6Ń7Ō7š
Ōš ^Ø$Š/Ń/Ō/Ż#ooą×$Ņ$ UØKŃ8Ō8ąŠ%|vŠ%Š%Š%Š%Õ%Ō%Š%Š%Š%Š%|vŠ%Ń%Ō%Õ%Ō%|Ń%Ō%Š%Õ%Ō%Ń%Ō%Š%Š%Õ%Ō%vŃ%Ō%Š%Õ%Ō%vŃ%Ō%Š%Š%Š%Š%Ń%Š%Š%Š%Š%Š%Ń%Š%Õ%Õ%Ō%Š%Ń%Ō%Ń%Ō%Š%Š%Š%Š%Š%Ų Š*Š  FŠ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š  FŠ*Ń*Ō*Õ*Ō*Š Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō* FŃ*Ō*Š*Õ*Ō* FŃ*Ō*Š*Š*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*r   c                óf   ddl m} t          dddz  dd¬¦  «        } |d	¬
¦  «        }t          ¦   «         }|                     ||¦  «        }d}||v }|st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}d}||z  }
|
|v}|sŖt          j        d|fd|
|f¦  «        t          j        |¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }t          t          j        |¦  «        ¦  «        dx}x}x}
}dS )zEWhen context_summary is set, PM gets summary instead of full context.r   rl   z	Big TopicŚAé N  zShort summary of background.é   ©r¬   r­   Ścontext_summaryŚcurrent_roundrp   rq   rs   ru   rv   rw   rW   rX   Nr   ©z"(%(py1)s * %(py3)s) not in %(py6)s©r7   rV   r9   r:   r;   ©r=   rm   r   r   rÆ   r>   r?   r@   rA   rB   rC   rD   rE   ©r   rm   r±   r~   ry   rv   rH   rI   r[   r\   r   rJ   rL   rM   s                 r   Ś9test_build_pm_context_uses_context_summary_when_availablezLTestBuildPMContext.test_build_pm_context_uses_context_summary_when_availableŽ   s   ą6Š6Š6Š6Š6Š6åŲŲ%KŲ:Ųš	
ń 
ō 
š ^Ø$Š/Ń/Ō/Ż#ooą×$Ņ$ UØKŃ8Ō8ą-Š7Š-°Š7Š7Š7Š7Õ7Ō7Š7Š7Š7Š7Š-°Š7Ń7Ō7Õ7Ō7Š-Ń7Ō7Š7Õ7Ō7Ń7Ō7Š7Š7Õ7Ō7°Ń7Ō7Š7Õ7Ō7°Ń7Ō7Š7Š7Š7Š7Ń7Š7Š7Š7Š7Š7Ń7Š7Õ7Õ7Ō7Š7Ń7Ō7Ń7Ō7Š7Š7Š7Š7Š7ąŠ*eŠ*eŠ* FŠ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š* FŠ*Ń*Ō*Õ*Ō*Ń*Ō*Õ*Ō*eŃ*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō* FŃ*Ō*Š*Õ*Ō* FŃ*Ō*Š*Š*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*Š*Š*Š*Š*r   c                ó0   ddl m} d}t          d|dd¬¦  «        } |d¬¦  «        }t          ¦   «         }|                     ||¦  «        }||v }|sĀt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        d}dS )z5Round 1: PM gets full context even if summary exists.r   rl   z3Detailed background about the project requirements.ŚTopiczShort summary.r·   rp   rq   rs   )z%(py0)s in %(py2)sŚfull_contextrv   r   r   r8   N)r=   rm   r   r   rÆ   r>   r?   rA   rB   rC   r@   rD   rE   )
r   rm   rĮ   r±   r~   ry   rv   rZ   r   r   s
             r   Ś7test_build_pm_context_first_round_includes_full_contextzJTestBuildPMContext.test_build_pm_context_first_round_includes_full_contextń   sT   ą6Š6Š6Š6Š6Š6ąLŻŲŲ Ų,Ųš	
ń 
ō 
š ^Ø$Š/Ń/Ō/Ż#ooą×$Ņ$ UØKŃ8Ō8ąvŠ%Š%Š%Š%Õ%Ō%Š%Š%Š%Š%|vŠ%Ń%Ō%Š%Õ%Ō%Ń%Ō%Š%Š%Õ%Ō%|Ń%Ō%Š%Õ%Ō%|Ń%Ō%Š%Š%Š%Õ%Ō%Ń%Ō%Š%Š%Õ%Ō%vŃ%Ō%Š%Õ%Ō%vŃ%Ō%Š%Š%Š%Š%Ń%Š%Š%Š%Š%Š%Ń%Š%Õ%Õ%Ō%Š%Ń%Ō%Ń%Ō%Š%Š%Š%Š%Š%r   Nrh   )r&   r'   r(   r)   r²   r¾   rĀ   r*   r   r   rŖ   rŖ   Ė   sV        Ų(Š(š+š +š +š +š +š +š +š +š&&š &š &š &š &š &r   rŖ   c                  ó"    e Zd ZdZddZddZdS )ŚTestBuildAgentContextz*Tests for building Agent-specific context.r
   r   c                ó
   ddl m} t          d¬¦  «        }t          dd¦  «        g|_         |d¬¦  «        }t          ¦   «         }|                     |d	d
|¬¦  «        }d
}||v }|st          j        d|fd||f¦  «        t          j	        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}dS )z=Agent context includes PM's prompt and compressed scratchpad.r   rl   ŚTesting©r¬   ŚpmzLet's discuss testing.rp   rq   rn   z'What testing strategy do you recommend?©r±   Śtarget_agentŚ	pm_promptŚclientrs   ru   rv   rw   rW   rX   N)r=   rm   r   r   r®   r   Śbuild_agent_contextr>   r?   r@   rA   rB   rC   rD   rE   r°   s
             r   Ś4test_build_agent_context_includes_prompt_and_summaryzJTestBuildAgentContext.test_build_agent_context_includes_prompt_and_summary  sL   ą6Š6Š6Š6Š6Š6å 9Š-Ń-Ō-åŠ6Ń7Ō7š
Ōš ^Ø$Š/Ń/Ō/Ż#ooą×'Ņ'ŲŲ$Ų?Ųš	 (ń 
ō 
š 9ŠBŠ8øFŠBŠBŠBŠBÕBŌBŠBŠBŠBŠBŠ8øFŠBŃBŌBÕBŌBŠ8ŃBŌBŠBÕBŌBŃBŌBŠBŠBÕBŌBøFŃBŌBŠBÕBŌBøFŃBŌBŠBŠBŠBŠBŃBŠBŠBŠBŠBŠBŃBŠBÕBÕBŌBŠBŃBŌBŃBŌBŠBŠBŠBŠBŠBŠBŠBr   c                ój   ddl m} t          dddz  d¬¦  «        } |d¬	¦  «        }t          ¦   «         }|                     |d
d|¬¦  «        }d}||v }|st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}d}||z  }
|
|v}|sŖt          j        d|fd|
|f¦  «        t          j        |¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }t          t          j        |¦  «        ¦  «        dx}x}x}
}dS )z4Agent always gets context_summary, not full context.r   rl   rĄ   ŚBrµ   zBrief background.)r¬   r­   rø   rp   rq   ro   zDeploy question?rÉ   rs   ru   rv   rw   rW   rX   Nr   rŗ   r»   r:   r;   ©r=   rm   r   r   rĶ   r>   r?   r@   rA   rB   rC   rD   rE   r½   s                 r   Ś-test_build_agent_context_uses_context_summaryzCTestBuildAgentContext.test_build_agent_context_uses_context_summary   s/   ą6Š6Š6Š6Š6Š6åŲŲ%KŲ/š
ń 
ō 
š
 ^Ø$Š/Ń/Ō/Ż#ooą×'Ņ'ŲŲ!Ų(Ųš	 (ń 
ō 
š #Š,Š" fŠ,Š,Š,Š,Õ,Ō,Š,Š,Š,Š,Š" fŠ,Ń,Ō,Õ,Ō,Š"Ń,Ō,Š,Õ,Ō,Ń,Ō,Š,Š,Õ,Ō, fŃ,Ō,Š,Õ,Ō, fŃ,Ō,Š,Š,Š,Š,Ń,Š,Š,Š,Š,Š,Ń,Š,Õ,Õ,Ō,Š,Ń,Ō,Ń,Ō,Š,Š,Š,Š,Š,ŲŠ*eŠ*eŠ* FŠ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š* FŠ*Ń*Ō*Õ*Ō*Ń*Ō*Õ*Ō*eŃ*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō* FŃ*Ō*Š*Õ*Ō* FŃ*Ō*Š*Š*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*Š*Š*Š*Š*r   Nrh   )r&   r'   r(   r)   rĪ   rŅ   r*   r   r   rÄ   rÄ   	  sF        Ų4Š4šCš Cš Cš Cš(+š +š +š +š +š +r   rÄ   c                  ó"    e Zd ZdZddZddZdS )ŚTestContextSummaryGenerationu:   Tests for summarize_context (long background ā summary).r
   r   c                ó>   ddl m}  |d¬¦  «        }t          ¦   «         }|                     d|¦  «        }d}||k    }|st	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        d	z  }d
d|iz  }t          t	          j        |¦  «        ¦  «        dx}}|j        }d}	||	k    }
|
sŖt	          j        d|
fd||	f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |	¦  «        dz  }dd|iz  }t          t	          j        |¦  «        ¦  «        dx}x}
}	dS )z)Short context returns as-is, no LLM call.r   rl   rp   rq   zShort background.r_   ©z%(py0)s == %(py3)srv   rT   rW   rX   Nrx   ry   rz   r{   rb   ©r=   rm   r   Śsummarize_contextr>   r?   rA   rB   rC   r@   rD   rE   r   ©r   rm   r~   ry   rv   rI   rZ   r[   r\   r   rK   re   s               r   Ś!test_short_context_not_summarizedz>TestContextSummaryGeneration.test_short_context_not_summarized?  sń   ą6Š6Š6Š6Š6Š6ą^Ø$Š/Ń/Ō/Ż#ooą×%Ņ%Š&9ø;ŃGŌGą,Š,vŠ,Ņ,Š,Š,Š,Õ,Ō,Š,Š,Š,Š,vŠ,Š,Ń,Ō,Š,Õ,Ō,Ń,Ō,Š,Š,Õ,Ō,vŃ,Ō,Š,Õ,Ō,vŃ,Ō,Š,Š,Õ,Ō,Š,Ń,Ō,Š,Š,Ń,Š,Š,Š,Š,Š,Ń,Š,Õ,Õ,Ō,Š,Ń,Ō,Ń,Ō,Š,Š,Š,Š,Š,ŲŌ%Š*ØŠ*Š%ØŅ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š%ØŠ*Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō*{Ń*Ō*Š*Õ*Ō*{Ń*Ō*Š*Š*Õ*Ō*Š%Ń*Ō*Õ*Ō*ØŃ*Ō*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*Š*Š*r   c                óL   ddl m} ddz  } |d¬¦  «        }t          d¬¦  «        }|                     ||¦  «        }d}||k    }|st	          j        d	|fd
||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        dx}}|j        }d}
||
k    }|sŖt	          j        d	|fd||
f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |
¦  «        dz  }	dd|	iz  }t          t	          j        |¦  «        ¦  «        dx}x}}
dS )z4Context exceeding threshold is summarized using LLM.r   rl   ŚCi:  rp   rq   zSummarized context.r„   r_   rÖ   rv   rT   rW   rX   Nr$   rx   ry   rz   r{   rb   r×   )r   rm   Ślong_contextr~   ry   rv   rI   rZ   r[   r\   r   rK   re   s                r   Ś$test_long_context_summarized_via_llmzATestContextSummaryGeneration.test_long_context_summarized_via_llmK  s   ą6Š6Š6Š6Š6Š6ąU{Ų^Ø$Š/Ń/Ō/Ż#Š-BŠCŃCŌCą×%Ņ% l°KŃ@Ō@ą.Š.vŠ.Ņ.Š.Š.Š.Õ.Ō.Š.Š.Š.Š.vŠ.Š.Ń.Ō.Š.Õ.Ō.Ń.Ō.Š.Š.Õ.Ō.vŃ.Ō.Š.Õ.Ō.vŃ.Ō.Š.Š.Õ.Ō.Š.Ń.Ō.Š.Š.Ń.Š.Š.Š.Š.Š.Ń.Š.Õ.Õ.Ō.Š.Ń.Ō.Ń.Ō.Š.Š.Š.Š.Š.ŲŌ%Š*ØŠ*Š%ØŅ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š%ØŠ*Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō*{Ń*Ō*Š*Õ*Ō*{Ń*Ō*Š*Š*Õ*Ō*Š%Ń*Ō*Õ*Ō*ØŃ*Ō*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*Š*Š*r   Nrh   )r&   r'   r(   r)   rŚ   rŽ   r*   r   r   rŌ   rŌ   <  sB        ŲDŠDš
+š 
+š 
+š 
+š+š +š +š +š +š +r   rŌ   c                  óB    e Zd ZdZddZddZddZddZddZdd	Z	d
S )ŚTestEdgeCasesz#Edge-case tests for ContextManager.r
   r   c                ó>   ddl m}  |d¬¦  «        }t          ¦   «         }|                     g |¦  «        }d}||k    }|st	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        d	z  }d
d|iz  }t          t	          j        |¦  «        ¦  «        dx}}|j        }d}	||	k    }
|
sŖt	          j        d|
fd||	f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |	¦  «        dz  }dd|iz  }t          t	          j        |¦  «        ¦  «        dx}x}
}	dS )z+Empty entries list returns sentinel string.r   rl   rp   rq   zNo discussion yet.r_   rÖ   rv   rT   rW   rX   Nrx   ry   rz   r{   rb   )r=   rm   r   r|   r>   r?   rA   rB   rC   r@   rD   rE   r   rŁ   s               r   Śtest_compact_empty_entriesz(TestEdgeCases.test_compact_empty_entriesa  sš   ą6Š6Š6Š6Š6Š6ą^Ø$Š/Ń/Ō/Ż#ooą×&Ņ& rØ;Ń7Ō7Ų-Š-vŠ-Ņ-Š-Š-Š-Õ-Ō-Š-Š-Š-Š-vŠ-Š-Ń-Ō-Š-Õ-Ō-Ń-Ō-Š-Š-Õ-Ō-vŃ-Ō-Š-Õ-Ō-vŃ-Ō-Š-Š-Õ-Ō-Š-Ń-Ō-Š-Š-Ń-Š-Š-Š-Š-Š-Ń-Š-Õ-Õ-Ō-Š-Ń-Ō-Ń-Ō-Š-Š-Š-Š-Š-ŲŌ%Š*ØŠ*Š%ØŅ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š%ØŠ*Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō*{Ń*Ō*Š*Õ*Ō*{Ń*Ō*Š*Š*Õ*Ō*Š%Ń*Ō*Õ*Ō*ØŃ*Ō*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*Š*Š*r   c                ó   ddl m} t          dddz  ¦  «        g} |d¬¦  «        }t          d¬	¦  «        }|                     ||¦  «        }d}d}||z  }||v}	|	sŖt          j        d
|	fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        dx}x}x}}	g }d}||v }|}|sd}||v }|}|sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }|                     |¦  «         |st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        dx}x}x}x}x}}dS )z:One entry exceeding budget is truncated or LLM-summarized.r   rl   r   ŚEi@  r¤   rq   z- Summarized single entryr„   r   rŗ   rv   r»   r:   r;   NŚ
Summarizedrs   )z%(py3)s in %(py5)s)rV   rX   z%(py7)srb   )z%(py10)s in %(py12)s)Śpy10Śpy12z%(py14)sŚpy14r$   zassert %(py17)sŚpy17)r=   rm   r   r   r|   r>   r?   r@   rA   rB   rC   rD   rE   r§   Ś_format_boolop)r   rm   r}   r~   ry   rv   rH   rI   r   rJ   rL   rM   rZ   Ś@py_assert9Ś@py_assert11r\   re   Ś@py_format13Ś@py_format15Ś@py_format16Ś@py_format18s                        r   Ś"test_single_entry_exceeding_budgetz0TestEdgeCases.test_single_entry_exceeding_budgetl  s6   ą6Š6Š6Š6Š6Š6åwØØe©Ń4Ō4Š5Ų^Ø#Š.Ń.Ō.Ż#Š-HŠIŃIŌIą×&Ņ& w°Ń<Ō<š Š*eŠ*eŠ* FŠ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š* FŠ*Ń*Ō*Õ*Ō*Ń*Ō*Õ*Ō*eŃ*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō* FŃ*Ō*Š*Õ*Ō* FŃ*Ō*Š*Š*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*Š*Š*ą:Š:wŠ:w&Š Š:Š:Š:Š:Š: LŠ: L°FŠ$:Š:Š:Š:Š:Ń:Õ:Ō:Š:Š:Š:Š:w&Š:Ń:Ō:Õ:Ō:wŃ:Ō:Š:Õ:Ō:Ń:Ō:Š:Š:Õ:Ō:&Ń:Ō:Š:Õ:Ō:&Ń:Ō:Š:Š:Š:Š:Ń:Š:Š:Š:Š:Š:Ń:Š:Š:×:Ņ:Š:Ń:Ō:Š:Š:Š:Õ:Ō:Š:Š:Š:Š: L°FŠ:Ń:Ō:Õ:Ō: LŃ:Ō:Š:Õ:Ō:Ń:Ō:Š:Š:Õ:Ō:°FŃ:Ō:Š:Õ:Ō:°FŃ:Ō:Š:Š:Š:Š:Ń:Š:Š:Š:Š:Š:Ń:Š:Š:×:Ņ:Š:Ń:Ō:Š:Õ:Ō:Š:Š:Ń:Ō:Š:Ń:Š:Š:Š:Š:Š:Ń:Š:Õ:Õ:Ō:Š:Ń:Ō:Ń:Ō:Š:Š:Š:Š:Š:Š:Š:Š:Š:Š:Š:Š:Š:Š:Š:r   c                óō   ddl m} t          dddz  ¦  «        t          dddz  ¦  «        g} |d¬	¦  «        }t          d
¬¦  «        }|                     ||¦  «        }g }d}d}||z  }	|	|v }
|
}|
sd}||v }|}|skt          j        d|
fd|	|f¦  «        t          j        |¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }|                     |¦  «         |
st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        dx}x}x}x}x}	x}
x}}dS )z2Two entries exceeding budget compresses correctly.r   rl   ŚaŚFi'  ŚbŚGr¤   rq   z- Summary of discussionr„   zSummary of discussionrs   )z(%(py3)s * %(py5)s) in %(py8)srv   )rV   rX   r;   z%(py10)srę   )z%(py13)s in %(py15)s)Śpy13Śpy15z%(py17)sré   r$   zassert %(py20)sŚpy20N)r=   rm   r   r   r|   r>   r?   r@   rA   rB   rC   r§   rź   rD   rE   )r   rm   r}   r~   ry   rv   rZ   rI   r   rd   Ś@py_assert7rH   Ś@py_assert12Ś@py_assert14rM   Ś@py_format11rļ   rš   Ś@py_format19Ś@py_format21s                       r   Ś!test_two_entries_exceeding_budgetz/TestEdgeCases.test_two_entries_exceeding_budget{  s   ą6Š6Š6Š6Š6Š6õ S 5[Ń)Ō)ŻS 5[Ń)Ō)š
š ^Ø#Š.Ń.Ō.Ż#Š-FŠGŃGŌGą×&Ņ& w°Ń<Ō<š 	JŠIsŠIUŠIsU{ŠI{fŠ$ŠIŠIŠIŠIŠIŠ(?ŠIŠ(?Ą6Š(IŠIŠIŠIŠIŃIÕIŌIŠIŠIŠIŠI{fŠIŃIŌIÕIŌIsŃIŌIÕIŌIUŃIŌIŠIÕIŌIŃIŌIŠIŠIÕIŌIfŃIŌIŠIÕIŌIfŃIŌIŠIŠIŠIŠIŃIŠIŠIŠIŠIŠIŃIŠIŠI×IŅIŠIŃIŌIŠIŠIŠIÕIŌIŠIŠIŠIŠIŠ(?Ą6ŠIŃIŌIÕIŌIŠ(?ŃIŌIŠIÕIŌIŃIŌIŠIŠIÕIŌIĄ6ŃIŌIŠIÕIŌIĄ6ŃIŌIŠIŠIŠIŠIŃIŠIŠIŠIŠIŠIŃIŠIŠI×IŅIŠIŃIŌIŠIÕIŌIŠIŠIŃIŌIŠIŃIŠIŠIŠIŠIŠIŃIŠIÕIÕIŌIŠIŃIŌIŃIŌIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIŠIr   c           	     ó8   ddl m}  |d¬¦  «        }t          ¦   «         }|j        }d} |||¦  «        }d}||k    }|st	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd	t	          j	        |¦  «        t	          j	        |¦  «        d
z  }	dd|	iz  }
t          t	          j        |
¦  «        ¦  «        dx}x}x}x}}|j        }d}||k    }|sŖt	          j        d|fd||f¦  «        d	t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd	t	          j	        |¦  «        t	          j	        |¦  «        dz  }dd|iz  }t          t	          j        |¦  «        ¦  «        dx}x}}dS )z#Empty context returns empty string.r   rl   rp   rq   r   r_   )za%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.summarize_context
}(%(py4)s, %(py5)s)
} == %(py10)sr~   ry   )rU   ra   r8   rX   rb   rę   zassert %(py12)srē   Nrx   rz   r{   rb   r×   )r   rm   r~   ry   rZ   rK   rd   rė   Ś@py_assert8rż   rķ   r   r\   re   s                 r   Śtest_summarize_empty_contextz*TestEdgeCases.test_summarize_empty_context  sr   ą6Š6Š6Š6Š6Š6ą^Ø$Š/Ń/Ō/Ż#ooąŌ#Š: BŠ:Š#Š# BØŃ4Ō4Š:øŠ:Š4øŅ:Š:Š:Ń:Õ:Ō:Š:Š:Š:Š:Š4øŠ:Ń:Ō:Š:Õ:Ō:Ń:Ō:Š:Š:Õ:Ō:rŃ:Ō:Š:Õ:Ō:rŃ:Ō:Š:Š:Õ:Ō:Š#Ń:Ō:Õ:Ō: BŃ:Ō:Š:Õ:Ō:Ń:Ō:Š:Š:Õ:Ō:ØŃ:Ō:Š:Õ:Ō:ØŃ:Ō:Š:Š:Õ:Ō:Š4Ń:Ō:Õ:Ō:øŃ:Ō:Š:Š:Ń:Š:Š:Š:Š:Š:Ń:Š:Õ:Õ:Ō:Š:Ń:Ō:Ń:Ō:Š:Š:Š:Š:Š:Š:Š:Š:Š:Š:Š:ŲŌ%Š*ØŠ*Š%ØŅ*Š*Š*Š*Õ*Ō*Š*Š*Š*Š*Š%ØŠ*Ń*Ō*Š*Õ*Ō*Ń*Ō*Š*Š*Õ*Ō*{Ń*Ō*Š*Õ*Ō*{Ń*Ō*Š*Š*Õ*Ō*Š%Ń*Ō*Õ*Ō*ØŃ*Ō*Š*Š*Ń*Š*Š*Š*Š*Š*Ń*Š*Õ*Õ*Ō*Š*Ń*Ō*Ń*Ō*Š*Š*Š*Š*Š*Š*Š*Š*Š*r   c                ó   ddl m} t          d¬¦  «        } |d¬¦  «        }t          ¦   «         }|                     ||¦  «        }d}||v }|st          j        d|fd||f¦  «        t          j        |¦  «        d	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	d
z  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}||v}|st          j        d|fd||f¦  «        t          j        |¦  «        d	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	d
z  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}dS )z6PM context works when state has no background context.r   rl   zNo Context MeetingrĒ   rp   rq   rs   ru   rv   rw   rW   rX   NzBackground Contextr   ©z%(py1)s not in %(py3)sr¼   r°   s
             r   Ś test_build_pm_context_no_contextz.TestEdgeCases.test_build_pm_context_no_context  så   ą6Š6Š6Š6Š6Š6åŠ#7Š8Ń8Ō8Ų^Ø$Š/Ń/Ō/Ż#ooą×$Ņ$ UØKŃ8Ō8ą#Š-Š# vŠ-Š-Š-Š-Õ-Ō-Š-Š-Š-Š-Š# vŠ-Ń-Ō-Õ-Ō-Š#Ń-Ō-Š-Õ-Ō-Ń-Ō-Š-Š-Õ-Ō- vŃ-Ō-Š-Õ-Ō- vŃ-Ō-Š-Š-Š-Š-Ń-Š-Š-Š-Š-Š-Ń-Š-Õ-Õ-Ō-Š-Ń-Ō-Ń-Ō-Š-Š-Š-Š-Š-Ų#Š1Š#Ø6Š1Š1Š1Š1Õ1Ō1Š1Š1Š1Š1Š#Ø6Š1Ń1Ō1Õ1Ō1Š#Ń1Ō1Š1Õ1Ō1Ń1Ō1Š1Š1Õ1Ō1Ø6Ń1Ō1Š1Õ1Ō1Ø6Ń1Ō1Š1Š1Š1Š1Ń1Š1Š1Š1Š1Š1Ń1Š1Õ1Õ1Ō1Š1Ń1Ō1Ń1Ō1Š1Š1Š1Š1Š1Š1Š1r   c                ó$   ddl m} t          d¬¦  «        } |d¬¦  «        }t          ¦   «         }|                     |dd|¬	¦  «        }d
}||v}|st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}d}||v }|st          j        d|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        dx}}dS )z6Agent context works when no context or summary exists.r   rl   zBare MeetingrĒ   rp   rq   Śtestz	Question?rÉ   Ś
Backgroundr   r  rv   rw   rW   rX   Nrs   ru   rŃ   r°   s
             r   Ś.test_build_agent_context_no_context_no_summaryz<TestEdgeCases.test_build_agent_context_no_context_no_summary¢  sń   ą6Š6Š6Š6Š6Š6å >Š2Ń2Ō2Ų^Ø$Š/Ń/Ō/Ż#ooą×'Ņ'ŲŲŲ!Ųš	 (ń 
ō 
š Š)| 6Š)Š)Š)Š)Õ)Ō)Š)Š)Š)Š)| 6Š)Ń)Ō)Õ)Ō)|Ń)Ō)Š)Õ)Ō)Ń)Ō)Š)Š)Õ)Ō) 6Ń)Ō)Š)Õ)Ō) 6Ń)Ō)Š)Š)Š)Š)Ń)Š)Š)Š)Š)Š)Ń)Š)Õ)Õ)Ō)Š)Ń)Ō)Ń)Ō)Š)Š)Š)Š)Š)ŲŠ${fŠ$Š$Š$Š$Õ$Ō$Š$Š$Š$Š${fŠ$Ń$Ō$Õ$Ō${Ń$Ō$Š$Õ$Ō$Ń$Ō$Š$Š$Õ$Ō$fŃ$Ō$Š$Õ$Ō$fŃ$Ō$Š$Š$Š$Š$Ń$Š$Š$Š$Š$Š$Ń$Š$Õ$Õ$Ō$Š$Ń$Ō$Ń$Ō$Š$Š$Š$Š$Š$Š$Š$r   Nrh   )
r&   r'   r(   r)   rā   rń   r   r  r  r
  r*   r   r   rą   rą   ^  s        Ų-Š-š	+š 	+š 	+š 	+š;š ;š ;š ;šJš Jš Jš Jš +š +š +š +š2š 2š 2š 2š%š %š %š %š %š %r   rą   )r   r   r	   r   r
   r   )r)   Ś
__future__r   ŚbuiltinsrA   Ś_pytest.assertion.rewriteŚ	assertionŚrewriter>   r   ŚpytestŚ
src.modelsr   r   r   r   r,   rj   r   r   rŖ   rÄ   rŌ   rą   r*   r   r   ś<module>r     s  šŲ .Š .ą "Š "Š "Š "Š "Š "ą              Š Š Š Š Š Š ą ą 4Š 4Š 4Š 4Š 4Š 4Š 4Š 4šš š š šš š š š ń ō š š*"(š "(š "(š "(š "(ń "(ō "(š "(šT+š +š +š +š +ń +ō +š +š<*>š *>š *>š *>š *>ń *>ō *>š *>šd+š +š +š +š +ń +ō +š +šF6&š 6&š 6&š 6&š 6&ń 6&ō 6&š 6&š|++š ++š ++š ++š ++ń ++ō ++š ++šf+š +š +š +š +ń +ō +š +šDT%š T%š T%š T%š T%ń T%ō T%š T%š T%š T%r   